mirror of
https://gitlab.com/CIEFWorldwideSdnBhd/exchange-2.0.git
synced 2026-08-29 09:24:07 +00:00
Merge branch 'master' into dillon/39-crm-changes
This commit is contained in:
@@ -58,6 +58,13 @@ BILLPLZ_X_SIGNATURE_KEY="S-HdAU6QDubUrMErxJ-PCpgw"
|
||||
BILLPLZ_COLLECTION_ID="t0cggbdd"
|
||||
BILLPLZ_WALLET_COLLECTION_ID="t0cggbdd"
|
||||
|
||||
|
||||
PERFEXCRM_BASE_URL=""
|
||||
PERFEXCRM_API_KEY=""
|
||||
PERFEXCRM_IS_ENABLED="false"
|
||||
|
||||
|
||||
VOUCHERIFY_APPLICATION_ID=""
|
||||
VOUCHERIFY_CLIENT_SECRET_KEY=""
|
||||
VOUCHERIFY_VERSION="v2018-08-01"
|
||||
VOUCHERIFY_URL="https://as1.api.voucherify.io"
|
||||
|
||||
Vendored
+16
@@ -0,0 +1,16 @@
|
||||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [{
|
||||
"name": "Listen for XDebug on Docker",
|
||||
"type": "php",
|
||||
"request": "launch",
|
||||
"port": 9002,
|
||||
"pathMappings": {
|
||||
"/var/www/html": "${workspaceFolder}",
|
||||
},
|
||||
"log": true
|
||||
}]
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class Code implements Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return Builder|mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $builder->where('code', '=', $value);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class DateIn implements Filter
|
||||
{
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return Builder|mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $builder->whereIn('date', $value);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class HasAccountStatementId implements Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $builder->whereHas('statementTransaction', function ($query) use ($value) {
|
||||
$query->where('account_statement_id', $value);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
use App\Classes\ValueObjects\Constants\RoleTypes;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class HasActiveReward implements Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
if(in_array(Auth::user()->type, RoleTypes::ADMIN_ROLES)){
|
||||
// $userId = $value !== 1 ? $value : Auth::user()->id;
|
||||
$userId = $value;
|
||||
return $builder->where('user_id', $userId)
|
||||
->where(function ($query) {
|
||||
$query->whereHas('reward', function ($subquery) {
|
||||
$subquery->where('is_active', true);
|
||||
})
|
||||
->orWhereDoesntHave('reward');
|
||||
})
|
||||
->whereDoesntHave('voucher.redemptions.transaction.booking.company.employees', function ($query) use ($userId) {
|
||||
$query->where('user_id', $userId);
|
||||
});
|
||||
}
|
||||
else{
|
||||
return $builder->where('user_id', Auth::user()->id)
|
||||
->where(function ($query) {
|
||||
$query->whereHas('reward', function ($subquery) {
|
||||
$subquery->where('is_active', true);
|
||||
})
|
||||
->orWhereDoesntHave('reward');
|
||||
})
|
||||
->whereDoesntHave('voucher.redemptions.transaction.owner');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class HasUsedVoucher implements Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $builder->where('user_id', Auth::user()->id)
|
||||
->where(function ($query) {
|
||||
$query->whereHas('voucher', function ($subquery) {
|
||||
$subquery->whereHas('redemptions', function ($subsubquery) {
|
||||
$subsubquery->whereHas('transaction', function ($subsubsubquery) {
|
||||
$subsubsubquery->whereHas('owner');
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class HasUsedVoucherForAdmin implements Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
$userId = $value !== 1 ? $value : Auth::user()->id;
|
||||
|
||||
return $builder->where('user_id', $userId)
|
||||
->where(function ($query) use ($userId){
|
||||
$query->whereHas('voucher', function ($subquery) use ($userId){
|
||||
$subquery->whereHas('redemptions', function ($subsubquery) use ($userId){
|
||||
$subsubquery->whereHas('transaction', function ($subsubsubquery) use ($userId){
|
||||
$subsubsubquery->whereHas('booking', function ($s4query) use ($userId){
|
||||
$s4query->whereHas('company', function ($s5query) use ($userId) {
|
||||
$s5query->whereHas('employees', function ($s6query) use ($userId){
|
||||
$s6query->where('user_id', $userId);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class IsActive implements Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return Builder|mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $builder->where('is_active', $value);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class IsMapped implements Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return Builder|mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $value ? $builder->whereHas('owners') : $builder->whereDoesntHave('owners');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
use App\Classes\ValueObjects\Constants\ApprovalStatus;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class IsMappedWithMultiple implements Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return Builder|mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
$query = $builder->withCount(['owners' => function ($query){
|
||||
$query->where('status', ApprovalStatus::PENDING_VERIFICATION);
|
||||
}]);
|
||||
return $value ? $query->having('owners_count', '>', 1) : $query->having('owners_count', '=', 1);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class MaxAmount implements Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return Builder|mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $builder->where('amount', '<=', $value);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class MinAmount implements Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return Builder|mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $builder->where('amount', '>=', $value);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class OwnerId implements Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return Builder|mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $builder->where('owner_id', $value);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class PayFor implements Filter
|
||||
{
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return Builder|mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $builder->where('pay_for', $value);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class PayForIn implements Filter
|
||||
{
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return Builder|mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $builder->whereIn('pay_for', $value);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class RandomName implements Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return Builder|mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $builder->where('is_active', $value);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class StatementTransactionAccountId implements Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $builder->whereHas('account', function ($query) use ($value) {
|
||||
$query->where('statement_accounts.id', $value);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class StatementTransactionOwnerStatusIn implements Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return Builder|mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $builder->whereHas('owners', function ($query) use ($value) {
|
||||
return $query->whereIn('statement_transaction_owners.status', $value);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class StatementTransactionOwnerTypeIn implements Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return Builder|mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $builder->whereHas('owners', function ($query) use ($value) {
|
||||
return $query->whereIn('type', $value);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class TransactionId implements Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return Builder|mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $builder->where('transaction_id', $value);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class UserId implements Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return Builder|mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $builder->where('user_id', $value);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -29,8 +29,8 @@ class Helper
|
||||
* @param $log
|
||||
* @return array
|
||||
*/
|
||||
static function debugLoggerForPerfexCRM($log){
|
||||
if($log){
|
||||
static function debugLogger($log){
|
||||
if($log && isset($log['message'])){
|
||||
$message = $log['message'];
|
||||
$substring = 'No data were found';
|
||||
if (isset($message)) {
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Interfaces;
|
||||
|
||||
|
||||
use Illuminate\Database\Eloquent\Relations\MorphMany;
|
||||
|
||||
interface Voucherifiable
|
||||
{
|
||||
public function voucherifyEntities(): morphMany;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
use Voucherify\VoucherifyClient;
|
||||
use Voucherify\ClientException;
|
||||
|
||||
function createVoucherifyClient()
|
||||
{
|
||||
$apiID = config('voucherify.application_id');
|
||||
$apiKey = config('voucherify.client_secret_key');
|
||||
$apiVersion = config('voucherify.version');
|
||||
$apiUrl = config('voucherify.url');
|
||||
|
||||
return new VoucherifyClient($apiID, $apiKey, $apiVersion, $apiUrl);
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Jobs;
|
||||
|
||||
use App\Classes\Modules\Accounting\Processors\CreateBankStatementTransactionOwnersProcessor;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class CreateBankStatementTransactionOwners implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
public function handle()
|
||||
{
|
||||
(App()->make(CreateBankStatementTransactionOwnersProcessor::class))->execute();
|
||||
}
|
||||
|
||||
public function delay($delay)
|
||||
{
|
||||
// Add delay in seconds to the job
|
||||
$this->delay = $delay;
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Jobs;
|
||||
|
||||
use App\Classes\Notifications\PaymentProofUploadedEmail;
|
||||
use App\Models\Booking;
|
||||
use App\Models\User;
|
||||
use App\Models\File;
|
||||
use App\Models\UserEmailVerification;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class SendUserPaymentProofUploadedEmail implements ShouldQueue
|
||||
{
|
||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||
|
||||
|
||||
/** @var User */
|
||||
private $user;
|
||||
|
||||
/** @var Booking */
|
||||
private $booking;
|
||||
|
||||
/** @var File */
|
||||
private $file;
|
||||
|
||||
/**
|
||||
* SendUserVerificationEmail constructor.
|
||||
* @param User $user
|
||||
* @param UserEmailVerification $attempt
|
||||
*/
|
||||
public function __construct(User $user, Booking $booking, File $file)
|
||||
{
|
||||
$this->user = $user;
|
||||
$this->booking = $booking;
|
||||
$this->file = $file;
|
||||
}
|
||||
|
||||
|
||||
public function handle()
|
||||
{
|
||||
$this->user->notify(new PaymentProofUploadedEmail($this->user, $this->booking, $this->file));
|
||||
}
|
||||
}
|
||||
@@ -66,7 +66,7 @@ class UpdatePerfexCRMInvoice implements ShouldQueue
|
||||
} else {
|
||||
// Log::error(json_encode('UpdatePerfexCRMInvoice CreatePerfexCRMInvoiceProcessor failed'));
|
||||
$log['message'] = 'UpdatePerfexCRMInvoice CreatePerfexCRMInvoiceProcessor failed';
|
||||
Helper::debugLoggerForPerfexCRM($log);
|
||||
Helper::debugLogger($log);
|
||||
}
|
||||
}
|
||||
else{
|
||||
|
||||
+283
@@ -0,0 +1,283 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounting\ControllersLogic;
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
use App\Classes\Modules\Accounting\Services\FetchesBankStatementTransaction;
|
||||
use App\Http\Resources\BankStatementTransactionResource;
|
||||
use App\Classes\Modules\Accounting\Services\UpdatesBankStatementTransactionOwnerStatus;
|
||||
use App\Classes\ValueObjects\Constants\ApprovalStatus;
|
||||
use App\Classes\ValueObjects\Constants\StatementTransactionOwnerType;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus;
|
||||
use App\Classes\Modules\Accounting\Services\FetchesBankStatementDetails;
|
||||
use App\Classes\Modules\Accounting\Services\ListsBankStatementDetails;
|
||||
use App\Models\StatementTransactionOwner;
|
||||
use Illuminate\Support\Collection;
|
||||
|
||||
class ApproveDuplicateBankStatementDetailsStatusLogic extends AbstractControllerLogic
|
||||
{
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function notification(): array
|
||||
{
|
||||
return [
|
||||
'title' => 'Update Duplicate Bank Statement Details Status',
|
||||
'message' => 'You have successfully updated the Statement Transation Status'
|
||||
];
|
||||
}
|
||||
|
||||
/** @var UpdatesBankStatementTransactionOwnerStatus */
|
||||
private $updatesBankStatementTransactionOwnerStatus;
|
||||
|
||||
/**
|
||||
* @param UpdatesBankStatementTransactionOwnerStatus $updatesBankStatementTransactionOwnerStatus
|
||||
*/
|
||||
public function __construct(UpdatesBankStatementTransactionOwnerStatus $updatesBankStatementTransactionOwnerStatus)
|
||||
{
|
||||
$this->updatesBankStatementTransactionOwnerStatus = $updatesBankStatementTransactionOwnerStatus;
|
||||
}
|
||||
|
||||
// /**
|
||||
// * Perform logic for approving or rejecting a statement transaction owner and handle matching records.
|
||||
// *
|
||||
// * @param Request $request The request object containing route parameters and data.
|
||||
// * @return JsonResponse The JSON response indicating the result of the logic.
|
||||
// */
|
||||
// public function logic(Request $request): JsonResponse
|
||||
// {
|
||||
// // Determine the status based on the 'status' route parameter
|
||||
// $status = $request->route('status') == 'approve' ? ApprovalStatus::APPROVED : ApprovalStatus::REJECTED;
|
||||
//
|
||||
// // Find the statement transaction owner based on the 'id' route parameter
|
||||
// $owner = StatementTransactionOwner::find($request->route('id'));
|
||||
//
|
||||
// // Execute an update action to change the status of the owner
|
||||
// $this->updatesBankStatementTransactionOwnerStatus->execute($owner, $status);
|
||||
//
|
||||
// // If the status is 'approved', reject all other owners with the same system, owner type, and owner ID
|
||||
// if ($status === ApprovalStatus::APPROVED) {
|
||||
// StatementTransactionOwner::where('system', $owner->system)
|
||||
// ->where('owner_type', $owner->owner_type)
|
||||
// ->where('owner_id', $owner->owner_id)
|
||||
// ->where('id', '!=', $owner->id)
|
||||
// ->update(['status' => ApprovalStatus::REJECTED]);
|
||||
// }
|
||||
//
|
||||
// // Find all siblings (owners with the same statement transaction ID)
|
||||
// $siblings = StatementTransactionOwner::where('statement_transaction_id', $owner->statement_transaction_id)
|
||||
// ->where('id', '!=', $owner->id)
|
||||
// ->get();
|
||||
//
|
||||
// // Process each sibling
|
||||
// foreach ($siblings as $sibling) {
|
||||
//
|
||||
// // If the status is 'approved', reject the sibling and save the changes
|
||||
// if ($status === ApprovalStatus::APPROVED) {
|
||||
// $sibling->status = ApprovalStatus::REJECTED;
|
||||
// $sibling->save();
|
||||
// }
|
||||
//
|
||||
// // Find all twins (owners with the same system, owner type, and owner ID)
|
||||
// $twins = StatementTransactionOwner::where('system', $sibling->system)
|
||||
// ->where('owner_type', $sibling->owner_type)
|
||||
// ->where('owner_id', $sibling->owner_id)
|
||||
// ->where('id', '!=', $sibling->id)
|
||||
// ->get();
|
||||
//
|
||||
// // Process each twin
|
||||
// foreach ($twins as $twin) {
|
||||
// // Find all owners with the same statement transaction ID as the twin
|
||||
// $owners = StatementTransactionOwner::where('statement_transaction_id', $twin->statement_transaction_id)
|
||||
// ->where('id', '!=', $twin->id)
|
||||
// ->get();
|
||||
//
|
||||
// // If there is only one owner (the twin itself), execute an update action to change its status to 'approved'
|
||||
// if (count($owners) === 1) {
|
||||
// $this->updatesBankStatementTransactionOwnerStatus->execute($twin, ApprovalStatus::APPROVED);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// // Find all remaining matching owners for the related transaction
|
||||
// $remainingMatches = StatementTransactionOwner::where('system', $owner->system)
|
||||
// ->where('owner_type', $owner->owner_type)
|
||||
// ->where('owner_id', $owner->owner_id)
|
||||
// ->where('status', ApprovalStatus::PENDING_VERIFICATION) // Consider only pending owners
|
||||
// ->get();
|
||||
//
|
||||
// // Process each remaining match
|
||||
// foreach ($remainingMatches as $match) {
|
||||
// // Find all owners with the same statement transaction ID as the match
|
||||
// $owners = StatementTransactionOwner::where('statement_transaction_id', $match->statement_transaction_id)
|
||||
// ->where('id', '!=', $match->id)
|
||||
// ->get();
|
||||
//
|
||||
// // If there is only one owner (the match itself), execute an update action to change its status to 'approved'
|
||||
// if (count($owners) === 1) {
|
||||
// $this->updatesBankStatementTransactionOwnerStatus->execute($match, ApprovalStatus::APPROVED);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// // Return an empty response
|
||||
// return $this->response([]);
|
||||
// }
|
||||
|
||||
/**
|
||||
* Perform logic for approving or rejecting a statement transaction owner and handle matching records.
|
||||
*
|
||||
* @param Request $request The request object containing route parameters and data.
|
||||
* @return JsonResponse The JSON response indicating the result of the logic.
|
||||
*/
|
||||
public function logic(Request $request): JsonResponse
|
||||
{
|
||||
// Determine the approval status
|
||||
$status = $this->getApprovalStatus($request);
|
||||
|
||||
// Find the statement transaction owner
|
||||
$owner = $this->getOwner($request);
|
||||
|
||||
// Update owner status
|
||||
$this->updateOwnerStatus($owner, $status);
|
||||
|
||||
// If the status is 'approved', handle the approval process
|
||||
if ($status === ApprovalStatus::APPROVED) {
|
||||
$this->handleApprovedStatus($owner);
|
||||
}
|
||||
|
||||
// Check and approve remaining matches if any
|
||||
$this->checkAndApproveRemainingMatches($owner);
|
||||
|
||||
// Return an empty response
|
||||
return $this->response([]);
|
||||
}
|
||||
|
||||
private function getApprovalStatus(Request $request): int
|
||||
{
|
||||
return $request->route('status') == 'approve' ? ApprovalStatus::APPROVED : ApprovalStatus::REJECTED;
|
||||
}
|
||||
|
||||
private function getOwner(Request $request): StatementTransactionOwner
|
||||
{
|
||||
return StatementTransactionOwner::find($request->route('id'));
|
||||
}
|
||||
|
||||
private function updateOwnerStatus(StatementTransactionOwner $owner, int $status): void
|
||||
{
|
||||
$this->updatesBankStatementTransactionOwnerStatus->execute($owner, $status);
|
||||
}
|
||||
|
||||
private function handleApprovedStatus(StatementTransactionOwner $owner): void
|
||||
{
|
||||
// Reject all other owners with the same system, owner type, and owner ID
|
||||
$this->rejectOtherOwners($owner);
|
||||
|
||||
// Find all siblings and process them
|
||||
$siblings = $this->getSiblings($owner);
|
||||
$this->processSiblings($siblings);
|
||||
}
|
||||
|
||||
private function rejectOtherOwners(StatementTransactionOwner $owner): void
|
||||
{
|
||||
StatementTransactionOwner::where('system', $owner->system)
|
||||
->where('owner_type', $owner->owner_type)
|
||||
->where('owner_id', $owner->owner_id)
|
||||
->where('id', '!=', $owner->id)
|
||||
->update(['status' => ApprovalStatus::REJECTED]);
|
||||
}
|
||||
|
||||
private function getSiblings(StatementTransactionOwner $owner): Collection
|
||||
{
|
||||
return StatementTransactionOwner::where('statement_transaction_id', $owner->statement_transaction_id)
|
||||
->where('id', '!=', $owner->id)
|
||||
->get();
|
||||
}
|
||||
|
||||
private function processSiblings(Collection $siblings): void
|
||||
{
|
||||
foreach ($siblings as $sibling) {
|
||||
$this->processSibling($sibling);
|
||||
}
|
||||
}
|
||||
|
||||
private function processSibling(StatementTransactionOwner $sibling): void
|
||||
{
|
||||
// Reject the sibling and save the changes
|
||||
$sibling->status = ApprovalStatus::REJECTED;
|
||||
$sibling->save();
|
||||
|
||||
// Find all twins and process them
|
||||
$twins = $this->getTwins($sibling);
|
||||
$this->processTwins($twins);
|
||||
}
|
||||
|
||||
private function getTwins(StatementTransactionOwner $sibling): Collection
|
||||
{
|
||||
return StatementTransactionOwner::where('system', $sibling->system)
|
||||
->where('owner_type', $sibling->owner_type)
|
||||
->where('owner_id', $sibling->owner_id)
|
||||
->where('id', '!=', $sibling->id)
|
||||
->get();
|
||||
}
|
||||
|
||||
private function processTwins(Collection $twins): void
|
||||
{
|
||||
foreach ($twins as $twin) {
|
||||
$this->processTwin($twin);
|
||||
}
|
||||
}
|
||||
|
||||
private function processTwin(StatementTransactionOwner $twin): void
|
||||
{
|
||||
// Find all owners with the same statement transaction ID as the twin
|
||||
$owners = $this->getOwners($twin);
|
||||
|
||||
// If there is only one owner (the twin itself), approve it
|
||||
if ($owners->count() === 1) {
|
||||
$this->updateOwnerStatus($twin, ApprovalStatus::APPROVED);
|
||||
}
|
||||
}
|
||||
|
||||
private function getOwners(StatementTransactionOwner $transactionOwner): Collection
|
||||
{
|
||||
return StatementTransactionOwner::where('statement_transaction_id', $transactionOwner->statement_transaction_id)
|
||||
->where('id', '!=', $transactionOwner->id)
|
||||
->get();
|
||||
}
|
||||
|
||||
private function checkAndApproveRemainingMatches(StatementTransactionOwner $owner): void
|
||||
{
|
||||
// Find all remaining matching owners for the related transaction
|
||||
$remainingMatches = $this->getRemainingMatches($owner);
|
||||
|
||||
// Process each remaining match
|
||||
foreach ($remainingMatches as $match) {
|
||||
$this->processRemainingMatch($match);
|
||||
}
|
||||
}
|
||||
|
||||
private function getRemainingMatches(StatementTransactionOwner $owner): Collection
|
||||
{
|
||||
return StatementTransactionOwner::where('system', $owner->system)
|
||||
->where('owner_type', $owner->owner_type)
|
||||
->where('owner_id', $owner->owner_id)
|
||||
->where('status', ApprovalStatus::PENDING_VERIFICATION)
|
||||
->get();
|
||||
}
|
||||
|
||||
private function processRemainingMatch(StatementTransactionOwner $match): void
|
||||
{
|
||||
// Find all owners with the same statement transaction ID as the match
|
||||
$owners = $this->getOwners($match);
|
||||
|
||||
// If there is only one owner (the match itself), approve it
|
||||
if ($owners->count() === 1) {
|
||||
$this->updateOwnerStatus($match, ApprovalStatus::APPROVED);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounting\ControllersLogic;
|
||||
|
||||
use App\Classes\Exceptions\MalformedRequestException;
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
use App\Classes\Modules\Accounting\Services\ListsBankStatementTransactions;
|
||||
use App\Http\Resources\BankStatementTransactionResource;
|
||||
use App\Classes\Modules\Accounting\Services\UpdatesBankStatementTransactionOwnerStatus;
|
||||
use App\Classes\ValueObjects\Constants\ApprovalStatus;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus;
|
||||
use App\Classes\ValueObjects\Constants\StatementTransactionOwnerType;
|
||||
|
||||
class GroupApproveStatementTransactionLogic extends AbstractControllerLogic
|
||||
{
|
||||
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function notification(): array
|
||||
{
|
||||
return [
|
||||
'title' => 'Group Approve Statement Transaction',
|
||||
'message' => 'You have successfully approveed a group of Statement Transation'
|
||||
];
|
||||
}
|
||||
|
||||
/** @var ListsBankStatementTransactions */
|
||||
private $listsBankStatementTransactions;
|
||||
|
||||
/** @var UpdatesBankStatementTransactionOwnerStatus */
|
||||
private $updatesBankStatementTransactionOwnerStatus;
|
||||
|
||||
/** @var UpdatesTransactionStatus */
|
||||
private $updatesTransactionStatus;
|
||||
|
||||
/**
|
||||
* @param ListsBankStatementTransactions $listsBankStatementTransactions
|
||||
* @param UpdatesBankStatementTransactionOwnerStatus $updatesBankStatementTransactionOwnerStatus
|
||||
* @param UpdatesTransactionStatus $updatesTransactionStatus
|
||||
*/
|
||||
public function __construct(ListsBankStatementTransactions $listsBankStatementTransactions, UpdatesBankStatementTransactionOwnerStatus $updatesBankStatementTransactionOwnerStatus, UpdatesTransactionStatus $updatesTransactionStatus)
|
||||
{
|
||||
$this->listsBankStatementTransactions = $listsBankStatementTransactions;
|
||||
$this->updatesBankStatementTransactionOwnerStatus = $updatesBankStatementTransactionOwnerStatus;
|
||||
$this->updatesTransactionStatus = $updatesTransactionStatus;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
* @throws MalformedRequestException
|
||||
*/
|
||||
public function logic(Request $request): JsonResponse
|
||||
{
|
||||
|
||||
$filters = [
|
||||
"min_amount" => 0,
|
||||
"is_mapped" => true,
|
||||
"is_mapped_with_multiple" => false,
|
||||
"statement_transaction_owner_type_in" => [1, 2],
|
||||
"statement_transaction_owner_status_in" => [1]
|
||||
];
|
||||
$statementTransactions = $this->listsBankStatementTransactions->execute($filters);
|
||||
|
||||
foreach ($statementTransactions as $statementTransaction) {
|
||||
$owners = $statementTransaction->owners;
|
||||
|
||||
if (count($owners)) {
|
||||
$this->updatesBankStatementTransactionOwnerStatus->execute($owners->first(), ApprovalStatus::APPROVED);
|
||||
|
||||
// automatically approve payment if pending verification
|
||||
|
||||
// if ($statementTrasactionOwner->owner->type !== StatementTransactionOwnerType::SALES) continue;
|
||||
// if ($statementTrasactionOwner->owner->status === ApprovalStatus::PENDING_VERIFICATION ) {
|
||||
// $this->updatesTransactionStatus->execute($statementTrasactionOwner->owner, ApprovalStatus::APPROVED);
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
return $this->response([]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounting\ControllersLogic;
|
||||
|
||||
|
||||
use App\Classes\Exceptions\MalformedRequestException;
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
use App\Classes\Jobs\CreateBankStatementTransactionOwners;
|
||||
use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject;
|
||||
use App\Classes\ValueObjects\Constants\ApprovalStatus;
|
||||
use App\Models\AccountStatement;
|
||||
use App\Models\StatementAccount;
|
||||
use App\Models\StatementTransaction;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Carbon;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
|
||||
class ImportBankStatementLogic extends AbstractControllerLogic
|
||||
{
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function notification():array {
|
||||
return [
|
||||
'title' => 'Import Bank Statement Transactions Details',
|
||||
'message' => 'You have successfully updated the Bank Statement Transactions Details'
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
* @throws MalformedRequestException
|
||||
*/
|
||||
public function logic(Request $request) : JsonResponse
|
||||
{
|
||||
|
||||
$files = $request->file('files');
|
||||
|
||||
$object = new DocumentObject('', $request->input('files'), '', ApprovalStatus::APPROVED, 'imports');
|
||||
foreach ($object->getFiles() as $file){
|
||||
$collection = Excel::toCollection(null, json_decode($file)->file_info->original->file, null, null, true);
|
||||
|
||||
$sheet = $collection->first()->skip(1);
|
||||
|
||||
$statementDetails = $sheet->first();
|
||||
|
||||
$accountNumber = $statementDetails[0];
|
||||
$accountType = $statementDetails[1];
|
||||
$accountName = $statementDetails[2];
|
||||
$accountCurrency = $statementDetails[3];
|
||||
$dateFrom = carbon::parse(str_replace(' MY (UTC+08:00)', '', $statementDetails[4]));
|
||||
$dateTo = carbon::parse(str_replace(' MY (UTC+08:00)', '', $statementDetails[5]));
|
||||
$totalDebit = $statementDetails[6];
|
||||
$totalCredit = $statementDetails[7];
|
||||
$beginBalance = $statementDetails[8];
|
||||
$endBalance = $statementDetails[9];
|
||||
$account = StatementAccount::updateOrCreate(
|
||||
['number' => $accountNumber],
|
||||
[
|
||||
'type' => $accountType,
|
||||
'name' => $accountName,
|
||||
'currency' => $accountCurrency,
|
||||
]
|
||||
);
|
||||
|
||||
$statement = AccountStatement::where('date_from', $dateFrom)
|
||||
->where('date_to', $dateTo)
|
||||
->where('total_amount', $totalDebit ?: $totalCredit,)
|
||||
->where('begin_balance', $beginBalance)
|
||||
->where('end_balance', $endBalance)->first();
|
||||
|
||||
|
||||
if(!$statement){
|
||||
$statement = new AccountStatement([
|
||||
'date_from' => $dateFrom,
|
||||
'date_to' => $dateTo,
|
||||
'total_amount' => $totalDebit ?: $totalCredit,
|
||||
'begin_balance' => $beginBalance,
|
||||
'end_balance' => $endBalance,
|
||||
]);
|
||||
}
|
||||
|
||||
$account->statements()->save($statement);
|
||||
|
||||
// CreateBankStatementTransactionOwners::dispatch($statement);
|
||||
|
||||
|
||||
$sheet->map(function ($row) use ($statement, $account) {
|
||||
$transactionRef = $row[15];
|
||||
$amount = $row[17] !== '-' ? ((float) str_replace(',', '', $row[17])) : (-((float) str_replace(',', '', $row[16])));
|
||||
$transactionDate = $row[10] !== '-' ? carbon::parse(str_replace(' MY (UTC+08:00)', '', $row[10]) . $row[11]) : null;
|
||||
$postingDate = carbon::createFromFormat('d/M/Y H:i', str_replace(' MY (UTC+08:00)', '', $row[12]) . str_replace(' MY (UTC+08:00)', '', $row[13]));
|
||||
$transactionDescription = is_numeric($row[14]) ? (int) sprintf('%.2f', $row[14]) : $row[14];
|
||||
$tellerId = $row[19];
|
||||
$branchChannel = $row[20];
|
||||
$transactionCode = $row[21];
|
||||
$endBalance = $row[22];
|
||||
$description2 = $row[25];
|
||||
$description3 = $row[26];
|
||||
$description4 = $row[27];
|
||||
$description5 = $row[28];
|
||||
$transaction = new StatementTransaction([
|
||||
'transaction_ref' => $transactionRef,
|
||||
'amount' => $amount,
|
||||
'transaction_date' => $transactionDate,
|
||||
'posting_date' => $postingDate,
|
||||
'transaction_description' => $transactionDescription,
|
||||
'teller_id' => $tellerId,
|
||||
'branch_channel' => $branchChannel,
|
||||
'transaction_code' => $transactionCode,
|
||||
'end_balance' => $endBalance,
|
||||
'transaction_description_2' => $description2,
|
||||
'transaction_description_3' => $description3,
|
||||
'transaction_description_4' => $description4,
|
||||
'transaction_description_5' => $description5,
|
||||
]);
|
||||
|
||||
// Check if the transaction already exists for this statement
|
||||
$existingTransaction = StatementTransaction::where('transaction_ref', $transactionRef)
|
||||
->where('posting_date', $postingDate)
|
||||
->where('amount', $amount)
|
||||
->where('transaction_description', $transactionDescription)
|
||||
->where('teller_id', $tellerId)
|
||||
->where('branch_channel', $branchChannel)
|
||||
->where('transaction_code', $transactionCode)
|
||||
->where('end_balance', $endBalance)
|
||||
->first();
|
||||
|
||||
if (!$existingTransaction) {
|
||||
$statement->transactions()->save($transaction);
|
||||
}
|
||||
|
||||
return $transaction;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
return $this->response([]);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounting\ControllersLogic;
|
||||
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
use App\Classes\Modules\Accounting\Services\ListsBankStatementDetails;
|
||||
use App\Http\Resources\BankStatementDetailResource;
|
||||
use ErrorException;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ListBankStatementDetailsLogic extends AbstractControllerLogic
|
||||
{
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function notification():array {
|
||||
return [
|
||||
'title' => 'Retrieved Bank Statement Details',
|
||||
'message' => 'You have successfully retrieved a Bank Statement Details'
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
/** @var ListsBankStatementDetails */
|
||||
private $listsBankStatementDetails;
|
||||
|
||||
/**
|
||||
* ListBankStatementDetailsLogic constructor.
|
||||
* @param ListsBankStatementDetails $listsBankStatementDetails
|
||||
*/
|
||||
public function __construct(ListsBankStatementDetails $listsBankStatementDetails)
|
||||
{
|
||||
$this->listsBankStatementDetails = $listsBankStatementDetails;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
* @throws ErrorException
|
||||
*/
|
||||
public function logic(Request $request) : JsonResponse
|
||||
{
|
||||
$query = $this->listsBankStatementDetails->execute($this->listsBankStatementDetails->deserializeFilters($request->input('filters')));
|
||||
|
||||
return $this->collectionResponse(BankStatementDetailResource::collection($query));
|
||||
}
|
||||
|
||||
}
|
||||
+53
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounting\ControllersLogic;
|
||||
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
use App\Classes\Modules\Accounting\Services\ListsBankStatementDetails;
|
||||
use App\Classes\Modules\Accounting\Services\ListsBankStatementTransactions;
|
||||
use App\Http\Resources\BankStatementTransactionResource;
|
||||
use App\Models\StatementTransaction;
|
||||
use ErrorException;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ListBankStatementTransactionsLogic extends AbstractControllerLogic
|
||||
{
|
||||
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function notification():array {
|
||||
return [
|
||||
'title' => 'Retrieved Bank Statement Transactions',
|
||||
'message' => 'You have successfully retrieved a Bank Statement Transactions'
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
/** @var ListsBankStatementTransactions */
|
||||
private $listsBankStatementTransactions;
|
||||
|
||||
/**
|
||||
* @param ListsBankStatementTransactions $listsBankStatementTransactions
|
||||
*/
|
||||
public function __construct(ListsBankStatementTransactions $listsBankStatementTransactions)
|
||||
{
|
||||
$this->listsBankStatementTransactions = $listsBankStatementTransactions;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
* @throws ErrorException
|
||||
*/
|
||||
public function logic(Request $request) : JsonResponse
|
||||
{
|
||||
$query = $this->listsBankStatementTransactions->execute($this->listsBankStatementTransactions->deserializeFilters($request->input('filters')));
|
||||
|
||||
return $this->collectionResponse(BankStatementTransactionResource::collection($query));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,152 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounting\ControllersLogic;
|
||||
|
||||
|
||||
use App\Classes\Exceptions\MalformedRequestException;
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
use App\Classes\Modules\Accounting\Services\CreatesBankStatementTransactionOwner;
|
||||
use App\Classes\Modules\Accounting\Services\FetchesBankStatementTransaction;
|
||||
use App\Classes\Modules\Accounting\Processors\ListShippingPortalTransactions;
|
||||
use App\Classes\ValueObjects\Constants\StatementTransactionOwnerType;
|
||||
use App\Classes\ValueObjects\Constants\SystemType;
|
||||
use App\Classes\Modules\Accounting\Processors\ChecksBillNumber;
|
||||
use App\Classes\ValueObjects\Constants\ShippingTransactionType;
|
||||
use App\Classes\ValueObjects\Constants\TransactionType;
|
||||
use App\Models\Booking;
|
||||
use App\Models\Transaction;
|
||||
use App\Models\Wallet;
|
||||
use Exception;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class UpdateBankStatementDetailLogic extends AbstractControllerLogic
|
||||
{
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function notification():array {
|
||||
return [
|
||||
'title' => 'Updated Bank Statement Transactions Details',
|
||||
'message' => 'You have successfully updated the Bank Statement Transactions Details'
|
||||
];
|
||||
}
|
||||
|
||||
/** @var FetchesBankStatementTransaction */
|
||||
private $fetchesBankStatementTransaction;
|
||||
|
||||
|
||||
/** @var ChecksBillNumber */
|
||||
private $checksBillNumber;
|
||||
|
||||
/**
|
||||
* @param FetchesBankStatementTransaction $fetchesBankStatementTransaction
|
||||
* @param ChecksBillNumber $checksBillNumber
|
||||
*/
|
||||
public function __construct(FetchesBankStatementTransaction $fetchesBankStatementTransaction, ChecksBillNumber $checksBillNumber)
|
||||
{
|
||||
$this->fetchesBankStatementTransaction = $fetchesBankStatementTransaction;
|
||||
$this->checksBillNumber = $checksBillNumber;
|
||||
}
|
||||
|
||||
public function logic(Request $request): JsonResponse
|
||||
{
|
||||
$bankStatementTransaction = $this->fetchesBankStatementTransaction->execute(['id' => $request->route('id')]);
|
||||
|
||||
$transactionReference = $request->input('transaction_reference');
|
||||
$systemReference = $request->input('system_references');
|
||||
|
||||
$owner_type = $owner_id = $owner_reference = $statementTransactionOwnerType = $system = null;
|
||||
|
||||
$salesSystems = ['lite', 'cntr', 'probashi', 'pets'];
|
||||
$allowedSystems = array_merge($salesSystems, ['exchange', 'izyim']);
|
||||
|
||||
if (!in_array($systemReference, $allowedSystems) && !in_array($request->input('pay_for'), ['internal_bank_transfer', 'others'])) {
|
||||
throw new MalformedRequestException('System Reference not allowed');
|
||||
}
|
||||
|
||||
switch ($request->input('pay_for')) {
|
||||
case 'sales':
|
||||
$owner_reference = $transactionReference;
|
||||
$statementTransactionOwnerType = StatementTransactionOwnerType::SALES;
|
||||
break;
|
||||
|
||||
case 'top_up':
|
||||
$owner_reference = $transactionReference;
|
||||
$statementTransactionOwnerType = StatementTransactionOwnerType::WALLET_TOP_UP;
|
||||
break;
|
||||
|
||||
case 'internal_bank_transfer':
|
||||
$statementTransactionOwnerType = StatementTransactionOwnerType::INTERNAL_BANK_TRANSFER_IN;
|
||||
break;
|
||||
|
||||
case 'others':
|
||||
$owner_reference = $transactionReference;
|
||||
$statementTransactionOwnerType = StatementTransactionOwnerType::NON_OPERATIONAL;
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new MalformedRequestException('Transaction Type Not Allowed');
|
||||
}
|
||||
|
||||
if (in_array($systemReference, ['exchange', 'izyim'])) {
|
||||
$transaction = $this->checksBillNumber->execute($transactionReference, $systemReference);
|
||||
|
||||
if (is_array($transaction) && empty($transaction)) {
|
||||
throw new MalformedRequestException('Transaction Not Found.');
|
||||
}
|
||||
|
||||
if($systemReference === 'exchange') {
|
||||
$owner_type = Transaction::class;
|
||||
$owner_id = $transaction->id;
|
||||
if($transaction->type === TransactionType::TOP_UP) {
|
||||
$owner_reference = $transaction->owner->owner->reference;
|
||||
}
|
||||
|
||||
if($transaction->type === TransactionType::PAYMENT && $transaction->owner_type === Booking::class) {
|
||||
$owner_reference = $transaction->owner->marking;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if($systemReference === 'izyim') {
|
||||
$transaction = $transaction[0];
|
||||
$payFor = $request->input('pay_for');
|
||||
$transactionType = $transaction['type'];
|
||||
|
||||
if (($payFor === 'sales' && !in_array($transactionType, [ShippingTransactionType::PAYMENT, ShippingTransactionType::GROUP_PAYMENT]))
|
||||
|| ($payFor === 'top_up' && !in_array($transactionType, [ShippingTransactionType::TOP_UP, ShippingTransactionType::GROUP_PAYMENT]))) {
|
||||
throw new MalformedRequestException('Transaction Type does not match.');
|
||||
}
|
||||
|
||||
$owner_type = Transaction::class;
|
||||
$owner_id = $transaction['owner_id'];
|
||||
$owner_reference = $transaction['owner_reference'];
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
$system = $systemReference != null ? SystemType::SYSTEM_NAMES[$systemReference] : '';
|
||||
|
||||
$this->createBankStatementTransactionOwner($bankStatementTransaction, $statementTransactionOwnerType, $system, $owner_type, $owner_id, $owner_reference);
|
||||
|
||||
return $this->response([]);
|
||||
}
|
||||
|
||||
private function createBankStatementTransactionOwner($bankStatementTransaction, $statementTransactionOwnerType, $system, $owner_type, $owner_id, $owner_reference)
|
||||
{
|
||||
$ownerData = [
|
||||
'type' => $statementTransactionOwnerType,
|
||||
'system' => $system,
|
||||
'owner_type' => $owner_type,
|
||||
'owner_id' => $owner_id,
|
||||
'owner_reference' => $owner_reference,
|
||||
];
|
||||
|
||||
$bankStatementTransaction->owners()->firstOrCreate($ownerData);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+81
@@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounting\ControllersLogic;
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
use App\Classes\Modules\Accounting\Services\FetchesBankStatementTransaction;
|
||||
use App\Http\Resources\BankStatementTransactionResource;
|
||||
use App\Classes\Modules\Accounting\Services\UpdatesBankStatementTransactionOwnerStatus;
|
||||
use App\Classes\ValueObjects\Constants\ApprovalStatus;
|
||||
use App\Classes\ValueObjects\Constants\StatementTransactionOwnerType;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus;
|
||||
|
||||
|
||||
class UpdateStatementTransactionStatusLogic extends AbstractControllerLogic
|
||||
{
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function notification(): array
|
||||
{
|
||||
return [
|
||||
'title' => 'Update Statement Transaction Status',
|
||||
'message' => 'You have successfully updated the Statement Transation Status'
|
||||
];
|
||||
}
|
||||
|
||||
/** @var FetchesBankStatementTransaction */
|
||||
private $fetchesBankStatementTransaction;
|
||||
|
||||
/** @var UpdatesBankStatementTransactionOwnerStatus */
|
||||
private $updatesBankStatementTransactionOwnerStatus;
|
||||
|
||||
/** @var UpdatesTransactionStatus */
|
||||
private $updatesTransactionStatus;
|
||||
|
||||
/**
|
||||
* UpdateAnnouncementLogic constructor.
|
||||
* @param FetchesBankStatementTransaction $fetchesBankStatementTransaction
|
||||
* @param UpdatesBankStatementTransactionOwnerStatus $updatesBankStatementTransactionOwnerStatus
|
||||
* @param UpdatesTransactionStatus $updatesTransactionStatus
|
||||
*/
|
||||
public function __construct(
|
||||
FetchesBankStatementTransaction $fetchesBankStatementTransaction,
|
||||
UpdatesBankStatementTransactionOwnerStatus $updatesBankStatementTransactionOwnerStatus,
|
||||
UpdatesTransactionStatus $updatesTransactionStatus
|
||||
) {
|
||||
$this->fetchesBankStatementTransaction = $fetchesBankStatementTransaction;
|
||||
$this->updatesBankStatementTransactionOwnerStatus = $updatesBankStatementTransactionOwnerStatus;
|
||||
$this->updatesTransactionStatus = $updatesTransactionStatus;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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
|
||||
{
|
||||
$statementTrasaction = $this->fetchesBankStatementTransaction->execute(['id' => $request->route('id')]);
|
||||
|
||||
$statementTrasactionOwner = $statementTrasaction->owners->first();
|
||||
|
||||
$this->updatesBankStatementTransactionOwnerStatus->execute($statementTrasactionOwner, $request->route('status') == 'approve' ? ApprovalStatus::APPROVED : ApprovalStatus::REJECTED);
|
||||
|
||||
// todo-new: approve payments status, need to check the owner(if system is shipping, need to api with shipping portal)
|
||||
// if ($request->route('status') == 'approve') {
|
||||
// if ($statementTrasactionOwner->transaction->type === StatementTransactionOwnerType::SALES) {
|
||||
// if ($statementTrasactionOwner->owner->status === ApprovalStatus::PENDING_VERIFICATION) {
|
||||
// $this->updatesTransactionStatus->execute($statementTrasactionOwner->owner, ApprovalStatus::APPROVED);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
return $this->resourceResponse(new BankStatementTransactionResource($statementTrasaction));
|
||||
}
|
||||
}
|
||||
+137
@@ -0,0 +1,137 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounting\DataTransferObjects;
|
||||
|
||||
use App\Classes\General\Interfaces\DataTransferObject;
|
||||
use App\Classes\ValueObjects\Constants\ApprovalStatus;
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Logical\Boolean;
|
||||
|
||||
class BankStatementTransactionObject implements DataTransferObject
|
||||
{
|
||||
/** @var int */
|
||||
private $statement_transaction_id;
|
||||
|
||||
/** @var int */
|
||||
private $type;
|
||||
|
||||
/** @var string */
|
||||
private $system;
|
||||
|
||||
/** @var string */
|
||||
private $owner_type;
|
||||
|
||||
/** @var int */
|
||||
private $owner_id;
|
||||
|
||||
/** @var string */
|
||||
private $invoice_reference;
|
||||
|
||||
/** @var string */
|
||||
private $receipt_reference;
|
||||
|
||||
/** @var Boolean */
|
||||
private $is_auto_mapped;
|
||||
|
||||
/** @var int|null */
|
||||
private $status;
|
||||
|
||||
/**
|
||||
* BankStatementDetailObject constructor.
|
||||
* @param string $pay_for
|
||||
* @param string $system_references
|
||||
* @param int|null $type
|
||||
*/
|
||||
public function __construct(
|
||||
$statement_transaction_id,
|
||||
$type,
|
||||
$system,
|
||||
$owner_type,
|
||||
$owner_id,
|
||||
$invoice_reference,
|
||||
$receipt_reference,
|
||||
$is_auto_mapped,
|
||||
?int $status = ApprovalStatus::PENDING_VERIFICATION
|
||||
) {
|
||||
$this->statement_transaction_id = $statement_transaction_id;
|
||||
$this->type = $type;
|
||||
$this->system = $system;
|
||||
$this->owner_type = $owner_type;
|
||||
$this->owner_id = $owner_id;
|
||||
$this->invoice_reference = $invoice_reference;
|
||||
$this->receipt_reference = $receipt_reference;
|
||||
$this->is_auto_mapped = $is_auto_mapped;
|
||||
$this->status = $status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getStatementTransactionId(): int
|
||||
{
|
||||
return $this->statement_transaction_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getType(): int
|
||||
{
|
||||
return $this->type;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getOwnerType(): string
|
||||
{
|
||||
return $this->owner_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getOwnerId(): int
|
||||
{
|
||||
return $this->owner_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getSystem(): string
|
||||
{
|
||||
return $this->system;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getInvoiceReference(): string
|
||||
{
|
||||
return $this->invoice_reference;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getReceipteReference(): string
|
||||
{
|
||||
return $this->receipt_reference;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Boolean
|
||||
*/
|
||||
public function getIsAutoMapped(): Boolean
|
||||
{
|
||||
return $this->is_auto_mapped;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getStatus(): int
|
||||
{
|
||||
return $this->status;
|
||||
}
|
||||
}
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounting\DataTransferObjects;
|
||||
|
||||
use App\Classes\General\Interfaces\DataTransferObject;
|
||||
|
||||
class BankStatementTrasactionOwnerObject implements DataTransferObject
|
||||
{
|
||||
/** @var string */
|
||||
private $pay_for;
|
||||
|
||||
/** @var string */
|
||||
private $system_references;
|
||||
|
||||
// /** @var int|null */
|
||||
// private $type;
|
||||
|
||||
|
||||
/**
|
||||
* BankStatementDetailObject constructor.
|
||||
* @param string $pay_for
|
||||
* @param string $system_references
|
||||
* @param int|null $type
|
||||
*/
|
||||
public function __construct(string $pay_for, string $system_references)
|
||||
{
|
||||
$this->pay_for = $pay_for;
|
||||
$this->system_references = $system_references;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getPayFor(): string
|
||||
{
|
||||
return $this->pay_for;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getSystemReferences(): string
|
||||
{
|
||||
return $this->system_references;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounting\Processors;
|
||||
|
||||
use App\Classes\Exceptions\MalformedRequestException;
|
||||
use App\Models\Transaction;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class ChecksBillNumber
|
||||
{
|
||||
public function execute($bill_no, $system_reference)
|
||||
{
|
||||
if ($system_reference == 'izyim') {
|
||||
try {
|
||||
$url = 'https://izyim.cief-malaysia.com/public/api/v1/transactions/mappable/query';
|
||||
$client = new \GuzzleHttp\Client(['verify' => false]);
|
||||
$response = $client->request('GET', $url . '?api-key=510acd13d8d24375cf038ad626c282565451461a9c2399357e0b65365300787e&filters={"bill_no":"' . $bill_no . '"}');
|
||||
$body = $response->getBody();
|
||||
$data = json_decode($body, true);
|
||||
$payload = $data['payload'];
|
||||
return $payload['data'];
|
||||
} catch (\Exception $exception) {
|
||||
throw new MalformedRequestException($exception->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
if ($system_reference == 'exchange') {
|
||||
$transaction = Transaction::where('bill_no', $bill_no)->first();
|
||||
if ($transaction) {
|
||||
return $transaction;
|
||||
}
|
||||
}
|
||||
|
||||
// if not found
|
||||
throw new MalformedRequestException('Bill Number Not Found.');
|
||||
}
|
||||
}
|
||||
+255
@@ -0,0 +1,255 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounting\Processors;
|
||||
|
||||
use App\Classes\ValueObjects\Constants\ApprovalStatus;
|
||||
use App\Classes\ValueObjects\Constants\PaymentMethodType;
|
||||
use App\Classes\ValueObjects\Constants\StatementTransactionOwnerType;
|
||||
use App\Classes\ValueObjects\Constants\TransactionType;
|
||||
use App\Models\Booking;
|
||||
use App\Models\Company;
|
||||
use App\Models\Group;
|
||||
use App\Models\StatementTransaction;
|
||||
use App\Models\Transaction;
|
||||
use App\Models\Wallet;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class CreateBankStatementTransactionOwnersProcessor
|
||||
{
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function execute() {
|
||||
|
||||
$transactions = StatementTransaction::whereDoesntHave('owners', function($query){
|
||||
return $query->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]);
|
||||
})->orderBy('posting_date')->get();
|
||||
|
||||
// $transactions = StatementTransaction::whereDoesntHave('owners')->where('amount', '<', 0)->get();
|
||||
|
||||
foreach ($transactions as $transaction) {
|
||||
|
||||
if($transaction->amount > 0){
|
||||
|
||||
// Exchange Sales
|
||||
$creditTransactions = $this->getTransactions($transaction->posting_date, $transaction->amount, TransactionType::PAYMENT, Booking::class, PaymentMethodType::WALLET, [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]);
|
||||
foreach ($creditTransactions as $creditTransaction) {
|
||||
$transaction->owners()->firstOrCreate([
|
||||
'type' => StatementTransactionOwnerType::SALES,
|
||||
'system' => 'EXCHANGE',
|
||||
'owner_type' => Transaction::class,
|
||||
'owner_id'=> $creditTransaction->id,
|
||||
'owner_reference'=> $creditTransaction->owner->marking,
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
// Shipping Portal Sales
|
||||
$creditTransactions = $this->getTransactionsFromShippingPortal($transaction->amount, $this->getDateRange($transaction->posting_date), 2);
|
||||
foreach ($creditTransactions as $creditTransaction) {
|
||||
if($creditTransaction['owner_type'] === Wallet::class) continue;
|
||||
$transaction->owners()->firstOrCreate([
|
||||
'type' => StatementTransactionOwnerType::SALES,
|
||||
'system' => 'SHIPPING_PORTAL',
|
||||
'owner_type' => $creditTransaction['owner_type'],
|
||||
'owner_id'=> $creditTransaction['owner_id'],
|
||||
'owner_reference'=> $creditTransaction['owner_reference'],
|
||||
]);
|
||||
}
|
||||
|
||||
// Exchange Wallet Top Up
|
||||
$creditTransactions = $this->getTransactions($transaction->posting_date, $transaction->amount, TransactionType::TOP_UP, Wallet::class, null, [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]);
|
||||
foreach ($creditTransactions as $creditTransaction) {
|
||||
$transaction->owners()->firstOrCreate([
|
||||
'type' => StatementTransactionOwnerType::WALLET_TOP_UP,
|
||||
'system' => 'EXCHANGE',
|
||||
'owner_type' => Transaction::class,
|
||||
'owner_id'=> $creditTransaction->id,
|
||||
'owner_reference'=> $creditTransaction->owner->owner->reference,
|
||||
]);
|
||||
}
|
||||
|
||||
$creditTransactions = $this->getTransactionsFromShippingPortal($transaction->amount, $this->getDateRange($transaction->posting_date), 5);
|
||||
foreach ($creditTransactions as $creditTransaction) {
|
||||
$transaction->owners()->firstOrCreate([
|
||||
'type' => StatementTransactionOwnerType::WALLET_TOP_UP,
|
||||
'system' => 'SHIPPING_PORTAL',
|
||||
'owner_type' => $creditTransaction['owner_type'],
|
||||
'owner_id'=> $creditTransaction['owner_id'],
|
||||
'owner_reference'=> $creditTransaction['owner_reference'],
|
||||
]);
|
||||
}
|
||||
|
||||
// fpx charge refund
|
||||
if($transaction->transaction_description === 'DUITNOW S/CHRG REFUND'){
|
||||
$transaction->owners()->firstOrCreate([
|
||||
'type' => StatementTransactionOwnerType::FPX_CHARGE_REFUND
|
||||
]);
|
||||
}
|
||||
|
||||
// Customer Refund
|
||||
|
||||
// INTERNAL_BANK_TRANSFER_IN
|
||||
if(str_contains($transaction->transaction_description_2, 'CIEF WORLDWIDE')){
|
||||
$transaction->owners()->firstOrCreate([
|
||||
'type' => StatementTransactionOwnerType::INTERNAL_BANK_TRANSFER_IN
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
if($transaction->amount < 0){
|
||||
|
||||
// Supplier Purchase Order Payments
|
||||
foreach (['YSN', 'HCK', 'ATVANTIC', 'HIGH HILL'] as $reference){
|
||||
if(str_contains($transaction->transaction_description.' '.$transaction->transaction_description_2.' '.$transaction->transaction_description_3.' '.$transaction->transaction_description_4.' '.$transaction->transaction_description_5 , $reference)) {
|
||||
$paymentDateStart = $transaction->posting_date->startOfDay()->subDays(1);
|
||||
$paymentDateEnd = $transaction->posting_date->endOfDay();
|
||||
|
||||
if($paymentDateStart->dayOfWeek === Carbon::SUNDAY){
|
||||
$paymentDateStart->subDays(2);
|
||||
}
|
||||
$issuer = Company::where('name', 'like', '%'.$reference.'%')->get()->pluck('id');
|
||||
|
||||
$debitTransactions = Group::whereIn('issuer', $issuer)->where('amount', '>=', (($transaction->amount * -1) - 0.01))
|
||||
->where('amount', '<=', (($transaction->amount * -1) + 0.01))->whereDate('created_at', '>=', $paymentDateStart)->whereDate('created_at', '<=', $paymentDateEnd)->get();
|
||||
|
||||
foreach ($debitTransactions as $debitTransaction) {
|
||||
$transaction->owners()->firstOrCreate([
|
||||
'type' => StatementTransactionOwnerType::SUPPLIER_PAYMENT,
|
||||
'system' => 'EXCHANGE',
|
||||
'owner_type' => Group::class,
|
||||
'owner_id'=> $debitTransaction->id,
|
||||
'owner_reference'=> $debitTransaction->reference
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Exchange Wallet Withdrawal
|
||||
$debitTransactions = $this->getTransactions($transaction->posting_date, $transaction->amount, TransactionType::DEBIT_NOTE, Wallet::class, null, [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]);
|
||||
foreach ($debitTransactions as $debitTransaction) {
|
||||
$transaction->owners()->firstOrCreate([
|
||||
'type' => StatementTransactionOwnerType::WALLET_WITHDRAWAL,
|
||||
'system' => 'EXCHANGE',
|
||||
'owner_type' => Transaction::class,
|
||||
'owner_id'=> $debitTransaction->id,
|
||||
'owner_reference'=> $debitTransaction->owner->owner->marking,
|
||||
]);
|
||||
}
|
||||
|
||||
// SALARY
|
||||
|
||||
// STATUTORY
|
||||
if(str_contains($transaction->transaction_description_2, 'PEMBANGUNAN SUMBER') || str_contains($transaction->transaction_description_2, 'HASIL') || str_contains($transaction->transaction_description_2, 'PERTUBUHAN KESELAMAT') || str_contains($transaction->transaction_description_2, 'KUMPULAN WANG SIMPAN')){
|
||||
$transaction->owners()->firstOrCreate([
|
||||
'type' => StatementTransactionOwnerType::STATUTORY
|
||||
]);
|
||||
}
|
||||
|
||||
// FPX_CHARGE
|
||||
if($transaction->transaction_description === 'DR DUITNOW S/CHRG' || str_contains($transaction->transaction_description, 'Manual FPX') || str_contains($transaction->transaction_description, 'CMS - DR FPX CHG')){
|
||||
$transaction->owners()->firstOrCreate([
|
||||
'type' => StatementTransactionOwnerType::FPX_CHARGE
|
||||
]);
|
||||
}
|
||||
|
||||
// BANK_CHARGE
|
||||
if($transaction->transaction_description === 'CMS - DR CORP CHG' || $transaction->transaction_description === 'MONTHLY PROFIT DEBIT'){
|
||||
$transaction->owners()->firstOrCreate([
|
||||
'type' => StatementTransactionOwnerType::BANK_CHARGE
|
||||
]);
|
||||
}
|
||||
|
||||
// CREDIT_CARD_PAYMENT
|
||||
if(str_contains($transaction->transaction_description_2, 'VISA CARD')){
|
||||
$transaction->owners()->firstOrCreate([
|
||||
'type' => StatementTransactionOwnerType::CREDIT_CARD_PAYMENT
|
||||
]);
|
||||
}
|
||||
|
||||
// INTERNAL_BANK_TRANSFER_OUT
|
||||
if(str_contains($transaction->transaction_description_2, 'CIEF WORLDWIDE') || str_contains($transaction->transaction_description_2, 'CIEF WORLWIDE') || str_contains($transaction->transaction_description_2, 'IZYIM GLOBAL')){
|
||||
$transaction->owners()->firstOrCreate([
|
||||
'type' => StatementTransactionOwnerType::INTERNAL_BANK_TRANSFER_OUT
|
||||
]);
|
||||
}
|
||||
|
||||
// non-operational charges
|
||||
if(str_contains($transaction->transaction_description_2, 'HIRE PURCHASE') || str_contains($transaction->transaction_description_2, 'TENAGA NASIONAL') || str_contains($transaction->transaction_description, 'CABLE CHARGE') || str_contains($transaction->transaction_description_2, 'CTOS DATA SYSTEMS') || str_contains($transaction->transaction_description_2, 'MAXIS')){
|
||||
$transaction->owners()->firstOrCreate([
|
||||
'type' => StatementTransactionOwnerType::NON_OPERATIONAL
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function getTransactions($date, $amount, $type, $ownerType, $paymentMethod, $statuses, $model = Transaction::class) {
|
||||
$query = $model::whereIn('status', $statuses)
|
||||
->where(function ($query) use ($ownerType, $paymentMethod, $type) {
|
||||
if ($ownerType) {
|
||||
$query->where('owner_type', $ownerType);
|
||||
}
|
||||
|
||||
if ($paymentMethod) {
|
||||
$query->where('payment_method', '!=', $paymentMethod);
|
||||
}
|
||||
|
||||
if ($type) {
|
||||
$query->where('type', $type);
|
||||
}
|
||||
})
|
||||
->whereDate('created_at', $date->format('Y-m-d'))
|
||||
->where('amount', '>', ($amount - 0.01))
|
||||
->where('amount', '<', ($amount + 0.01));
|
||||
|
||||
return $query->get();
|
||||
}
|
||||
|
||||
private function getTransactionsFromShippingPortal($amount, $dateRange, $type){
|
||||
$url = 'https://izyim.cief-malaysia.com/public/api/v1/transactions/mappable/query';
|
||||
return $this->getFromShippingPortal($amount, $dateRange, $url, $type);
|
||||
}
|
||||
|
||||
private function getGroupsFromShippingPortal($amount, $dateRange, $type){
|
||||
$url = 'https://izyim.cief-malaysia.com/public/api/v1/groups/query';
|
||||
return $this->getFromShippingPortal($amount, $dateRange, $url, $type);
|
||||
}
|
||||
|
||||
private function getFromShippingPortal($amount, $dateRange, $url, $type){
|
||||
try{
|
||||
|
||||
$client = new \GuzzleHttp\Client(['verify' => false]);
|
||||
$response = $client->request('GET', $url.'?api-key=510acd13d8d24375cf038ad626c282565451461a9c2399357e0b65365300787e&filters={"order_by":{"column":"id","DESC":true},"status_in":[2],"type":2,"created_after":"'.$dateRange['start_date'].'","created_before":"'.$dateRange['end_date'].'","amount_exceed":'.($amount - 0.01).',"amount_short":'.($amount + 0.01).',"type_in:"['.$type.']}');
|
||||
$body = $response->getBody();
|
||||
$data = json_decode($body, true);
|
||||
$payload = $data['payload'];
|
||||
$transactions2 = $payload['data'];
|
||||
return $transactions2;
|
||||
}catch(\Exception $exception){
|
||||
Log::error($exception);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
private function getDateRange(string $dateStr) {
|
||||
// Create a DateTime object from the input string
|
||||
$date = strtotime($dateStr);
|
||||
|
||||
// Get the first day of the month
|
||||
$today = date('Y-m-d', strtotime('-1 day', $date));
|
||||
|
||||
// Get the first day of the next month
|
||||
$nextDay = date('Y-m-d', strtotime('+1 day', $date));
|
||||
|
||||
return [
|
||||
'start_date' => $today,
|
||||
'end_date' => $nextDay,
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounting\Processors;
|
||||
|
||||
use App\Classes\Exceptions\MalformedRequestException;
|
||||
use App\Models\Transaction;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use \Illuminate\Database\Eloquent\Collection;
|
||||
|
||||
class ListShippingPortalTransactions
|
||||
{
|
||||
public function execute($filters)
|
||||
{
|
||||
try {
|
||||
$url = 'https://izyim.cief-malaysia.com/public/api/v1/transactions/mappable/query/with-details';
|
||||
$client = new \GuzzleHttp\Client(['verify' => false]);
|
||||
$response = $client->request('GET', $url . '?api-key=510acd13d8d24375cf038ad626c282565451461a9c2399357e0b65365300787e&filters=' . json_encode($filters));
|
||||
$body = $response->getBody();
|
||||
$data = json_decode($body, true);
|
||||
$payload = $data['payload'];
|
||||
return $data['payload']['data'];
|
||||
|
||||
} catch (\Exception $exception) {
|
||||
// dd($exception->getMessage());
|
||||
throw new MalformedRequestException($exception->getMessage());
|
||||
// preg_match('/\{.*\}/s', $exception->getMessage(), $matches);
|
||||
// $jsonError = json_decode($matches[0]);
|
||||
// Retrieved Transactions failed
|
||||
// throw new MalformedRequestException($jsonError->title);
|
||||
}
|
||||
|
||||
// if not found
|
||||
throw new MalformedRequestException('Bill Number Not Found.');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounting\Services;
|
||||
|
||||
use App\Classes\General\Eloquent\AbstractUpdateRecord;
|
||||
use App\Classes\Modules\Accounting\DataTransferObjects\BankStatementTransactionObject;
|
||||
use App\Models\StatementTransactionOwner;
|
||||
|
||||
class CreatesBankStatementTransactionOwner extends AbstractUpdateRecord
|
||||
{
|
||||
|
||||
/**
|
||||
* @param StatementTransactionOwner $model
|
||||
* @param BankStatementDetailsObject $object
|
||||
* @return \Illuminate\Database\Eloquent\Model
|
||||
* @throws \App\Classes\Exceptions\MalformedRequestException
|
||||
*/
|
||||
public function execute(BankStatementTransactionObject $object)
|
||||
{
|
||||
$model = new StatementTransactionOwner();
|
||||
|
||||
$model->statement_transaction_id = $object->getStatementTransactionId();
|
||||
$model->type = $object->getType();
|
||||
$model->system = $object->getSystem();
|
||||
$model->owner_type = $object->getOwnerType();
|
||||
$model->owner_id = $object->getOwnerId();
|
||||
$model->invoice_reference = $object->getInvoiceReference();
|
||||
$model->receipt_reference = $object->getReceipteReference();
|
||||
$model->is_auto_mapped = $object->getIsAutoMapped();
|
||||
$model->status = $object->getStatus();
|
||||
|
||||
return $this->handler($model);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounting\Services;
|
||||
|
||||
|
||||
use App\Classes\General\Eloquent\AbstractFetchRecord;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use App\Models\StatementTransactionOwner;
|
||||
|
||||
class FetchesBankStatementDetails extends AbstractFetchRecord
|
||||
{
|
||||
|
||||
/** @var StatementTransactionOwner */
|
||||
private $repository;
|
||||
|
||||
|
||||
/**
|
||||
* FetchesBankStatementDetails constructor.
|
||||
* @param StatementTransactionOwner $repository
|
||||
*/
|
||||
public function __construct(StatementTransactionOwner $repository)
|
||||
{
|
||||
$this->repository = $repository;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return Builder
|
||||
*/
|
||||
public function getRepository(): Builder
|
||||
{
|
||||
return $this->repository->newQuery();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounting\Services;
|
||||
|
||||
|
||||
use App\Classes\General\Eloquent\AbstractFetchRecord;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use App\Models\StatementTransaction;
|
||||
|
||||
class FetchesBankStatementTransaction extends AbstractFetchRecord
|
||||
{
|
||||
|
||||
/** @var StatementTransaction */
|
||||
private $repository;
|
||||
|
||||
/**
|
||||
* FetchesBankStatementDetails constructor.
|
||||
* @param StatementTransactionOwner $repository
|
||||
*/
|
||||
public function __construct(StatementTransaction $repository)
|
||||
{
|
||||
$this->repository = $repository;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Builder
|
||||
*/
|
||||
public function getRepository(): Builder
|
||||
{
|
||||
return $this->repository->newQuery();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounting\Services;
|
||||
|
||||
use App\Classes\General\Eloquent\AbstractListRecord;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use App\Models\StatementTransactionOwner;
|
||||
|
||||
class ListsBankStatementDetails extends AbstractListRecord
|
||||
{
|
||||
|
||||
/** @var StatementTransactionOwner */
|
||||
private $repository;
|
||||
|
||||
/**
|
||||
* ListsBankStatementDetails constructor.
|
||||
* @param StatementTransactionOwner $repository
|
||||
*/
|
||||
public function __construct(StatementTransactionOwner $repository)
|
||||
{
|
||||
$this->repository = $repository;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return Builder
|
||||
*/
|
||||
public function getRepository(): Builder
|
||||
{
|
||||
return $this->repository->newQuery();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounting\Services;
|
||||
|
||||
use App\Classes\General\Eloquent\AbstractListRecord;
|
||||
use App\Models\StatementTransaction;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use App\Models\StatementTransactionOwner;
|
||||
|
||||
class ListsBankStatementTransactions extends AbstractListRecord
|
||||
{
|
||||
|
||||
/** @var StatementTransaction */
|
||||
private $repository;
|
||||
|
||||
/**
|
||||
* ListsBankStatementDetails constructor.
|
||||
* @param StatementTransaction $repository
|
||||
*/
|
||||
public function __construct(StatementTransaction $repository)
|
||||
{
|
||||
$this->repository = $repository;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return Builder
|
||||
*/
|
||||
public function getRepository(): Builder
|
||||
{
|
||||
return $this->repository->newQuery();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounting\Services;
|
||||
|
||||
use App\Classes\General\Eloquent\AbstractUpdateRecord;
|
||||
use App\Classes\Modules\Accounting\DataTransferObjects\BankStatementDetailObject;
|
||||
use App\Models\StatementTransactionOwner;
|
||||
|
||||
class UpdatesBankStatementDetails extends AbstractUpdateRecord
|
||||
{
|
||||
|
||||
/**
|
||||
* @param StatementTransactionOwner $model
|
||||
* @param BankStatementDetailsObject $object
|
||||
* @return \Illuminate\Database\Eloquent\Model
|
||||
* @throws \App\Classes\Exceptions\MalformedRequestException
|
||||
*/
|
||||
public function execute(StatementTransactionOwner $model, BankStatementDetailObject $object)
|
||||
{
|
||||
$model->system_references = $object->getSystemReferences();
|
||||
$model->pay_for = $object->getPayFor();
|
||||
|
||||
return $this->handler($model);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounting\Services;
|
||||
|
||||
use App\Classes\General\Eloquent\AbstractUpdateRecord;
|
||||
use App\Classes\Modules\Accounting\DataTransferObjects\BankStatementTransactionObject;
|
||||
use App\Models\StatementTransactionOwner;
|
||||
|
||||
class UpdatesBankStatementTransactionOwner extends AbstractUpdateRecord
|
||||
{
|
||||
|
||||
/**
|
||||
* @param StatementTransactionOwner $model
|
||||
* @param BankStatementDetailsObject $object
|
||||
* @return \Illuminate\Database\Eloquent\Model
|
||||
* @throws \App\Classes\Exceptions\MalformedRequestException
|
||||
*/
|
||||
public function execute(StatementTransactionOwner $model, BankStatementTransactionObject $object)
|
||||
{
|
||||
$model->statement_transaction_id = $object->getStatementTransactionId();
|
||||
$model->type = $object->getType();
|
||||
$model->system = $object->getSystem();
|
||||
$model->owner_type = $object->getOwnerType();
|
||||
$model->owner_id = $object->getOwnerId();
|
||||
$model->invoice_reference = $object->getInvoiceReference();
|
||||
$model->receipt_reference = $object->getReceipteReference();
|
||||
$model->is_auto_mapped = $object->getIsAutoMapped();
|
||||
$model->status = $object->getStatus();
|
||||
|
||||
return $this->handler($model);
|
||||
}
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounting\Services;
|
||||
|
||||
use App\Classes\General\Eloquent\AbstractUpdateRecord;
|
||||
use App\Models\StatementTransactionOwner;
|
||||
|
||||
class UpdatesBankStatementTransactionOwnerStatus extends AbstractUpdateRecord
|
||||
{
|
||||
|
||||
/**
|
||||
* @param StatementTransactionOwner $model
|
||||
* @param BankStatementDetailsObject $object
|
||||
* @return \Illuminate\Database\Eloquent\Model
|
||||
* @throws \App\Classes\Exceptions\MalformedRequestException
|
||||
*/
|
||||
public function execute(StatementTransactionOwner $model, int $status)
|
||||
{
|
||||
$model->status = $status;
|
||||
return $this->handler($model);
|
||||
}
|
||||
}
|
||||
@@ -11,7 +11,9 @@ use App\Classes\Modules\Companies\Processors\AssignEmployeeProcessor;
|
||||
use App\Classes\Modules\Companies\Processors\AssignSegmentProcessor;
|
||||
use App\Classes\Modules\Companies\Processors\CreateCompanyProcessor;
|
||||
use App\Classes\Modules\Contacts\Processors\CreateContactProcessor;
|
||||
use App\Classes\Modules\PerfexCRM\Processors\CreatePerfexCRMLeadProcessor;
|
||||
use App\Classes\Modules\Milestones\Processors\CheckMilestonesForRewardProcessor;
|
||||
use App\Classes\Modules\Vouchers\Processors\Voucherify\NewCustomerToVoucherifyProcessor;
|
||||
use App\Classes\Modules\Vouchers\Processors\CreateVoucherProcessor;
|
||||
use App\Classes\Modules\Companies\DataTransferObjects\EmploymentObject;
|
||||
use App\Classes\Modules\PerfexCRM\DataTransferObjects\CreateLeadPerfexCRMObject;
|
||||
use App\Classes\ValueObjects\Constants\ApprovalStatus;
|
||||
@@ -19,12 +21,15 @@ use App\Classes\ValueObjects\Constants\BusinessType;
|
||||
use App\Classes\ValueObjects\Constants\CompanyType;
|
||||
use App\Classes\ValueObjects\Constants\RoleTypes;
|
||||
use App\Classes\Jobs\CreatePerfexCRMCustomer;
|
||||
use App\Classes\Modules\Segments\DataTransferObjects\SeasonalSegmentObject;
|
||||
use App\Models\Company;
|
||||
use App\Models\Segment;
|
||||
use App\Models\User;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\App;
|
||||
|
||||
use App\Classes\Modules\Segments\Services\CreatesSeasonalSegment;
|
||||
|
||||
class CreateCustomerLogic extends AbstractControllerLogic
|
||||
{
|
||||
@@ -60,8 +65,17 @@ class CreateCustomerLogic extends AbstractControllerLogic
|
||||
/** @var GenerateEmailVerificationAttemptProcessor */
|
||||
private $generateEmailVerificationAttemptProcessor;
|
||||
|
||||
/** @var CreatePerfexCRMLeadProcessor */
|
||||
private $createPerfexCRMLeadProcessor;
|
||||
/** @var CreatesSeasonalSegment */
|
||||
private $createsSeasonalSegment;
|
||||
|
||||
/** @var CheckMilestonesForRewardProcessor */
|
||||
private $checkMilestonesForRewardProcessor;
|
||||
|
||||
/** @var NewCustomerToVoucherifyProcessor */
|
||||
private $newCustomerToVoucherifyProcessor;
|
||||
|
||||
/** @var CreateVoucherProcessor */
|
||||
private $createVoucherProcessor;
|
||||
|
||||
/**
|
||||
* CreateCustomerLogic constructor.
|
||||
@@ -72,10 +86,13 @@ class CreateCustomerLogic extends AbstractControllerLogic
|
||||
* @param AssignSegmentProcessor $assignSegmentProcessor
|
||||
* @param AuthenticationProcessor $authenticationProcessor
|
||||
* @param GenerateEmailVerificationAttemptProcessor $generateEmailVerificationAttemptProcessor
|
||||
* @param CreatePerfexCRMLeadProcessor $createPerfexCRMLeadProcessor
|
||||
* @param CreatesSeasonalSegment $createsSeasonalSegment
|
||||
* @param CheckMilestonesForRewardProcessor $checkMilestonesForRewardProcessor
|
||||
* @param NewCustomerToVoucherifyProcessor $newCustomerToVoucherifyProcessor
|
||||
* @param CreateVoucherProcessor $createVoucherProcessor
|
||||
*/
|
||||
public function __construct(CreateUserProcessor $createUserProcessor, CreateCompanyProcessor $createCompanyProcessor, CreateContactProcessor $createContactProcessor, AssignEmployeeProcessor $assignEmployeeProcessor, AssignSegmentProcessor $assignSegmentProcessor, AuthenticationProcessor $authenticationProcessor, GenerateEmailVerificationAttemptProcessor $generateEmailVerificationAttemptProcessor,
|
||||
CreatePerfexCRMLeadProcessor $createPerfexCRMLeadProcessor)
|
||||
CreatesSeasonalSegment $createsSeasonalSegment, CheckMilestonesForRewardProcessor $checkMilestonesForRewardProcessor, NewCustomerToVoucherifyProcessor $newCustomerToVoucherifyProcessor, CreateVoucherProcessor $createVoucherProcessor)
|
||||
{
|
||||
$this->createUserProcessor = $createUserProcessor;
|
||||
$this->createCompanyProcessor = $createCompanyProcessor;
|
||||
@@ -84,7 +101,10 @@ class CreateCustomerLogic extends AbstractControllerLogic
|
||||
$this->assignSegmentProcessor = $assignSegmentProcessor;
|
||||
$this->authenticationProcessor = $authenticationProcessor;
|
||||
$this->generateEmailVerificationAttemptProcessor = $generateEmailVerificationAttemptProcessor;
|
||||
$this->createPerfexCRMLeadProcessor = $createPerfexCRMLeadProcessor;
|
||||
$this->createsSeasonalSegment = $createsSeasonalSegment;
|
||||
$this->checkMilestonesForRewardProcessor = $checkMilestonesForRewardProcessor;
|
||||
$this->newCustomerToVoucherifyProcessor = $newCustomerToVoucherifyProcessor;
|
||||
$this->createVoucherProcessor = $createVoucherProcessor;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -98,6 +118,7 @@ class CreateCustomerLogic extends AbstractControllerLogic
|
||||
*/
|
||||
public function logic(Request $request) : JsonResponse
|
||||
{
|
||||
|
||||
/** @var User $user */
|
||||
$user = $this->createUserProcessor->execute($request, RoleTypes::USER, App::environment(['local']) ? ApprovalStatus::APPROVED : ApprovalStatus::PENDING_VERIFICATION);
|
||||
|
||||
@@ -109,10 +130,21 @@ class CreateCustomerLogic extends AbstractControllerLogic
|
||||
$Object = new EmploymentObject($company, $user);
|
||||
$this->assignEmployeeProcessor->execute($Object);
|
||||
|
||||
// assign STANDARD_SEGMENT to all new customers
|
||||
$this->assignSegmentProcessor->execute($company);
|
||||
|
||||
// assign other standard segment to all new customers
|
||||
$otherDefaultSegmentToAdd = Segment::whereIn('name', ['HONEY TRAP NEW REGISTRATION'])->get();
|
||||
$start_date = Carbon::now();
|
||||
$end_date = Carbon::now()->addDays(30);
|
||||
foreach ($otherDefaultSegmentToAdd as $segment) {
|
||||
$seasonalSegmentObject = new SeasonalSegmentObject($company->id, $segment->id, $start_date, $end_date ?? null);
|
||||
|
||||
$this->createsSeasonalSegment->execute($seasonalSegmentObject);
|
||||
$this->assignSegmentProcessor->execute($company, $segment->id);
|
||||
}
|
||||
|
||||
if(config('perfexcrm.is_enabled') == 'true'){
|
||||
//$this->createPerfexCRMLeadProcessor->execute($request);
|
||||
$createLeadPerfexCRMObject = new CreateLeadPerfexCRMObject(
|
||||
$request->input('name'),
|
||||
$request->input('email'),
|
||||
@@ -125,7 +157,11 @@ class CreateCustomerLogic extends AbstractControllerLogic
|
||||
|
||||
$this->generateEmailVerificationAttemptProcessor->execute($user);
|
||||
|
||||
return $this->response($this->authenticationProcessor->execute($request));
|
||||
$this->newCustomerToVoucherifyProcessor->execute($company->id, $user, true);
|
||||
|
||||
$this->createVoucherProcessor->execute($user, 'WELCOME50%OFF');
|
||||
|
||||
return $this->response($this->authenticationProcessor->execute($request, false));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,9 @@ use App\Classes\Modules\Accounts\Services\AuthenticationRedirect;
|
||||
use App\Classes\Modules\Accounts\Services\FetchesUser;
|
||||
use App\Classes\Modules\Accounts\Services\GeneratesAuthenticationToken;
|
||||
use App\Classes\Modules\Accounts\Standards\Rules\CanAuthenticateUser;
|
||||
use App\Classes\Modules\Milestones\Processors\CheckMilestonesForRewardProcessor;
|
||||
use App\Classes\Modules\Vouchers\Processors\Voucherify\NewCustomerToVoucherifyProcessor;
|
||||
use App\Classes\ValueObjects\Constants\Milestones;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class AuthenticationProcessor
|
||||
@@ -28,6 +31,13 @@ class AuthenticationProcessor
|
||||
/** @var AuthenticationRedirect */
|
||||
private $authenticationRedirect;
|
||||
|
||||
/** @var CheckMilestonesForRewardProcessor */
|
||||
private $checkMilestonesForRewardProcessor;
|
||||
|
||||
/** @var NewCustomerToVoucherifyProcessor */
|
||||
private $newCustomerToVoucherifyProcessor;
|
||||
|
||||
|
||||
/**
|
||||
* AuthenticationProcessor constructor.
|
||||
* @param CanAuthenticateUser $canAuthenticateUser
|
||||
@@ -35,14 +45,18 @@ class AuthenticationProcessor
|
||||
* @param GeneratesAuthenticationToken $generatesAuthenticationToken
|
||||
* @param FetchesUser $fetchesUser
|
||||
* @param AuthenticationRedirect $authenticationRedirect
|
||||
* @param CheckMilestonesForRewardProcessor $checkMilestonesForRewardProcessor
|
||||
* @param NewCustomerToVoucherifyProcessor $newCustomerToVoucherifyProcessor
|
||||
*/
|
||||
public function __construct(CanAuthenticateUser $canAuthenticateUser, AuthenticatesUser $authenticatesUser, GeneratesAuthenticationToken $generatesAuthenticationToken, FetchesUser $fetchesUser, AuthenticationRedirect $authenticationRedirect)
|
||||
public function __construct(CanAuthenticateUser $canAuthenticateUser, AuthenticatesUser $authenticatesUser, GeneratesAuthenticationToken $generatesAuthenticationToken, FetchesUser $fetchesUser, AuthenticationRedirect $authenticationRedirect, CheckMilestonesForRewardProcessor $checkMilestonesForRewardProcessor, NewCustomerToVoucherifyProcessor $newCustomerToVoucherifyProcessor)
|
||||
{
|
||||
$this->canAuthenticateUser = $canAuthenticateUser;
|
||||
$this->authenticatesUser = $authenticatesUser;
|
||||
$this->generatesAuthenticationToken = $generatesAuthenticationToken;
|
||||
$this->fetchesUser = $fetchesUser;
|
||||
$this->authenticationRedirect = $authenticationRedirect;
|
||||
$this->checkMilestonesForRewardProcessor = $checkMilestonesForRewardProcessor;
|
||||
$this->newCustomerToVoucherifyProcessor = $newCustomerToVoucherifyProcessor;
|
||||
}
|
||||
|
||||
|
||||
@@ -53,7 +67,7 @@ class AuthenticationProcessor
|
||||
* @throws \App\Classes\Exceptions\AccessUnauthorisedException
|
||||
* @throws \App\Classes\Exceptions\RequestValidationException
|
||||
*/
|
||||
public function execute(Request $request): array {
|
||||
public function execute(Request $request, bool $isSignIn = true): array {
|
||||
|
||||
$object = new AuthenticationCredentialsObject($request->input('email'), $request->input('password'));
|
||||
|
||||
@@ -63,8 +77,13 @@ class AuthenticationProcessor
|
||||
|
||||
$user = $this->fetchesUser->execute(['email' => $object->getEmail()]);
|
||||
|
||||
if($isSignIn){
|
||||
$this->newCustomerToVoucherifyProcessor->execute(0, $user, false);
|
||||
}
|
||||
|
||||
//cief todo: case study 1
|
||||
//$this->checkMilestonesForRewardProcessor->execute($user, [Milestones::MILESTONE_1]);
|
||||
|
||||
return ['access_token' => $this->generatesAuthenticationToken->execute($user), 'redirect_url' => $this->authenticationRedirect->url($user)];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,10 +9,12 @@ use App\Classes\Modules\Addresses\Services\FetchesDistrict;
|
||||
use App\Classes\Modules\Addresses\Standards\Rules\CanCreateAddress;
|
||||
use App\Classes\Modules\Addresses\DataTransferObjects\AddressObject;
|
||||
use App\Classes\Modules\Companies\Services\FetchesCompany;
|
||||
use App\Classes\Modules\Milestones\Processors\CheckMilestonesForRewardProcessor;
|
||||
use App\Http\Resources\AddressResource;
|
||||
use ErrorException;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Classes\ValueObjects\Constants\Milestones;
|
||||
|
||||
class CreateAddressLogic extends AbstractControllerLogic
|
||||
{
|
||||
@@ -39,19 +41,25 @@ class CreateAddressLogic extends AbstractControllerLogic
|
||||
/** @var CreatesAddress */
|
||||
private $createsAddress;
|
||||
|
||||
/** @var CheckMilestonesForRewardProcessor */
|
||||
private $checkMilestonesForRewardProcessor;
|
||||
|
||||
|
||||
/**
|
||||
* CreateAddressLogic constructor.
|
||||
* @param CanCreateAddress $canCreateAddress
|
||||
* @param FetchesDistrict $fetchesDistrict
|
||||
* @param FetchesCompany $fetchesCompany
|
||||
* @param CreatesAddress $createsAddress
|
||||
* @param CheckMilestonesForRewardProcessor $checkMilestonesForRewardProcessor
|
||||
*/
|
||||
public function __construct(CanCreateAddress $canCreateAddress, FetchesDistrict $fetchesDistrict, FetchesCompany $fetchesCompany, CreatesAddress $createsAddress)
|
||||
public function __construct(CanCreateAddress $canCreateAddress, FetchesDistrict $fetchesDistrict, FetchesCompany $fetchesCompany, CreatesAddress $createsAddress, CheckMilestonesForRewardProcessor $checkMilestonesForRewardProcessor)
|
||||
{
|
||||
$this->canCreateAddress = $canCreateAddress;
|
||||
$this->fetchesDistrict = $fetchesDistrict;
|
||||
$this->fetchesCompany = $fetchesCompany;
|
||||
$this->createsAddress = $createsAddress;
|
||||
$this->checkMilestonesForRewardProcessor = $checkMilestonesForRewardProcessor;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -70,10 +78,15 @@ class CreateAddressLogic extends AbstractControllerLogic
|
||||
|
||||
$this->canCreateAddress->passes($object);
|
||||
|
||||
$query = $this->createsAddress->execute($this->fetchesCompany->execute(['id' => $request->input('company_id')]), $object);
|
||||
$company = $this->fetchesCompany->execute(['id' => $request->input('company_id')]);
|
||||
$query = $this->createsAddress->execute($company, $object);
|
||||
|
||||
//cief todo: case study 6
|
||||
// $user = $company->employees()->first();
|
||||
// $this->checkMilestonesForRewardProcessor->execute($user, [Milestones::MILESTONE_6]);
|
||||
|
||||
return $this->resourceResponse(new AddressResource($query));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,10 @@ use App\Classes\Modules\Banks\Standards\Rules\CanCreateBank;
|
||||
use App\Classes\Modules\Banks\Services\CreatesBank;
|
||||
use App\Classes\Modules\Banks\Services\CreatesBankLog;
|
||||
use App\Classes\Modules\Banks\DataTransferObjects\BankObject;
|
||||
use App\Classes\Modules\Companies\Services\FetchesCompany;
|
||||
use App\Classes\Modules\Milestones\Processors\CheckMilestonesForRewardProcessor;
|
||||
use App\Http\Resources\BankResource;
|
||||
use App\Classes\ValueObjects\Constants\Milestones;
|
||||
|
||||
use ErrorException;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
@@ -36,21 +39,34 @@ class CreateBankLogic extends AbstractControllerLogic
|
||||
/** @var CreatesBankLog */
|
||||
private $createsBankLog;
|
||||
|
||||
/** @var FetchesCompany */
|
||||
private $fetchesCompany;
|
||||
|
||||
/** @var CheckMilestonesForRewardProcessor */
|
||||
private $checkMilestonesForRewardProcessor;
|
||||
|
||||
|
||||
/**
|
||||
* CreateBankLogic constructor.
|
||||
* @param CanCreateBank $canCreateBank
|
||||
* @param CreatesBank $createsBank
|
||||
* @param CreatesBankLog $createsBankLog
|
||||
* @param FetchesCompany $fetchesCompany
|
||||
* @param CheckMilestonesForRewardProcessor $checkMilestonesForRewardProcessor
|
||||
*/
|
||||
public function __construct(
|
||||
CanCreateBank $canCreateBank,
|
||||
CreatesBank $createsBank,
|
||||
CreatesBankLog $createsBankLog
|
||||
CreatesBankLog $createsBankLog,
|
||||
FetchesCompany $fetchesCompany,
|
||||
CheckMilestonesForRewardProcessor $checkMilestonesForRewardProcessor
|
||||
)
|
||||
{
|
||||
$this->canCreateBank = $canCreateBank;
|
||||
$this->createsBank = $createsBank;
|
||||
$this->createsBankLog = $createsBankLog;
|
||||
$this->fetchesCompany = $fetchesCompany;
|
||||
$this->checkMilestonesForRewardProcessor = $checkMilestonesForRewardProcessor;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -73,7 +89,12 @@ class CreateBankLogic extends AbstractControllerLogic
|
||||
|
||||
// $bankLog = $this->createsBankLog->execute($bank);
|
||||
|
||||
//cief todo: case study 4
|
||||
// $company = $this->fetchesCompany->execute(['id' => $request->input('company_id')]);
|
||||
// $user = $company->employees()->first();
|
||||
// $this->checkMilestonesForRewardProcessor->execute($user, [Milestones::MILESTONE_4]);
|
||||
|
||||
return $this->resourceResponse(new BankResource($bank));
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,8 @@ 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\Milestones;
|
||||
use App\Http\Resources\BookingResource;
|
||||
|
||||
use App\Models\Booking;
|
||||
@@ -50,6 +51,10 @@ class CreateBookingLogic extends AbstractControllerLogic
|
||||
/** @var BookingToPerfexCRMProcessor */
|
||||
private $bookingToPerfexCRMProcessor;
|
||||
|
||||
/** @var CheckMilestonesForRewardProcessor */
|
||||
private $checkMilestonesForRewardProcessor;
|
||||
|
||||
|
||||
/**
|
||||
* CreateBookingLogic constructor.
|
||||
* @param CanCreateBooking $canCreateBooking
|
||||
@@ -57,14 +62,16 @@ class CreateBookingLogic extends AbstractControllerLogic
|
||||
* @param GeneratesBookingMarking $generatesBookingMarking
|
||||
* @param FetchesCompany $fetchesCompany
|
||||
* @param BookingToPerfexCRMProcessor $bookingToPerfexCRMProcessor
|
||||
* @param CheckMilestoneForRewardProcessor $checkMilestonesForRewardProcessor
|
||||
*/
|
||||
public function __construct(CanCreateBooking $canCreateBooking, CreatesBooking $createsBooking, GeneratesBookingMarking $generatesBookingMarking, FetchesCompany $fetchesCompany, BookingToPerfexCRMProcessor $bookingToPerfexCRMProcessor)
|
||||
public function __construct(CanCreateBooking $canCreateBooking, CreatesBooking $createsBooking, GeneratesBookingMarking $generatesBookingMarking, FetchesCompany $fetchesCompany, BookingToPerfexCRMProcessor $bookingToPerfexCRMProcessor, CheckMilestonesForRewardProcessor $checkMilestonesForRewardProcessor)
|
||||
{
|
||||
$this->canCreateBooking = $canCreateBooking;
|
||||
$this->createsBooking = $createsBooking;
|
||||
$this->generatesBookingMarking = $generatesBookingMarking;
|
||||
$this->fetchesCompany = $fetchesCompany;
|
||||
$this->bookingToPerfexCRMProcessor = $bookingToPerfexCRMProcessor;
|
||||
$this->checkMilestonesForRewardProcessor = $checkMilestonesForRewardProcessor;
|
||||
}
|
||||
|
||||
|
||||
@@ -90,6 +97,10 @@ class CreateBookingLogic extends AbstractControllerLogic
|
||||
$this->bookingToPerfexCRMProcessor->execute($booking);
|
||||
}
|
||||
|
||||
//cief todo: case study 5
|
||||
// $user = $company->employees()->first();
|
||||
// $this->checkMilestonesForRewardProcessor->execute($user, [Milestones::MILESTONE_5]);
|
||||
|
||||
return $this->resourceResponse(new BookingResource($booking));
|
||||
|
||||
}
|
||||
|
||||
@@ -5,29 +5,27 @@ namespace App\Classes\Modules\Bookings\ControllersLogic;
|
||||
|
||||
use App\Classes\Exceptions\MalformedRequestException;
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
use App\Classes\Modules\Bookings\DataTransferObjects\CalculationObject;
|
||||
use App\Classes\Modules\Bookings\Services\CalculatesBookingOutstanding;
|
||||
use App\Classes\Modules\Bookings\Services\FetchesBookingQuotation;
|
||||
use App\Classes\Modules\Companies\Services\FetchesCompanyPaymentAttemptLimit;
|
||||
use App\Classes\Modules\Currencies\DataTransferObjects\CurrencyConversionObject;
|
||||
//use App\Classes\Modules\Vouchers\DataTransferObjects\VoucherObject;
|
||||
use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject;
|
||||
use App\Classes\Modules\Transactions\Services\CreatesTransaction;
|
||||
use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber;
|
||||
use App\Classes\Modules\Billplzs\Services\CreatesBillplzBill;
|
||||
use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus;
|
||||
//use App\Classes\Modules\Vouchers\Services\FetchesVoucher;
|
||||
//use App\Classes\Modules\Vouchers\Services\CreatesVoucher;
|
||||
//use App\Classes\Modules\Vouchers\Services\CreatesVoucherRedemption;
|
||||
//use App\Classes\Modules\Vouchers\Services\RedeemsVoucher;
|
||||
use App\Classes\Modules\Wallets\Services\UpdatesWalletBalance;
|
||||
use App\Classes\ValueObjects\Constants\ApprovalStatus;
|
||||
use App\Classes\ValueObjects\Constants\PaymentMethodType;
|
||||
use App\Classes\ValueObjects\Constants\TransactionType;
|
||||
use App\Classes\Modules\Currencies\DataTransferObjects\CurrencyConversionObject;
|
||||
use App\Http\Resources\TransactionResource;
|
||||
|
||||
use App\Classes\Modules\Transactions\Processors\CreateCashBackTransactionProcessor;
|
||||
use App\Classes\Modules\Vouchers\Processors\Voucherify\BookingToVoucherifyProcessor;
|
||||
|
||||
use App\Models\Booking;
|
||||
use App\Models\Transaction;
|
||||
use App\Models\Wallet;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
@@ -35,30 +33,6 @@ use App\Classes\Modules\Wallets\Services\RecalculatesWalletBalance;
|
||||
|
||||
class CreateBookingPaymentLogic extends AbstractControllerLogic
|
||||
{
|
||||
/**
|
||||
* @param FetchesBookingQuotation $fetchBookingQuotation
|
||||
* @param FetchesCompanyPaymentAttemptLimit $fetchesCompanyPaymentAttemptLimit
|
||||
* @param GeneratesTransactionBillNumber $generatesTransactionBillNumber
|
||||
* @param CreatesTransaction $createsTransaction
|
||||
* @param CalculatesBookingOutstanding $calculatesBookingOutstanding
|
||||
* @param CreatesBillplzBill $createsBillplzBill
|
||||
* @param UpdatesWalletBalance $updatesWalletBalance
|
||||
* @param UpdatesTransactionStatus $updatesTransactionStatus
|
||||
* @param RecalculatesWalletBalance $recalculatesWalletBalance
|
||||
*/
|
||||
public function __construct(FetchesBookingQuotation $fetchBookingQuotation, FetchesCompanyPaymentAttemptLimit $fetchesCompanyPaymentAttemptLimit, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CreatesTransaction $createsTransaction, CalculatesBookingOutstanding $calculatesBookingOutstanding, CreatesBillplzBill $createsBillplzBill, UpdatesWalletBalance $updatesWalletBalance, UpdatesTransactionStatus $updatesTransactionStatus, RecalculatesWalletBalance $recalculatesWalletBalance)
|
||||
{
|
||||
$this->fetchBookingQuotation = $fetchBookingQuotation;
|
||||
$this->fetchesCompanyPaymentAttemptLimit = $fetchesCompanyPaymentAttemptLimit;
|
||||
$this->generatesTransactionBillNumber = $generatesTransactionBillNumber;
|
||||
$this->createsTransaction = $createsTransaction;
|
||||
$this->calculatesBookingOutstanding = $calculatesBookingOutstanding;
|
||||
$this->createsBillplzBill = $createsBillplzBill;
|
||||
$this->updatesWalletBalance = $updatesWalletBalance;
|
||||
$this->updatesTransactionStatus = $updatesTransactionStatus;
|
||||
$this->recalculatesWalletBalance = $recalculatesWalletBalance;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return array
|
||||
@@ -94,157 +68,113 @@ class CreateBookingPaymentLogic extends AbstractControllerLogic
|
||||
/** @var UpdatesTransactionStatus */
|
||||
private $updatesTransactionStatus;
|
||||
|
||||
/** @var CreateCashBackTransactionProcessor */
|
||||
private $createCashBackTransactionProcessor;
|
||||
|
||||
/** @var RecalculatesWalletBalance */
|
||||
private $recalculatesWalletBalance;
|
||||
//
|
||||
// /** @var FetchesVoucher */
|
||||
// private $fetchesVoucher;
|
||||
//
|
||||
// /** @var CreatesVoucher */
|
||||
// private $createsVoucher;
|
||||
//
|
||||
// /** @var CreatesVoucherRedemption */
|
||||
// private $createsVoucherRedemption;
|
||||
//
|
||||
// /** @var RedeemsVoucher */
|
||||
// private $redeemsVoucher;
|
||||
|
||||
/** @var BookingToVoucherifyProcessor */
|
||||
private $bookingToVoucherifyProcessor;
|
||||
|
||||
/**
|
||||
* CreateBookingPaymentLogic constructor.
|
||||
* @param FetchesBookingQuotation $fetchBookingQuotation
|
||||
* @param FetchesCompanyPaymentAttemptLimit $fetchesCompanyPaymentAttemptLimit
|
||||
* @param GeneratesTransactionBillNumber $generatesTransactionBillNumber
|
||||
* @param CreatesTransaction $createsTransaction
|
||||
* @param CalculatesBookingOutstanding $calculatesBookingOutstanding
|
||||
* @param CreatesBillplzBill $createsBillplzBill
|
||||
* @param UpdatesWalletBalance $updatesWalletBalance
|
||||
* @param UpdatesTransactionStatus $updatesTransactionStatus
|
||||
* @param CreateCashBackTransactionProcessor $createCashBackTransactionProcessor
|
||||
* @param RecalculatesWalletBalance $recalculatesWalletBalance
|
||||
* @param BookingToVoucherifyProcessor $bookingToVoucherifyProcessor
|
||||
*/
|
||||
public function __construct(FetchesBookingQuotation $fetchBookingQuotation, FetchesCompanyPaymentAttemptLimit $fetchesCompanyPaymentAttemptLimit, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CreatesTransaction $createsTransaction, CalculatesBookingOutstanding $calculatesBookingOutstanding, CreatesBillplzBill $createsBillplzBill, UpdatesWalletBalance $updatesWalletBalance, UpdatesTransactionStatus $updatesTransactionStatus, CreateCashBackTransactionProcessor $createCashBackTransactionProcessor, RecalculatesWalletBalance $recalculatesWalletBalance, BookingToVoucherifyProcessor $bookingToVoucherifyProcessor)
|
||||
{
|
||||
$this->fetchBookingQuotation = $fetchBookingQuotation;
|
||||
$this->fetchesCompanyPaymentAttemptLimit = $fetchesCompanyPaymentAttemptLimit;
|
||||
$this->generatesTransactionBillNumber = $generatesTransactionBillNumber;
|
||||
$this->createsTransaction = $createsTransaction;
|
||||
$this->calculatesBookingOutstanding = $calculatesBookingOutstanding;
|
||||
$this->createsBillplzBill = $createsBillplzBill;
|
||||
$this->updatesWalletBalance = $updatesWalletBalance;
|
||||
$this->updatesTransactionStatus = $updatesTransactionStatus;
|
||||
$this->createCashBackTransactionProcessor = $createCashBackTransactionProcessor;
|
||||
$this->recalculatesWalletBalance = $recalculatesWalletBalance;
|
||||
$this->bookingToVoucherifyProcessor = $bookingToVoucherifyProcessor;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
* @throws MalformedRequestException
|
||||
*/
|
||||
public function logic(Request $request) : JsonResponse
|
||||
{
|
||||
$voucherCode = $request->input('voucher_code');
|
||||
|
||||
$booking = Booking::find($request->route('id'));
|
||||
|
||||
$conversionObject = $this->createConversionObject($request, $booking);
|
||||
$conversionObject = new CurrencyConversionObject(floatval(str_replace(',', '', $request->input('amount'))), $booking->convertible_currency_id, $booking->service_id, $booking->fix_currency_id === 1 ? 0:1, PaymentMethodType::PAYMENT_METHODS[$request->input('payment_method')]);
|
||||
|
||||
$this->validatePayment($request, $booking, $conversionObject);
|
||||
$outstanding = $this->calculatesBookingOutstanding->execute($booking);
|
||||
|
||||
$configurations = $this->fetchBookingQuotation->execute($booking->company, $conversionObject, $request->input('voucher_code'));
|
||||
if($conversionObject->getAmount() > round($outstanding, 2)) throw new MalformedRequestException('Your payment must not be greater than '. $outstanding .'.');
|
||||
|
||||
$configurations = $this->fetchBookingQuotation->execute($booking->company, $conversionObject, $voucherCode);
|
||||
|
||||
$paymentAttemptLimit = $this->fetchesCompanyPaymentAttemptLimit->execute($booking->company);
|
||||
|
||||
$billNumber = $this->generatesTransactionBillNumber->execute('PYMT-');
|
||||
|
||||
$paymentReference = $this->handlePaymentMethods($request, $booking, $configurations, $billNumber);
|
||||
$paymentReference = null;
|
||||
|
||||
$object = $this->createTransactionObject($booking, $configurations, $billNumber, $paymentReference);
|
||||
$amount = $configurations->getTotal();
|
||||
|
||||
if(PaymentMethodType::PAYMENT_METHODS[$request->input('payment_method')] == PaymentMethodType::PAYMENT_GATEWAY){
|
||||
$billPlzBill = $this->createsBillplzBill->execute($booking->company->name, $request->user()->email, 'This payment is made for transfer ref. '.$booking->marking, $configurations->getTotal(), $billNumber, $request->input('bank_code'));
|
||||
$paymentReference = $billPlzBill->id;
|
||||
}
|
||||
|
||||
if(PaymentMethodType::PAYMENT_METHODS[$request->input('payment_method')] == PaymentMethodType::WALLET){
|
||||
/** @var Wallet $wallet */
|
||||
$wallet = $booking->company->wallets()->first();
|
||||
|
||||
if((float) number_format(($wallet->amount - $amount),2) < 0){
|
||||
throw new MalformedRequestException('Insufficient wallet balance. Please Top up your wallet.');
|
||||
}
|
||||
|
||||
$transaction_object = new TransactionObject($billNumber, TransactionType::PAYMENT, 1, $booking->company->id, 1, PaymentMethodType::WALLET, $amount, $amount, 1, 1, 1, 0, 0, null, ApprovalStatus::APPROVED, [], '');
|
||||
$transaction = $this->createsTransaction->execute($wallet, $transaction_object);
|
||||
|
||||
$paymentReference = $billNumber;
|
||||
|
||||
$walletBalance = $this->recalculatesWalletBalance->execute($wallet);
|
||||
$this->updatesWalletBalance->execute($wallet, $walletBalance);
|
||||
}
|
||||
|
||||
$billNumber = $this->generatesTransactionBillNumber->execute('PYMT-');
|
||||
|
||||
$object = new TransactionObject($billNumber, TransactionType::PAYMENT, 1, $booking->company->id,
|
||||
$configurations->getConfigurations()->getBankId(), $configurations->getConversionObject()->getPaymentMethod(),
|
||||
$configurations->getTotal(), $configurations->getForeignTotal(), 1,
|
||||
$configurations->getConversionObject()->getCurrencyId(), $configurations->getConfigurations()->getRate(),
|
||||
$configurations->getTax(), $configurations->getServiceCharge(), Carbon::now()->addMinutes($paymentAttemptLimit), ApprovalStatus::PENDING_SUBMISSION, [], $paymentReference);
|
||||
|
||||
/** @var Transaction $transaction */
|
||||
$transaction = $this->createsTransaction->execute($booking, $object);
|
||||
// $cash_back_transaction = $this->createCashBackTransactionProcessor->execute($transaction);
|
||||
|
||||
if(PaymentMethodType::PAYMENT_METHODS[$request->input('payment_method')] == PaymentMethodType::PAYMENT_GATEWAY){
|
||||
$this->updatesTransactionStatus->execute($transaction, ApprovalStatus::PENDING_VERIFICATION);
|
||||
$this->bookingToVoucherifyProcessor->execute($booking->company->employees()->first(), $transaction, $booking->company->id, $configurations->getSubTotal(), $configurations->getVoucherDiscountAmount(), $voucherCode);
|
||||
|
||||
if(PaymentMethodType::PAYMENT_METHODS[$request->input('payment_method')] == PaymentMethodType::WALLET){
|
||||
$this->updatesTransactionStatus->execute($transaction, ApprovalStatus::APPROVED);
|
||||
}
|
||||
|
||||
// $this->handleVoucherCode($request, $booking, $configurations, $transaction); //todo-important: uncomment this for voucherify
|
||||
|
||||
return $this->resourceResponse(new TransactionResource($transaction));
|
||||
}
|
||||
|
||||
private function createConversionObject(Request $request, Booking $booking): CurrencyConversionObject
|
||||
{
|
||||
return new CurrencyConversionObject(
|
||||
floatval(str_replace(',', '', $request->input('amount'))),
|
||||
$booking->convertible_currency_id,
|
||||
$booking->service_id,
|
||||
$booking->fix_currency_id === 1 ? 0:1,
|
||||
PaymentMethodType::PAYMENT_METHODS[$request->input('payment_method')]
|
||||
);
|
||||
}
|
||||
|
||||
private function validatePayment(Request $request, Booking $booking, CurrencyConversionObject $conversionObject): void
|
||||
{
|
||||
$outstanding = $this->calculatesBookingOutstanding->execute($booking);
|
||||
|
||||
if($conversionObject->getAmount() > round($outstanding, 2))
|
||||
throw new MalformedRequestException('Your payment must not be greater than '. $outstanding .'.');
|
||||
}
|
||||
|
||||
private function handlePaymentMethods(Request $request, Booking $booking, CalculationObject $configurations, string $billNumber): ?string
|
||||
{
|
||||
$paymentReference = null;
|
||||
|
||||
if(PaymentMethodType::PAYMENT_METHODS[$request->input('payment_method')] == PaymentMethodType::PAYMENT_GATEWAY)
|
||||
$paymentReference = $this->handlePaymentGateway($request, $booking, $configurations, $billNumber);
|
||||
|
||||
if(PaymentMethodType::PAYMENT_METHODS[$request->input('payment_method')] == PaymentMethodType::WALLET)
|
||||
$paymentReference = $this->handleWalletPayment($request, $booking, $configurations, $billNumber);
|
||||
|
||||
return $paymentReference;
|
||||
}
|
||||
|
||||
private function handlePaymentGateway(Request $request, Booking $booking, CalculationObject $configurations, string $billNumber): string
|
||||
{
|
||||
$billPlzBill = $this->createsBillplzBill->execute(
|
||||
$booking->company->name,
|
||||
$request->user()->email,
|
||||
'This payment is made for transfer ref. '.$booking->marking,
|
||||
$configurations->getTotal(),
|
||||
$billNumber,
|
||||
$request->input('bank_code')
|
||||
);
|
||||
|
||||
return $billPlzBill->id;
|
||||
}
|
||||
|
||||
private function handleWalletPayment(Request $request, Booking $booking, CalculationObject $configurations, string $billNumber): string
|
||||
{
|
||||
$wallet = $booking->company->wallets()->first();
|
||||
|
||||
$amount = $configurations->getTotal();
|
||||
if((float) number_format(($wallet->amount - $amount),2) < 0)
|
||||
throw new MalformedRequestException('Insufficient wallet balance. Please Top up your wallet.');
|
||||
|
||||
$transactionObject = new TransactionObject($billNumber, TransactionType::PAYMENT, 1, $booking->company->id, 1, PaymentMethodType::WALLET, $amount, $amount, 1, 1, 1, 0, 0, null, ApprovalStatus::APPROVED, [], '');
|
||||
$this->createsTransaction->execute($wallet, $transactionObject);
|
||||
|
||||
$walletBalance = $this->recalculatesWalletBalance->execute($wallet);
|
||||
$this->updatesWalletBalance->execute($wallet, $walletBalance);
|
||||
|
||||
return $billNumber;
|
||||
}
|
||||
|
||||
private function createTransactionObject(Booking $booking, CalculationObject $configurations, string $billNumber, ?string $paymentReference): TransactionObject
|
||||
{
|
||||
return new TransactionObject(
|
||||
$billNumber,
|
||||
TransactionType::PAYMENT,
|
||||
1,
|
||||
$booking->company->id,
|
||||
$configurations->getConfigurations()->getBankId(),
|
||||
$configurations->getConversionObject()->getPaymentMethod(),
|
||||
$configurations->getTotal(),
|
||||
$configurations->getForeignTotal(),
|
||||
1,
|
||||
$configurations->getConversionObject()->getCurrencyId(),
|
||||
$configurations->getConfigurations()->getRate(),
|
||||
$configurations->getTax(),
|
||||
$configurations->getServiceCharge(),
|
||||
Carbon::now()->addMinutes($this->fetchesCompanyPaymentAttemptLimit->execute($booking->company)),
|
||||
ApprovalStatus::PENDING_SUBMISSION,
|
||||
[],
|
||||
$paymentReference
|
||||
);
|
||||
}
|
||||
|
||||
// private function handleVoucherCode(Request $request, Booking $booking, CalculationObject $configurations, Transaction $transaction): void
|
||||
// {
|
||||
// $voucherCode = $request->input('voucher_code');
|
||||
// if($voucherCode){
|
||||
// $employee = $booking->company->employees()->first();
|
||||
//
|
||||
// $result = $this->redeemsVoucher->execute($voucherCode, $configurations->getSubTotal(), $employee);
|
||||
// $voucher = $result->voucher;
|
||||
// $redemptionId = $result->id;
|
||||
//
|
||||
// $voucherValue = $voucher->discount->amount_off ?? ($voucher->discount->percent_off ?? 0.00);
|
||||
// $voucherObject = new VoucherObject($voucher->code, $voucher->metadata->name ?? "", $voucher->discount->type, $voucherValue);
|
||||
// $voucher = $this->createsVoucher->execute($voucherObject);
|
||||
//
|
||||
// if(!$voucher)
|
||||
// $voucher = $this->fetchesVoucher->execute(['code' => $voucherObject->getCode()]);
|
||||
//
|
||||
// $this->createsVoucherRedemption->execute($redemptionId, $voucher->id, $employee->id, $configurations->getVoucherDiscountAmount());
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
@@ -69,8 +69,11 @@ class FetchBookingPaymentQuotationLogic extends AbstractControllerLogic
|
||||
$outstanding = $this->calculatesBookingOutstanding->execute($booking);
|
||||
if($conversionObject->getAmount() > round($outstanding, 2)) throw new MalformedRequestException('Your payment must not be greater than '.$booking->fixedCurrency->short_code.' '. number_format((float)$outstanding, 2, '.', ','));
|
||||
|
||||
//Voucherify
|
||||
$voucherCode = $request->input('voucherCode');
|
||||
|
||||
return $this->response(['data' => $this->generatesBookingQuotation->execute(
|
||||
$this->fetchBookingQuotation->execute($booking->company, $conversionObject),
|
||||
$this->fetchBookingQuotation->execute($booking->company, $conversionObject, $voucherCode),
|
||||
$this->fetchesCompanyPaymentAttemptLimit->execute($booking->company),
|
||||
$conversionObject
|
||||
)]);
|
||||
@@ -78,4 +81,4 @@ class FetchBookingPaymentQuotationLogic extends AbstractControllerLogic
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,7 +84,7 @@ class UploadPurchaseOrderLogic extends AbstractControllerLogic
|
||||
|
||||
$this->createsFile->execute($document, $object);
|
||||
|
||||
if(in_array($booking->company->id, [199, 510])){
|
||||
if(!in_array($booking->company->id, [199, 510])){
|
||||
$this->createPurchaseOrderFor1688OrderProcessor->execute($booking);
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace App\Classes\Modules\Bookings\DataTransferObjects;
|
||||
use App\Classes\General\Interfaces\DataTransferObject;
|
||||
use App\Classes\Modules\Companies\DataTransferObjects\CompanyServiceConfigurationsObject;
|
||||
use App\Classes\Modules\Currencies\DataTransferObjects\CurrencyConversionObject;
|
||||
use App\Classes\Modules\Vouchers\DataTransferObjects\ValidatedVoucherObject;
|
||||
|
||||
class CalculationObject implements DataTransferObject
|
||||
{
|
||||
@@ -15,15 +16,20 @@ class CalculationObject implements DataTransferObject
|
||||
/** @var CompanyServiceConfigurationsObject */
|
||||
private $configurations;
|
||||
|
||||
/** @var ValidatedVoucherObject */
|
||||
private $voucherObject;
|
||||
|
||||
/**
|
||||
* CalculationObject constructor.
|
||||
* @param CurrencyConversionObject $conversionObject
|
||||
* @param CompanyServiceConfigurationsObject $configurations
|
||||
* @param ValidatedVoucherObject $voucherObject
|
||||
*/
|
||||
public function __construct(CurrencyConversionObject $conversionObject, CompanyServiceConfigurationsObject $configurations)
|
||||
public function __construct(CurrencyConversionObject $conversionObject, CompanyServiceConfigurationsObject $configurations, ?ValidatedVoucherObject $voucherObject = null)
|
||||
{
|
||||
$this->conversionObject = $conversionObject;
|
||||
$this->configurations = $configurations;
|
||||
$this->voucherObject = $voucherObject;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -43,6 +49,15 @@ class CalculationObject implements DataTransferObject
|
||||
return $this->configurations;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return ValidatedVoucherObject
|
||||
*/
|
||||
public function getValidatedVoucherObject(): ?ValidatedVoucherObject
|
||||
{
|
||||
return $this->voucherObject;
|
||||
}
|
||||
|
||||
public function getConvertibleTotal(){
|
||||
return $this->getConversionObject()->getType() === 1 ? $this->getConversionObject()->getAmount() : $this->getConversionTotal();
|
||||
}
|
||||
@@ -87,9 +102,31 @@ class CalculationObject implements DataTransferObject
|
||||
return ($this->getSubTotal()/100) * $this->getConfigurations()->getTax();
|
||||
}
|
||||
|
||||
public function getTotal(): float {
|
||||
return $this->getSubTotal() + $this->getTax();
|
||||
public function getVoucherDiscountAmount(): float {
|
||||
if($this->getValidatedVoucherObject()){
|
||||
return $this->getValidatedVoucherObject()->getTotalDiscountAmount();
|
||||
}
|
||||
else{
|
||||
return 0.00;
|
||||
}
|
||||
}
|
||||
|
||||
public function getVoucherCode(): string {
|
||||
if($this->getValidatedVoucherObject()){
|
||||
return $this->getValidatedVoucherObject()->getCode();
|
||||
}
|
||||
else{
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
public function getTotal(): float {
|
||||
if($this->getValidatedVoucherObject()){
|
||||
return $this->getValidatedVoucherObject()->getTotalAmount() + $this->getTax();
|
||||
}
|
||||
else{
|
||||
return $this->getSubTotal() + $this->getTax();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -7,7 +7,10 @@ use App\Classes\Exceptions\MalformedRequestException;
|
||||
use App\Classes\Modules\Bookings\DataTransferObjects\CalculationObject;
|
||||
use App\Classes\Modules\Companies\Services\FetchesCompanyServiceSettings;
|
||||
use App\Classes\Modules\Currencies\DataTransferObjects\CurrencyConversionObject;
|
||||
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\Models\Company;
|
||||
use App\Models\Currency;
|
||||
|
||||
@@ -20,25 +23,30 @@ class FetchesBookingQuotation
|
||||
/** @var FetchesCurrency */
|
||||
private $fetchesCurrency;
|
||||
|
||||
/** @var ValidatesVoucherifyVoucher */
|
||||
private $validatesVoucherifyVoucher;
|
||||
|
||||
/**
|
||||
* FetchesBookingQuotation constructor.
|
||||
* @param FetchesCompanyServiceSettings $fetchesCompanyServiceSettings
|
||||
* @param FetchesCurrency $fetchesCurrency
|
||||
*/
|
||||
public function __construct(FetchesCompanyServiceSettings $fetchesCompanyServiceSettings, FetchesCurrency $fetchesCurrency)
|
||||
public function __construct(FetchesCompanyServiceSettings $fetchesCompanyServiceSettings, FetchesCurrency $fetchesCurrency, ValidatesVoucherifyVoucher $validatesVoucherifyVoucher)
|
||||
{
|
||||
$this->fetchesCompanyServiceSettings = $fetchesCompanyServiceSettings;
|
||||
$this->fetchesCurrency = $fetchesCurrency;
|
||||
$this->validatesVoucherifyVoucher = $validatesVoucherifyVoucher;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param Company $company
|
||||
* @param CurrencyConversionObject $conversionObject
|
||||
* @param string $voucherCode
|
||||
* @return CalculationObject
|
||||
* @throws MalformedRequestException
|
||||
*/
|
||||
public function execute(Company $company, CurrencyConversionObject $conversionObject){
|
||||
public function execute(Company $company, CurrencyConversionObject $conversionObject, ?string $voucherCode = null){
|
||||
if($conversionObject->getAmount() <= 0) throw new MalformedRequestException('Your transfer must be greater than zero.');
|
||||
|
||||
$configurations = $this->fetchesCompanyServiceSettings->execute($company, $conversionObject);
|
||||
@@ -47,9 +55,24 @@ class FetchesBookingQuotation
|
||||
$currency = $this->fetchesCurrency->execute(['id' => $conversionObject->getCurrencyId()]);
|
||||
if($conversionObject->getAmount() > $configurations->getMaxLimit()) throw new MalformedRequestException('Your transfer can\'t be greater than '.number_format( floatval(str_replace(',', '', $configurations->getMaxLimit())), 2, '.', ',').' '.$currency->short_code);
|
||||
|
||||
$calculationObject = new CalculationObject($conversionObject, $configurations);
|
||||
$calculationObject = new CalculationObject($conversionObject, $configurations, null);
|
||||
|
||||
//Voucherify
|
||||
if($voucherCode){
|
||||
$employee = $company->employees()->first();
|
||||
$validateVoucherifyVoucherObject = new ValidateVoucherifyVoucherObject($company->id, $voucherCode, $calculationObject->getSubTotal(), $employee);
|
||||
$result = $this->validatesVoucherifyVoucher->execute($validateVoucherifyVoucherObject);
|
||||
$voucher = [
|
||||
"code" => $result->code,
|
||||
"discount" => property_exists($result, 'discount') ? $result->discount : null,
|
||||
"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);
|
||||
$calculationObject = new CalculationObject($conversionObject, $configurations, $validatedVoucherObject);
|
||||
}
|
||||
|
||||
return $calculationObject;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,7 +34,9 @@ class GeneratesBookingQuotation
|
||||
'total' => $calculationObject->getTotal(),
|
||||
'date' => Carbon::now()->timezone('Asia/Singapore')->format('h:i a, jS M, Y \G\M\T T'),
|
||||
'receive_date' => $receive_date,
|
||||
'payment_attempt_limit' => CarbonInterval::days($days)->hours($hours)->minutes($minutes)->forHumans()
|
||||
'payment_attempt_limit' => CarbonInterval::days($days)->hours($hours)->minutes($minutes)->forHumans(),
|
||||
'voucher_discount_amount' => $calculationObject->getVoucherDiscountAmount(),
|
||||
'voucher_code' => $calculationObject->getVoucherCode(),
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,8 +7,10 @@ use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
use App\Classes\Modules\Companies\Processors\AssignSegmentProcessor;
|
||||
use App\Classes\Modules\Companies\Services\FetchesCompany;
|
||||
use App\Classes\Modules\Segments\DataTransferObjects\SeasonalSegmentObject;
|
||||
use App\Classes\Modules\Milestones\Processors\CheckMilestonesForRewardProcessor;
|
||||
use App\Classes\Modules\Segments\Services\CreatesSeasonalSegment;
|
||||
use App\Http\Resources\CompanyResource;
|
||||
use App\Classes\ValueObjects\Constants\Milestones;
|
||||
use App\Models\SeasonalSegment;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
@@ -36,17 +38,22 @@ class AssignCompanyToSegmentLogic extends AbstractControllerLogic
|
||||
/** @var CreatesSeasonalSegment */
|
||||
private $createsSeasonalSegment;
|
||||
|
||||
/** @var CheckMilestonesForRewardProcessor */
|
||||
private $checkMilestonesForRewardProcessor;
|
||||
|
||||
/**
|
||||
* AssignCompanyToSegmentLogic constructor.
|
||||
* @param FetchesCompany $fetchesCompany
|
||||
* @param AssignSegmentProcessor $assignCompanyToSegmentProcessor
|
||||
* @param CreatesSeasonalSegment $createsSeasonalSegment
|
||||
* @param CheckMilestonesForRewardProcessor $checkMilestonesForRewardProcessor
|
||||
*/
|
||||
public function __construct(FetchesCompany $fetchesCompany, AssignSegmentProcessor $assignCompanyToSegmentProcessor, CreatesSeasonalSegment $createsSeasonalSegment)
|
||||
public function __construct(FetchesCompany $fetchesCompany, AssignSegmentProcessor $assignCompanyToSegmentProcessor, CreatesSeasonalSegment $createsSeasonalSegment, CheckMilestonesForRewardProcessor $checkMilestonesForRewardProcessor)
|
||||
{
|
||||
$this->fetchesCompany = $fetchesCompany;
|
||||
$this->assignCompanyToSegmentProcessor = $assignCompanyToSegmentProcessor;
|
||||
$this->createsSeasonalSegment = $createsSeasonalSegment;
|
||||
$this->checkMilestonesForRewardProcessor = $checkMilestonesForRewardProcessor;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -75,12 +82,16 @@ class AssignCompanyToSegmentLogic extends AbstractControllerLogic
|
||||
// }
|
||||
|
||||
$start_date = $request->input('starting_on') ? $request->input('starting_on') : Carbon::now();
|
||||
|
||||
|
||||
$seasonalSegmentObject = new SeasonalSegmentObject($company->id, $request->input('segment_id'), $start_date, $request->input('ending_on') ?? null);
|
||||
|
||||
$this->createsSeasonalSegment->execute($seasonalSegmentObject);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//cief todo: case study 3
|
||||
// $user = $company->employees()->first();
|
||||
// $this->checkMilestonesForRewardProcessor->execute($user, [Milestones::MILESTONE_3]);
|
||||
|
||||
return $this->resourceResponse(new CompanyResource($company));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+12
-1
@@ -10,9 +10,11 @@ use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject;
|
||||
use App\Classes\Modules\Documents\Services\CreatesDocument;
|
||||
use App\Classes\Modules\Documents\Services\CreatesFiles;
|
||||
use App\Classes\Modules\PerfexCRM\Processors\NewLeadTaskToPerfexCRMProcessor;
|
||||
use App\Classes\Modules\Milestones\Processors\CheckMilestonesForRewardProcessor;
|
||||
use App\Classes\ValueObjects\Constants\ApprovalStatus;
|
||||
use App\Classes\ValueObjects\Constants\CompanyType;
|
||||
use App\Classes\ValueObjects\Constants\DocumentType;
|
||||
use App\Classes\ValueObjects\Constants\Milestones;
|
||||
use App\Models\Company;
|
||||
use App\Models\Document;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
@@ -46,6 +48,9 @@ class CreateIdentificationDocumentLogic extends AbstractControllerLogic
|
||||
/** @var NewLeadTaskToPerfexCRMProcessor */
|
||||
private $newLeadTaskToPerfexCRMProcessor;
|
||||
|
||||
/** @var CheckMilestonesForRewardProcessor */
|
||||
private $checkMilestonesForRewardProcessor;
|
||||
|
||||
/**
|
||||
* CreateIdentificationDocumentLogic constructor.
|
||||
* @param FetchesCompany $fetchesCompany
|
||||
@@ -53,14 +58,16 @@ class CreateIdentificationDocumentLogic extends AbstractControllerLogic
|
||||
* @param CreatesFiles $createsFile
|
||||
* @param UpdatesCompanyStatus $updatesCompanyStatus
|
||||
* @param NewLeadTaskToPerfexCRMProcessor $newLeadTaskToPerfexCRMProcessor
|
||||
* @param CheckMilestoneForRewardProcessor $checkMilestonesForRewardProcessor
|
||||
*/
|
||||
public function __construct(FetchesCompany $fetchesCompany, CreatesDocument $createsDocument, CreatesFiles $createsFile, UpdatesCompanyStatus $updatesCompanyStatus, NewLeadTaskToPerfexCRMProcessor $newLeadTaskToPerfexCRMProcessor)
|
||||
public function __construct(FetchesCompany $fetchesCompany, CreatesDocument $createsDocument, CreatesFiles $createsFile, UpdatesCompanyStatus $updatesCompanyStatus, NewLeadTaskToPerfexCRMProcessor $newLeadTaskToPerfexCRMProcessor, CheckMilestonesForRewardProcessor $checkMilestonesForRewardProcessor)
|
||||
{
|
||||
$this->fetchesCompany = $fetchesCompany;
|
||||
$this->createsDocument = $createsDocument;
|
||||
$this->createsFile = $createsFile;
|
||||
$this->updatesCompanyStatus = $updatesCompanyStatus;
|
||||
$this->newLeadTaskToPerfexCRMProcessor = $newLeadTaskToPerfexCRMProcessor;
|
||||
$this->checkMilestonesForRewardProcessor = $checkMilestonesForRewardProcessor;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -87,6 +94,10 @@ class CreateIdentificationDocumentLogic extends AbstractControllerLogic
|
||||
$this->newLeadTaskToPerfexCRMProcessor->execute($company);
|
||||
}
|
||||
|
||||
//cief todo: case study 2
|
||||
// $user = $company->employees()->first();
|
||||
// $this->checkMilestonesForRewardProcessor->execute($user, [Milestones::MILESTONE_2]);
|
||||
|
||||
return $this->response([]);
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ class FileObject implements DataTransferObject
|
||||
*/
|
||||
public function getData()
|
||||
{
|
||||
return in_array($this->getExtension(), ['pdf', 'excel']) ? $this->data : (new imageManager())->make($this->data);
|
||||
return in_array($this->getExtension(), ['pdf', 'excel', 'text']) ? $this->data : (new imageManager())->make($this->data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -66,7 +66,7 @@ class FileObject implements DataTransferObject
|
||||
*/
|
||||
public function getDecodedData(): string
|
||||
{
|
||||
return in_array($this->getExtension(), ['pdf', 'excel']) ?
|
||||
return in_array($this->getExtension(), ['pdf', 'excel', 'text']) ?
|
||||
base64_decode((explode('base64,', $this->getData()))[1]):
|
||||
$this->getData()->encode('data-url')->encoded;
|
||||
}
|
||||
@@ -83,4 +83,4 @@ class FileObject implements DataTransferObject
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ class ConvertsBase64ToFile
|
||||
foreach ($files as $file) {
|
||||
|
||||
$object = new FileObject($file);
|
||||
in_array($object->getExtension(), ['pdf', 'excel']) ? $this->generatePDF($object) : $this->generateImage($object);
|
||||
in_array($object->getExtension(), ['pdf', 'excel', 'text']) ? $this->generatePDF($object) : $this->generateImage($object);
|
||||
|
||||
}
|
||||
|
||||
@@ -122,4 +122,4 @@ class ConvertsBase64ToFile
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,149 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Exports\Services;
|
||||
|
||||
use App\Classes\ValueObjects\Constants\ApprovalStatus;
|
||||
use App\Classes\ValueObjects\Constants\StatementTransactionOwnerType;
|
||||
use App\Models\StatementTransactionOwner;
|
||||
use App\Models\Transaction;
|
||||
use Maatwebsite\Excel\Concerns\Exportable;
|
||||
use Maatwebsite\Excel\Concerns\FromQuery;
|
||||
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadingRow;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
use Maatwebsite\Excel\Concerns\WithMapping;
|
||||
use Illuminate\Http\Request;
|
||||
use Carbon\Carbon;
|
||||
use App\Classes\Modules\Accounting\Processors\ListShippingPortalTransactions;
|
||||
use App\Classes\ValueObjects\Constants\ShippingTransactionType;
|
||||
use App\Classes\ValueObjects\Constants\TransactionType;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class ExportsInvoiceTransactions implements FromQuery, WithHeadings, WithHeadingRow, WithMapping, ShouldAutoSize
|
||||
{
|
||||
use Exportable;
|
||||
|
||||
private $request;
|
||||
private $counter = 1;
|
||||
|
||||
public function __construct(Request $request)
|
||||
{
|
||||
$this->request = $request;
|
||||
}
|
||||
|
||||
public function headings(): array
|
||||
{
|
||||
return [
|
||||
'DocNo',
|
||||
'DocDate',
|
||||
'DebtorCode',
|
||||
'Ref',
|
||||
'DebtorName',
|
||||
'CurrencyCode',
|
||||
'ShipInfo',
|
||||
'ItemCode',
|
||||
'DetailDescription',
|
||||
'FurtherDescription',
|
||||
'Qty',
|
||||
'UnitPrice',
|
||||
'AccNo',
|
||||
'DeptNo'
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Illuminate\Support\Collection|mixed
|
||||
*/
|
||||
public function query()
|
||||
{
|
||||
return StatementTransactionOwner::whereNull('invoice_reference')
|
||||
->whereIn('type', [StatementTransactionOwnerType::SALES, StatementTransactionOwnerType::WALLET_TOP_UP])
|
||||
->whereIn('status', [ApprovalStatus::COMPLETED, ApprovalStatus::APPROVED]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Transaction $transaction
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function map($transaction): array
|
||||
{
|
||||
$logArray = [
|
||||
'counter' => $this->counter,
|
||||
'system' => $transaction->system,
|
||||
'StatementTransactionOwner_id' => $transaction->id,
|
||||
'transaction_table_id' => $transaction->owner_id,
|
||||
];
|
||||
$this->counter += 1;
|
||||
$logArray = json_encode($logArray);
|
||||
|
||||
$filePath = storage_path('logs/exports_invoice_transactions.log');
|
||||
$errorFilePath = storage_path('logs/exports_invoice_transactions_error.log');
|
||||
$textToAppend = Carbon::now()->format('[Y-m-d H:i:s]') . ' ' . $logArray . PHP_EOL;
|
||||
file_put_contents($filePath, $textToAppend, FILE_APPEND);
|
||||
|
||||
if ($transaction->system == 'EXCHANGE') {
|
||||
$row = (App()->make($transaction->owner_type))->where('id', $transaction->owner_id)->first();
|
||||
$company = $row->type === TransactionType::PAYMENT ? $row->owner->company : $row->owner->owner;
|
||||
|
||||
$booking = $row->owner;
|
||||
|
||||
return [
|
||||
'<<New>>',
|
||||
$row->updated_at->format('m/d/Y H:m'),
|
||||
$company->debtor,
|
||||
$row->type === TransactionType::PAYMENT ? $booking->marking : $company->reference,
|
||||
'',
|
||||
'MYR',
|
||||
$row->type === TransactionType::PAYMENT ? $booking->marking : $row->bill_no,
|
||||
$row->type === TransactionType::PAYMENT ? '' : 'W1',
|
||||
$row->type === TransactionType::PAYMENT ? 'PLEASE REFER TO THE ATTACHED APPENDIX REF ' . $booking->marking : 'CREDIT SALES',
|
||||
'',
|
||||
1,
|
||||
round($row->amount, 2),
|
||||
'500-0000',
|
||||
'CIEF'
|
||||
];
|
||||
} else {
|
||||
$row = (App()->make(ListShippingPortalTransactions::class))->execute([
|
||||
'id' => $transaction->owner_id,
|
||||
'with_company' => true,
|
||||
]);
|
||||
|
||||
if (empty($row) || $row[0]['status'] != 'success') {
|
||||
$textToAppend = Carbon::now()->format('[Y-m-d H:i:s]') . ' Fetch Shipping Transaction Fail ' . json_encode([
|
||||
'id' => $transaction->owner_id,
|
||||
'with_company' => true,
|
||||
'StatementTransactionOwner_id' => $transaction->id,
|
||||
]) . PHP_EOL;
|
||||
file_put_contents($errorFilePath, $textToAppend, FILE_APPEND);
|
||||
|
||||
$textToAppend = Carbon::now()->format('[Y-m-d H:i:s]') . ' Shipping Portal Respnose ' . json_encode($row) . PHP_EOL;
|
||||
file_put_contents($errorFilePath, $textToAppend, FILE_APPEND);
|
||||
|
||||
Log::info('Error in Exports Invoice Transactions ' . $this->counter);
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
$row = $row[0];
|
||||
|
||||
return [
|
||||
'<<New>>',
|
||||
Carbon::parse($row['updated_at'])->format('m/d/Y H:m'),
|
||||
$row['debtor_code'],
|
||||
$row['type'] === ShippingTransactionType::PAYMENT ? $row['order_reference'] : $row['marking'],
|
||||
'',
|
||||
'MYR',
|
||||
$row['type'] === ShippingTransactionType::PAYMENT ? $row['order_reference'] : $row['bill_no'],
|
||||
$row['type'] === ShippingTransactionType::PAYMENT ? '' : 'W1',
|
||||
$row['type'] === ShippingTransactionType::PAYMENT ? 'PLEASE REFER TO THE ATTACHED APPENDIX REF `' . $row['order_reference'] : 'CREDIT SALES',
|
||||
'',
|
||||
1,
|
||||
round($row['amount'], 2),
|
||||
'500-0000',
|
||||
'CIEF'
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -32,6 +32,7 @@ class ExportsPaymentTransactions implements FromQuery, WithHeadings, WithHeading
|
||||
'DocNo',
|
||||
'DocDate',
|
||||
'DebtorCode',
|
||||
'Ref',
|
||||
'DebtorName',
|
||||
'CurrencyCode',
|
||||
'ShipInfo',
|
||||
@@ -67,7 +68,7 @@ class ExportsPaymentTransactions implements FromQuery, WithHeadings, WithHeading
|
||||
|
||||
if($start_date && $end_date) {
|
||||
$query->whereBetween('created_at', [
|
||||
Carbon::parse($start_date)->format('Y-m-d 0:00:00'),
|
||||
Carbon::parse($start_date)->format('Y-m-d 0:00:00'),
|
||||
Carbon::parse($end_date)->format('Y-m-d 23:59:59')
|
||||
]);
|
||||
}
|
||||
@@ -95,6 +96,7 @@ class ExportsPaymentTransactions implements FromQuery, WithHeadings, WithHeading
|
||||
'<<New>>',
|
||||
$transaction->updated_at->format('m/d/Y H:m'),
|
||||
$company->debtor,
|
||||
$booking->marking,
|
||||
'',
|
||||
'MYR',
|
||||
$booking->marking,
|
||||
@@ -107,4 +109,4 @@ class ExportsPaymentTransactions implements FromQuery, WithHeadings, WithHeading
|
||||
'CIEF'
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Imports\Services;
|
||||
|
||||
use App\Models\AccountStatement;
|
||||
use App\Models\StatementAccount;
|
||||
use App\Models\StatementTransaction;
|
||||
use Illuminate\Support\Collection;
|
||||
use Maatwebsite\Excel\Concerns\ToCollection;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadingRow;
|
||||
|
||||
class BankStatementImport implements ToCollection, WithHeadingRow
|
||||
{
|
||||
public function collection(Collection $rows)
|
||||
{
|
||||
$accountNumber = null;
|
||||
|
||||
foreach ($rows as $row) {
|
||||
if ($row->has('account_number')) {
|
||||
// If the row has an account number, create a new statement account
|
||||
$accountNumber = $row->get('account_number');
|
||||
$accountType = $row->get('account_type');
|
||||
$accountName = $row->get('account_name');
|
||||
$accountCurrency = $row->get('account_currency');
|
||||
|
||||
$account = StatementAccount::updateOrCreate(
|
||||
['number' => $accountNumber],
|
||||
[
|
||||
'type' => $accountType,
|
||||
'name' => $accountName,
|
||||
'currency' => $accountCurrency,
|
||||
]
|
||||
);
|
||||
} else {
|
||||
// Otherwise, create a new statement transaction for the current statement account
|
||||
$dateFrom = $row->get('date_from');
|
||||
$dateTo = $row->get('date_to');
|
||||
$totalAmount = $row->get('total_amount');
|
||||
$beginBalance = $row->get('begin_balance');
|
||||
$endBalance = $row->get('end_balance');
|
||||
|
||||
$statement = AccountStatement::updateOrCreate(
|
||||
[
|
||||
'account_id' => $account->id,
|
||||
'date_from' => $dateFrom,
|
||||
'date_to' => $dateTo,
|
||||
],
|
||||
[
|
||||
'total_amount' => $totalAmount,
|
||||
'begin_balance' => $beginBalance,
|
||||
'end_balance' => $endBalance,
|
||||
]
|
||||
);
|
||||
|
||||
$transactionDate = $row->get('transaction_date');
|
||||
$transactionTime = $row->get('transaction_time');
|
||||
$postingDate = $row->get('posting_date');
|
||||
$transactionDescription = $row->get('transaction_description');
|
||||
$transactionRef = $row->get('transaction_ref');
|
||||
$amount = $row->get('amount');
|
||||
$tellerId = $row->get('teller_id');
|
||||
$branchChannel = $row->get('branch_channel');
|
||||
$transactionCode = $row->get('transaction_code');
|
||||
|
||||
$transaction = new StatementTransaction([
|
||||
'statement_id' => $statement->id,
|
||||
'transaction_date' => $transactionDate,
|
||||
'transaction_time' => $transactionTime,
|
||||
'posting_date' => $postingDate,
|
||||
'transaction_description' => $transactionDescription,
|
||||
'transaction_ref' => $transactionRef,
|
||||
'amount' => $amount,
|
||||
'teller_id' => $tellerId,
|
||||
'branch_channel' => $branchChannel,
|
||||
'transaction_code' => $transactionCode,
|
||||
]);
|
||||
|
||||
$transaction->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\ControllersLogic;
|
||||
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
use App\Classes\Modules\Rewards\Services\FetchesReward;
|
||||
use App\Classes\Modules\Milestones\Processors\CreateMilestoneProcessor;
|
||||
use App\Classes\Modules\Milestones\Processors\AssignRewardProcessor;
|
||||
use App\Classes\Modules\Milestones\DataTransferObjects\AchievementObject;
|
||||
use App\Http\Resources\MilestoneResource;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\Reward;
|
||||
|
||||
class CreateMilestoneLogic extends AbstractControllerLogic
|
||||
{
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function notification():array {
|
||||
return [
|
||||
'title' => 'Create Milestone',
|
||||
'message' => 'You have successfully created a milestone'
|
||||
];
|
||||
}
|
||||
|
||||
/** @var FetchesReward */
|
||||
private $fetchesReward;
|
||||
|
||||
/** @var CreateMilestoneProcessor */
|
||||
private $createMilestoneProcessor;
|
||||
|
||||
/** @var AssignRewardProcessor */
|
||||
private $assignRewardProcessor;
|
||||
|
||||
/**
|
||||
* CreateMilestoneLogic constructor.
|
||||
*/
|
||||
public function __construct(CreateMilestoneProcessor $createMilestoneProcessor, FetchesReward $fetchesReward, AssignRewardProcessor $assignRewardProcessor)
|
||||
{
|
||||
$this->createMilestoneProcessor = $createMilestoneProcessor;
|
||||
$this->fetchesReward = $fetchesReward;
|
||||
$this->assignRewardProcessor = $assignRewardProcessor;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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
|
||||
{
|
||||
$milestone = $this->createMilestoneProcessor->execute($request);
|
||||
|
||||
//Extra checking to make sure that each reward exists
|
||||
$rewardIds = $request->input('reward_ids');
|
||||
foreach ($rewardIds as $rewardId) {
|
||||
/** @var Reward $reward */
|
||||
$this->fetchesReward->execute(['id' => $rewardId]);
|
||||
}
|
||||
|
||||
$object = new AchievementObject($milestone, $rewardIds);
|
||||
$this->assignRewardProcessor->execute($object);
|
||||
|
||||
return $this->resourceResponse(new MilestoneResource($milestone));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\ControllersLogic;
|
||||
|
||||
use App\Http\Resources\MilestoneResource;
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
|
||||
use App\Classes\Modules\Milestones\Services\FetchesMilestone;
|
||||
|
||||
use App\Classes\Modules\Milestones\Standards\Rules\CanDeleteMilestone;
|
||||
use App\Classes\Modules\Milestones\Services\DeletesMilestone;
|
||||
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class DeleteMilestoneLogic extends AbstractControllerLogic
|
||||
{
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function notification():array {
|
||||
return [
|
||||
'title' => 'Delete Milestone',
|
||||
'message' => 'You have successfully deleted the Milestone'
|
||||
];
|
||||
}
|
||||
|
||||
/** @var CanDeleteMilestone */
|
||||
private $canDeleteMilestone;
|
||||
|
||||
/** @var DeletesMilestone */
|
||||
private $deletesMilestone;
|
||||
|
||||
/** @var FetchesMilestone */
|
||||
private $fetchesMiestone;
|
||||
|
||||
|
||||
/**
|
||||
* DeleteMilestoneLogic constructor.
|
||||
* @param CanDeleteMilestone $canDeleteMilestone
|
||||
* @param DeletesMilestone $deletesMilestone
|
||||
* @param FetchesMilestone $fetchesMiestone
|
||||
*/
|
||||
public function __construct(
|
||||
CanDeleteMilestone $canDeleteMilestone,
|
||||
DeletesMilestone $deletesMilestone,
|
||||
FetchesMilestone $fetchesMiestone
|
||||
)
|
||||
{
|
||||
$this->canDeleteMilestone = $canDeleteMilestone;
|
||||
$this->deletesMilestone = $deletesMilestone;
|
||||
$this->fetchesMiestone = $fetchesMiestone;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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
|
||||
{
|
||||
|
||||
$query = $this->fetchesMiestone->execute(['id' => $request->route('id')]);
|
||||
$this->canDeleteMilestone->passes();
|
||||
$this->deletesMilestone->execute($query);
|
||||
|
||||
return $this->resourceResponse(new MilestoneResource($query));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\ControllersLogic;
|
||||
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
use App\Classes\Modules\Milestones\Services\ListsMilestoneProgress;
|
||||
use App\Http\Resources\MilestoneProgressResource;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ListMilestoneProgressLogic extends AbstractControllerLogic
|
||||
{
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function notification():array {
|
||||
return [
|
||||
'title' => 'Retrieved Milestone Progress',
|
||||
'message' => 'You have successfully retrieved a list of Milestone Progress'
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
/** @var ListsMilestoneProgress */
|
||||
private $listsMilestoneProgress;
|
||||
|
||||
/**
|
||||
* ListMilestoneProgressLogic constructor.
|
||||
* @param ListsMilestoneProgress $listsMilestoneProgress
|
||||
*/
|
||||
public function __construct(ListsMilestoneProgress $listsMilestoneProgress)
|
||||
{
|
||||
$this->listsMilestoneProgress = $listsMilestoneProgress;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
* @throws \App\Classes\Exceptions\MalformedRequestException
|
||||
*/
|
||||
public function logic(Request $request) : JsonResponse
|
||||
{
|
||||
$query = $this->listsMilestoneProgress->execute($this->listsMilestoneProgress->deserializeFilters($request->input('filters')));
|
||||
|
||||
return $this->collectionResponse(MilestoneProgressResource::collection($query));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\ControllersLogic;
|
||||
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
use App\Classes\Modules\Milestones\Services\ListsMilestones;
|
||||
use App\Http\Resources\MilestoneResource;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ListMilestonesLogic extends AbstractControllerLogic
|
||||
{
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function notification():array {
|
||||
return [
|
||||
'title' => 'Retrieved Milestones',
|
||||
'message' => 'You have successfully retrieved a list of Milestones'
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
/** @var ListsMilestones */
|
||||
private $listsMilestones;
|
||||
|
||||
/**
|
||||
* ListMilestonesLogic constructor.
|
||||
* @param ListsMilestones $listsMilestones
|
||||
*/
|
||||
public function __construct(ListsMilestones $listsMilestones)
|
||||
{
|
||||
$this->listsMilestones = $listsMilestones;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
* @throws \App\Classes\Exceptions\MalformedRequestException
|
||||
*/
|
||||
public function logic(Request $request) : JsonResponse
|
||||
{
|
||||
$query = $this->listsMilestones->execute($this->listsMilestones->deserializeFilters($request->input('filters')));
|
||||
|
||||
return $this->collectionResponse(MilestoneResource::collection($query));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\ControllersLogic;
|
||||
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
use App\Classes\Modules\Rewards\Services\FetchesReward;
|
||||
use App\Classes\Modules\Milestones\Processors\UpdateMilestoneProcessor;
|
||||
use App\Classes\Modules\Milestones\Processors\AssignRewardProcessor;
|
||||
use App\Classes\Modules\Milestones\DataTransferObjects\AchievementObject;
|
||||
use App\Http\Resources\MilestoneResource;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\Reward;
|
||||
|
||||
class UpdateMilestoneLogic extends AbstractControllerLogic
|
||||
{
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function notification():array {
|
||||
return [
|
||||
'title' => 'Update Milestone',
|
||||
'message' => 'You have successfully updated a milestone'
|
||||
];
|
||||
}
|
||||
|
||||
/** @var FetchesReward */
|
||||
private $fetchesReward;
|
||||
|
||||
/** @var UpdateMilestoneProcessor */
|
||||
private $updateMilestoneProcessor;
|
||||
|
||||
/** @var AssignRewardProcessor */
|
||||
private $assignRewardProcessor;
|
||||
|
||||
/**
|
||||
* UpdateMilestoneLogic constructor.
|
||||
* @param UpdateMilestoneProcessor $updateMilestoneProcessor
|
||||
* @param FetchesReward $fetchesReward
|
||||
* @param AssignRewardProcessor $assignRewardProcessor
|
||||
*/
|
||||
public function __construct(UpdateMilestoneProcessor $updateMilestoneProcessor, FetchesReward $fetchesReward, AssignRewardProcessor $assignRewardProcessor)
|
||||
{
|
||||
$this->updateMilestoneProcessor = $updateMilestoneProcessor;
|
||||
$this->fetchesReward = $fetchesReward;
|
||||
$this->assignRewardProcessor = $assignRewardProcessor;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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
|
||||
{
|
||||
$milestone = $this->updateMilestoneProcessor->execute($request);
|
||||
|
||||
//Extra checking to make sure that each reward exists
|
||||
$rewardIds = $request->input('reward_ids');
|
||||
foreach ($rewardIds as $rewardId) {
|
||||
/** @var Reward $reward */
|
||||
$this->fetchesReward->execute(['id' => $rewardId]);
|
||||
}
|
||||
|
||||
$object = new AchievementObject($milestone, $rewardIds);
|
||||
$this->assignRewardProcessor->execute($object);
|
||||
|
||||
return $this->resourceResponse(new MilestoneResource($milestone));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\DataTransferObjects;
|
||||
|
||||
use App\Classes\General\Interfaces\DataTransferObject;
|
||||
use App\Models\Milestone;
|
||||
|
||||
class AchievementObject implements DataTransferObject
|
||||
{
|
||||
/** @var Milestone */
|
||||
private $milestone;
|
||||
|
||||
/** @var array */
|
||||
private $rewardIds;
|
||||
|
||||
/**
|
||||
* AchievementObject constructor.
|
||||
* @param Milestone $milestone
|
||||
* @param array $reward
|
||||
*/
|
||||
public function __construct(Milestone $milestone, array $rewardIds)
|
||||
{
|
||||
$this->milestone = $milestone;
|
||||
$this->rewardIds = $rewardIds;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Milestone
|
||||
*/
|
||||
public function getMilestone(): Milestone
|
||||
{
|
||||
return $this->milestone;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getRewardIds(): array
|
||||
{
|
||||
return $this->rewardIds;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\DataTransferObjects;
|
||||
|
||||
use App\Classes\General\Interfaces\DataTransferObject;
|
||||
|
||||
class MilestoneObject implements DataTransferObject
|
||||
{
|
||||
/** @var int */
|
||||
private $id;
|
||||
|
||||
/** @var string */
|
||||
private $name;
|
||||
|
||||
/** @var string */
|
||||
private $description;
|
||||
|
||||
/**
|
||||
* MilestoneObject constructor.
|
||||
* @param int $id
|
||||
* @param string $name
|
||||
* @param string $description
|
||||
*/
|
||||
public function __construct(int $id, string $name, string $description)
|
||||
{
|
||||
$this->id = $id;
|
||||
$this->name = $name;
|
||||
$this->description = $description;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getId(): int
|
||||
{
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getName(): string
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getDescription(): string
|
||||
{
|
||||
return $this->description;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\Processors;
|
||||
|
||||
use App\Classes\Modules\Milestones\Services\AssignsReward;
|
||||
use App\Classes\Modules\Milestones\Standards\Rules\CanAssignReward;
|
||||
use App\Classes\Modules\Milestones\DataTransferObjects\AchievementObject;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class AssignRewardProcessor
|
||||
{
|
||||
|
||||
/** @var CanAssignReward */
|
||||
private $canAssignReward;
|
||||
|
||||
/** @var AssignsReward */
|
||||
private $assignsReward;
|
||||
|
||||
/**
|
||||
* AssignRewardProcessor constructor.
|
||||
* @param CanAssignReward $canAssignReward
|
||||
* @param AssignsReward $assignsReward
|
||||
*/
|
||||
public function __construct(CanAssignReward $canAssignReward, AssignsReward $assignsReward)
|
||||
{
|
||||
$this->canAssignReward = $canAssignReward;
|
||||
$this->assignsReward = $assignsReward;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param AchievementObject $object
|
||||
* @return Model
|
||||
* @throws \App\Classes\Exceptions\AccessForbiddenException
|
||||
* @throws \App\Classes\Exceptions\MalformedRequestException
|
||||
* @throws \App\Classes\Exceptions\RequestValidationException
|
||||
*/
|
||||
public function execute(AchievementObject $object): Model {
|
||||
|
||||
$this->canAssignReward->passes($object);
|
||||
|
||||
return $this->assignsReward->execute($object);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,170 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\Processors;
|
||||
|
||||
use App\Classes\Modules\Vouchers\Services\Voucherify\CreatesVoucherifyVoucher;
|
||||
use App\Classes\Modules\Vouchers\Services\CreatesVoucher;
|
||||
use App\Classes\Modules\Vouchers\Services\FetchesVoucher;
|
||||
use App\Classes\Modules\Vouchers\Services\Voucherify\FetchesVoucherifyVoucher;
|
||||
use App\Classes\Modules\Vouchers\Services\Voucherify\ValidatesVoucherifyVoucher;
|
||||
use App\Classes\Modules\Vouchers\DataTransferObjects\ValidateVoucherifyVoucherObject;
|
||||
use App\Classes\Modules\Vouchers\DataTransferObjects\VoucherObject;
|
||||
use App\Classes\Modules\Milestones\Services\FetchesMilestone;
|
||||
use App\Classes\Modules\Milestones\Services\CreatesMilestoneProgress;
|
||||
use App\Classes\Modules\Rewards\Services\CreatesUserReward;
|
||||
use App\Classes\ValueObjects\Constants\RewardType;
|
||||
use App\Models\Milestone;
|
||||
use App\Models\MilestoneProgress;
|
||||
use App\Models\Reward;
|
||||
use App\Models\User;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class CheckMilestonesForRewardProcessor
|
||||
{
|
||||
/** @var CreatesVoucherifyVoucher */
|
||||
private $createsVoucherifyVoucher;
|
||||
|
||||
/** @var CreatesVoucher */
|
||||
private $createsVoucher;
|
||||
|
||||
/** @var CreatesMilestoneProgress */
|
||||
private $createsMilestoneProgress;
|
||||
|
||||
/** @var FetchesMilestone */
|
||||
private $fetchesMilestone;
|
||||
|
||||
/** @var CreatesUserReward */
|
||||
private $createsUserReward;
|
||||
|
||||
/** @var FetchesVoucherifyVoucher */
|
||||
private $fetchesVoucherifyVoucher;
|
||||
|
||||
/** @var FetchesVoucher */
|
||||
private $fetchesVoucher;
|
||||
|
||||
/** @var ValidatesVoucherifyVoucher */
|
||||
private $validatesVoucherifyVoucher;
|
||||
|
||||
/**
|
||||
* CheckMilestonesForRewardProcessor constructor.
|
||||
* @param CreatesVoucherifyVoucher $createsVoucherifyVoucher
|
||||
* @param CreatesVoucher $createsVoucher
|
||||
* @param FetchesMilestone $fetchesMilestone
|
||||
* @param CreatesMilestoneProgress $createsMilestoneProgress
|
||||
* @param CreatesUserReward $createsUserReward
|
||||
* @param FetchesVoucherifyVoucher $fetchesVoucherifyVoucher
|
||||
* @param FetchesVoucher $fetchesVoucher
|
||||
* @param ValidatesVoucherifyVoucher $validatesVoucherifyVoucher
|
||||
*/
|
||||
public function __construct(CreatesVoucherifyVoucher $createsVoucherifyVoucher, CreatesVoucher $createsVoucher, FetchesMilestone $fetchesMilestone, CreatesMilestoneProgress $createsMilestoneProgress, CreatesUserReward $createsUserReward, FetchesVoucherifyVoucher $fetchesVoucherifyVoucher, FetchesVoucher $fetchesVoucher, ValidatesVoucherifyVoucher $validatesVoucherifyVoucher)
|
||||
{
|
||||
$this->createsVoucherifyVoucher = $createsVoucherifyVoucher;
|
||||
$this->createsVoucher = $createsVoucher;
|
||||
$this->fetchesMilestone = $fetchesMilestone;
|
||||
$this->createsMilestoneProgress = $createsMilestoneProgress;
|
||||
$this->createsUserReward = $createsUserReward;
|
||||
$this->fetchesVoucherifyVoucher = $fetchesVoucherifyVoucher;
|
||||
$this->fetchesVoucher = $fetchesVoucher;
|
||||
$this->validatesVoucherifyVoucher = $validatesVoucherifyVoucher;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param User $user
|
||||
* @param array $milestone_constants
|
||||
* @return void
|
||||
* @throws \App\Classes\Exceptions\MalformedRequestException
|
||||
* @throws \Voucherify\ClientException
|
||||
*/
|
||||
public function execute(User $user, array $milestone_constants)
|
||||
{
|
||||
try{
|
||||
foreach($milestone_constants as $constant)
|
||||
{
|
||||
//update milestone progress
|
||||
/** @var Milestone $milestone */
|
||||
$milestone = $this->fetchesMilestone->execute(['name' => $constant]);
|
||||
$result = null;
|
||||
if($user->milestoneProgress->count() > 0){
|
||||
$result = $user->milestoneProgress->where('milestone_id', $milestone->id)->first();
|
||||
}
|
||||
|
||||
if(!$result){
|
||||
$result = $this->createsMilestoneProgress->execute($milestone, $user->id);
|
||||
}
|
||||
|
||||
if($result){
|
||||
//fetch completed miletones
|
||||
$completedMilestones = MilestoneProgress::where('user_id', $user->id)->pluck('milestone_id');
|
||||
$rewards = $milestone->rewards;
|
||||
|
||||
//check for rewards that have a corresponding milestone count
|
||||
if(count($rewards) > 0){
|
||||
$this->checkMilestoneForReward($user, $completedMilestones, $rewards);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
Log::error($e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param User $user
|
||||
* @param object $completedMilestones
|
||||
* @param object $rewards
|
||||
* @return void
|
||||
*/
|
||||
private function checkMilestoneForReward(User $user, object $completedMilestones, object $rewards)
|
||||
{
|
||||
$milestoneIds = $rewards[0]->milestones->pluck('id');
|
||||
if ($milestoneIds->intersect($completedMilestones)->count() >= count($rewards[0]->milestones)) {
|
||||
/** @var Reward $reward */
|
||||
foreach ($rewards as $reward) {
|
||||
$result = null;
|
||||
if (!$user->rewards->contains('reward_id', $reward->id)) {
|
||||
$voucherId = 0;
|
||||
$voucherName = '';
|
||||
$voucherType = "";
|
||||
if($reward->type == RewardType::REWARD_AMOUNT){
|
||||
//Voucherify - Create Voucher
|
||||
$result = $this->createsVoucherifyVoucher->execute($user, intval($reward->value));
|
||||
}
|
||||
else{
|
||||
//Voucherify - Validates Voucher
|
||||
$ValidateVoucherifyVoucherObject = new ValidateVoucherifyVoucherObject(0, $reward->value, 0.00, $user);
|
||||
$voucherifyVoucherValidated = $this->validatesVoucherifyVoucher->execute($ValidateVoucherifyVoucherObject);
|
||||
|
||||
if(!isset($voucherifyVoucherValidated->reason)){
|
||||
//Voucherify - Get Voucher
|
||||
$result = $this->fetchesVoucherifyVoucher->execute($user, $reward->value);
|
||||
}
|
||||
}
|
||||
|
||||
if($result && !isset($result->reason)){
|
||||
$voucherName = isset($result->campaign) ? $result->campaign : $reward->name;
|
||||
$voucherType = $result->discount->type;
|
||||
$voucherValue = isset($result->discount->amount_off) ? $result->discount->amount_off : $result->discount->percent_off;
|
||||
$voucherStartDate = $result->start_date;
|
||||
$voucherEndDate = $result->expiration_date;
|
||||
|
||||
//create voucher
|
||||
$voucherObject = new VoucherObject($result->code, isset($voucherName) ? $voucherName : "", $voucherType, $voucherValue, $voucherStartDate, $voucherEndDate);
|
||||
$voucher = $this->createsVoucher->execute($voucherObject);
|
||||
if(!$voucher) $voucher = $this->fetchesVoucher->execute(['code' => $voucherObject->getCode()]);
|
||||
$voucherId = $voucher->id;
|
||||
|
||||
//create reward to user (user_reward)
|
||||
$voucherCount = $user->rewards->where('voucher_id', $voucher->id)->count();
|
||||
if($voucherCount == 0){
|
||||
$this->createsUserReward->execute($reward, $user, $voucherId);
|
||||
}
|
||||
}
|
||||
else{
|
||||
Log::info('CheckMilestonesForRewardProcessor: no voucher fetched or created for reward '. json_encode($reward));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\Processors;
|
||||
|
||||
use App\Classes\Modules\Milestones\DataTransferObjects\MilestoneObject;
|
||||
use App\Classes\Modules\Milestones\Services\CreatesMilestone;
|
||||
use App\Classes\Modules\Milestones\Standards\Rules\CanCreateMilestone;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class CreateMilestoneProcessor
|
||||
{
|
||||
/** @var CreatesMilestone */
|
||||
private $createsMilestone;
|
||||
|
||||
/** @var CanCreateMilestone */
|
||||
private $canCreateMilestone;
|
||||
|
||||
/**
|
||||
* CreateMilestoneProcessor constructor.
|
||||
* @param CreatesMilestone $createsMilestone
|
||||
* @param CanCreateMilestone $canCreateMilestone
|
||||
*/
|
||||
public function __construct(CanCreateMilestone $canCreateMilestone, CreatesMilestone $createsMilestone)
|
||||
{
|
||||
$this->canCreateMilestone = $canCreateMilestone;
|
||||
$this->createsMilestone = $createsMilestone;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @return Model
|
||||
* @throws \App\Classes\Exceptions\AccessForbiddenException
|
||||
* @throws \App\Classes\Exceptions\MalformedRequestException
|
||||
* @throws \App\Classes\Exceptions\RequestValidationException
|
||||
*/
|
||||
public function execute(Request $request): Model
|
||||
{
|
||||
$userMilestoneObject = new MilestoneObject(
|
||||
$request->input('id'),
|
||||
$request->input('name'),
|
||||
$request->input('description')
|
||||
);
|
||||
|
||||
$this->canCreateMilestone->passes($userMilestoneObject);
|
||||
|
||||
return $this->createsMilestone->execute($userMilestoneObject);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\Processors;
|
||||
|
||||
use App\Classes\Modules\Milestones\DataTransferObjects\MilestoneObject;
|
||||
use App\Classes\Modules\Milestones\Services\FetchesMilestone;
|
||||
use App\Classes\Modules\Milestones\Services\UpdatesMilestone;
|
||||
use App\Classes\Modules\Milestones\Standards\Rules\CanUpdateMilestone;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class UpdateMilestoneProcessor
|
||||
{
|
||||
/** @var UpdatesMilestone */
|
||||
private $updatesMilestone;
|
||||
|
||||
/** @var FetchesMilestone */
|
||||
private $fetchesMilestone;
|
||||
|
||||
/** @var CanUpdateMilestone */
|
||||
private $canUpdateMilestone;
|
||||
|
||||
/**
|
||||
* UpdateMilestoneProcessor constructor.
|
||||
* @param UpdatesMilestone $updatesMilestone
|
||||
* @param FetchesMilestone $fetchesMilestone
|
||||
* @param CanUpdateMilestone $canUpdateMilestone
|
||||
*/
|
||||
public function __construct(CanUpdateMilestone $canUpdateMilestone, UpdatesMilestone $updatesMilestone, FetchesMilestone $fetchesMilestone)
|
||||
{
|
||||
$this->canUpdateMilestone = $canUpdateMilestone;
|
||||
$this->updatesMilestone = $updatesMilestone;
|
||||
$this->fetchesMilestone = $fetchesMilestone;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @return Model
|
||||
* @throws \App\Classes\Exceptions\AccessForbiddenException
|
||||
* @throws \App\Classes\Exceptions\MalformedRequestException
|
||||
* @throws \App\Classes\Exceptions\RequestValidationException
|
||||
*/
|
||||
public function execute(Request $request): Model
|
||||
{
|
||||
$milestoneObject = new MilestoneObject(
|
||||
$request->input('id'),
|
||||
$request->input('name'),
|
||||
$request->input('description')
|
||||
);
|
||||
|
||||
$this->canUpdateMilestone->passes($milestoneObject);
|
||||
|
||||
$milestone = $this->fetchesMilestone->execute(['id' => $request->route('id')]);
|
||||
|
||||
return $this->updatesMilestone->execute($milestone, $milestoneObject);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\Services;
|
||||
|
||||
use App\Classes\Exceptions\MalformedRequestException;
|
||||
use App\Classes\General\Eloquent\AbstractUpdateRecord;
|
||||
use App\Classes\Modules\Milestones\DataTransferObjects\AchievementObject;
|
||||
use Illuminate\Database\QueryException;
|
||||
|
||||
class AssignsReward extends AbstractUpdateRecord
|
||||
{
|
||||
/**
|
||||
* @param AchievementObject $object
|
||||
* @return \Illuminate\Database\Eloquent\Model
|
||||
* @throws MalformedRequestException
|
||||
*/
|
||||
public function execute(AchievementObject $object)
|
||||
{
|
||||
try {
|
||||
// $object->getMilestone()->rewards()->attach($object->getReward()->id);
|
||||
$object->getMilestone()->rewards()->sync($object->getRewardIds());
|
||||
|
||||
return $object->getMilestone();
|
||||
|
||||
} catch (QueryException $exception){
|
||||
throw new MalformedRequestException($exception);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\Services;
|
||||
|
||||
use App\Models\MilestoneProgress;
|
||||
|
||||
class CheckIfMilestoneProgressExists
|
||||
{
|
||||
|
||||
/** @var MilestoneProgress */
|
||||
private $repository;
|
||||
|
||||
|
||||
/**
|
||||
* CheckIfMilestoneProgressExists constructor.
|
||||
* @param MilestoneProgress $repository
|
||||
*/
|
||||
public function __construct(MilestoneProgress $repository)
|
||||
{
|
||||
$this->repository = $repository;
|
||||
}
|
||||
|
||||
public function execute(int $user_id, int $milestone_id): bool {
|
||||
return $this->repository->where('user_id', $user_id)->where('milestone_id', $milestone_id)->exists();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\Services;
|
||||
|
||||
use App\Classes\General\Eloquent\AbstractUpdateRecord;
|
||||
use App\Classes\Modules\Milestones\DataTransferObjects\MilestoneObject;
|
||||
use App\Models\Milestone;
|
||||
|
||||
class CreatesMilestone extends AbstractUpdateRecord
|
||||
{
|
||||
/**
|
||||
* @param MilestoneObject $object
|
||||
* @return \Illuminate\Database\Eloquent\Model
|
||||
* @throws \App\Classes\Exceptions\AccessForbiddenException
|
||||
* @throws \App\Classes\Exceptions\MalformedRequestException
|
||||
* @throws \App\Classes\Exceptions\RequestValidationException
|
||||
*/
|
||||
public function execute(MilestoneObject $object) {
|
||||
$model = new Milestone();
|
||||
$model->name = $object->getName();
|
||||
$model->description = $object->getDescription();
|
||||
|
||||
return $this->handler($model);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\Services;
|
||||
|
||||
use App\Classes\General\Eloquent\AbstractUpdateRelationshipRecord;
|
||||
use App\Models\Milestone;
|
||||
use App\Models\MilestoneProgress;
|
||||
|
||||
class CreatesMilestoneProgress extends AbstractUpdateRelationshipRecord
|
||||
{
|
||||
/** @var CheckIfMilestoneProgressExists */
|
||||
private $isMilestoneProgressExists;
|
||||
|
||||
/**
|
||||
* CreatesMilestoneProgress constructor.
|
||||
* @param CheckIfMilestoneProgressExists $isMilestoneProgressExists
|
||||
*/
|
||||
public function __construct(CheckIfMilestoneProgressExists $isMilestoneProgressExists)
|
||||
{
|
||||
$this->isMilestoneProgressExists = $isMilestoneProgressExists;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param Milestone $milestone
|
||||
* @param string $userId
|
||||
* @return \Illuminate\Database\Eloquent\Model|null
|
||||
*/
|
||||
public function execute(Milestone $milestone, string $userId) {
|
||||
if(!$this->isMilestoneProgressExists->execute($userId, $milestone->id))
|
||||
{
|
||||
$model = new MilestoneProgress();
|
||||
$model->user_id = $userId;
|
||||
|
||||
return $this->handler($milestone->progress(), $model);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\Services;
|
||||
|
||||
use App\Classes\General\Eloquent\AbstractDeleteRecord;
|
||||
use App\Models\Milestone;
|
||||
|
||||
class DeletesMilestone extends AbstractDeleteRecord
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Milestone $model
|
||||
* @return mixed
|
||||
* @throws \App\Classes\Exceptions\MalformedRequestException
|
||||
*/
|
||||
public function execute(Milestone $model) {
|
||||
return $this->handler($model);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\Services;
|
||||
|
||||
|
||||
use App\Classes\General\Eloquent\AbstractFetchRecord;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use App\Models\Milestone;
|
||||
|
||||
class FetchesMilestone extends AbstractFetchRecord
|
||||
{
|
||||
|
||||
/** @var Milestone */
|
||||
private $repository;
|
||||
|
||||
|
||||
/**
|
||||
* FetchesMilestone constructor.
|
||||
* @param Milestone $repository
|
||||
*/
|
||||
public function __construct(Milestone $repository)
|
||||
{
|
||||
$this->repository = $repository;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return Builder
|
||||
*/
|
||||
public function getRepository(): Builder
|
||||
{
|
||||
return $this->repository->newQuery();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\Services;
|
||||
|
||||
|
||||
use App\Classes\General\Eloquent\AbstractListRecord;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use App\Models\MilestoneProgress;
|
||||
|
||||
class ListsMilestoneProgress extends AbstractListRecord
|
||||
{
|
||||
|
||||
/** @var MilestoneProgress */
|
||||
private $repository;
|
||||
|
||||
/**
|
||||
* ListsMilestoneProgress constructor.
|
||||
* @param MilestoneProgress $repository
|
||||
*/
|
||||
public function __construct(MilestoneProgress $repository)
|
||||
{
|
||||
$this->repository = $repository;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return Builder
|
||||
*/
|
||||
function getRepository(): Builder
|
||||
{
|
||||
return $this->repository->newQuery();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\Services;
|
||||
|
||||
|
||||
use App\Classes\General\Eloquent\AbstractListRecord;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use App\Models\Milestone;
|
||||
|
||||
class ListsMilestones extends AbstractListRecord
|
||||
{
|
||||
|
||||
/** @var Milestone */
|
||||
private $repository;
|
||||
|
||||
/**
|
||||
* ListsMilestones constructor.
|
||||
* @param Milestone $repository
|
||||
*/
|
||||
public function __construct(Milestone $repository)
|
||||
{
|
||||
$this->repository = $repository;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return Builder
|
||||
*/
|
||||
function getRepository(): Builder
|
||||
{
|
||||
return $this->repository->newQuery();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\Services;
|
||||
|
||||
use App\Classes\General\Eloquent\AbstractUpdateRecord;
|
||||
use App\Classes\Modules\Milestones\DataTransferObjects\MilestoneObject;
|
||||
use App\Models\Milestone;
|
||||
|
||||
class UpdatesMilestone extends AbstractUpdateRecord
|
||||
{
|
||||
/**
|
||||
* @param Milestone $model
|
||||
* @param MilestoneObject $object
|
||||
* @return \Illuminate\Database\Eloquent\Model
|
||||
* @throws \App\Classes\Exceptions\MalformedRequestException
|
||||
*/
|
||||
public function execute(Milestone $model, MilestoneObject $object)
|
||||
{
|
||||
$model->name = $object->getName();
|
||||
$model->description = $object->getDescription();
|
||||
|
||||
return $this->handler($model);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\Standards\Rules;
|
||||
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractRule;
|
||||
use App\Classes\Modules\Milestones\Standards\Validators\MilestoneRewardValidation;
|
||||
use App\Classes\Modules\Milestones\DataTransferObjects\AchievementObject;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class CanAssignReward extends AbstractRule
|
||||
{
|
||||
|
||||
/** @var MilestoneRewardValidation */
|
||||
private $milestoneRewardValidation;
|
||||
|
||||
|
||||
/**
|
||||
* CanAssignReward constructor.
|
||||
* @param MilestoneRewardValidation $milestoneRewardValidation
|
||||
*/
|
||||
public function __construct(MilestoneRewardValidation $milestoneRewardValidation)
|
||||
{
|
||||
$this->milestoneRewardValidation = $milestoneRewardValidation;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
protected function authorized(): bool
|
||||
{
|
||||
if (!Auth::user()->can('edit milestone')) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param AchievementObject $object
|
||||
* @return bool
|
||||
* @throws \App\Classes\Exceptions\RequestValidationException
|
||||
*/
|
||||
protected function validators($object): bool
|
||||
{
|
||||
return $this->milestoneRewardValidation->validate($object);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param AchievementObject $object
|
||||
* @return bool
|
||||
*/
|
||||
protected function criteria($object): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\Standards\Rules;
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractRule;
|
||||
use App\Classes\Modules\Milestones\Standards\Validators\MilestoneValidation;
|
||||
use App\Classes\Modules\Milestones\DataTransferObjects\MilestoneObject;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class CanCreateMilestone extends AbstractRule
|
||||
{
|
||||
|
||||
/** @var MilestoneValidation */
|
||||
private $milestoneValidation;
|
||||
|
||||
/**
|
||||
* CanCreateMilestone constructor.
|
||||
* @param MilestoneValidation $milestoneValidation
|
||||
*/
|
||||
public function __construct(MilestoneValidation $milestoneValidation)
|
||||
{
|
||||
$this->milestoneValidation = $milestoneValidation;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
protected function authorized(): bool
|
||||
{
|
||||
if (!Auth::user()->can('add milestone')) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param MilestoneObject $object
|
||||
* @return bool
|
||||
* @throws \App\Classes\Exceptions\RequestValidationException
|
||||
*/
|
||||
protected function validators($object): bool
|
||||
{
|
||||
return $this->milestoneValidation->validate($object, 'POST');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param MilestoneObject $object
|
||||
* @return bool
|
||||
*/
|
||||
protected function criteria($object): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\Standards\Rules;
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractRule;
|
||||
use App\Classes\Modules\Milestones\DataTransferObjects\MilestoneObject;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class CanDeleteMilestone extends AbstractRule
|
||||
{
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
protected function authorized(): bool
|
||||
{
|
||||
if (!Auth::user()->can('delete milestone')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param MilestoneObject $object
|
||||
* @return bool
|
||||
*/
|
||||
protected function validators($object): bool
|
||||
{
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param MilestoneObject $object
|
||||
* @return bool
|
||||
*/
|
||||
protected function criteria($object): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\Standards\Rules;
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractRule;
|
||||
use App\Classes\Modules\Milestones\DataTransferObjects\MilestoneObject;
|
||||
use App\Classes\Modules\Milestones\Standards\Validators\MilestoneValidation;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class CanUpdateMilestone extends AbstractRule
|
||||
{
|
||||
/** @var MilestoneValidation */
|
||||
private $milestoneValidation;
|
||||
|
||||
|
||||
/**
|
||||
* CanUpdateMilestone constructor.
|
||||
* @param MilestoneValidation $milestoneValidation
|
||||
*/
|
||||
public function __construct(MilestoneValidation $milestoneValidation)
|
||||
{
|
||||
$this->milestoneValidation = $milestoneValidation;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
protected function authorized(): bool
|
||||
{
|
||||
if (!Auth::user()->can('edit milestone')) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param MilestoneObject $object
|
||||
* @return bool
|
||||
* @throws \App\Classes\Exceptions\RequestValidationException
|
||||
*/
|
||||
protected function validators($object): bool
|
||||
{
|
||||
return $this->milestoneValidation->validate($object, 'PUT');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param MilestoneObject $object
|
||||
* @return bool
|
||||
*/
|
||||
protected function criteria($object): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\Standards\Validators;
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractValidation;
|
||||
use App\Classes\Modules\Milestones\DataTransferObjects\AchievementObject;
|
||||
|
||||
class MilestoneRewardValidation extends AbstractValidation
|
||||
{
|
||||
/**
|
||||
* @param AchievementObject $object
|
||||
* @return array
|
||||
*/
|
||||
protected function data($object): array
|
||||
{
|
||||
return [
|
||||
'milestone_id' => $object->getMilestone()->id,
|
||||
'reward_ids' => $object->getRewardIds()
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function rules(): array
|
||||
{
|
||||
return [
|
||||
'milestone_id' => 'required',
|
||||
'reward_ids' => 'required',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function messages(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Milestones\Standards\Validators;
|
||||
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractValidation;
|
||||
use App\Classes\Modules\Milestones\DataTransferObjects\MilestoneObject;
|
||||
use App\Models\Milestone;
|
||||
|
||||
class MilestoneValidation extends AbstractValidation
|
||||
{
|
||||
/**
|
||||
* @param MilestoneObject $object
|
||||
* @return array
|
||||
*/
|
||||
protected function data($object): array {
|
||||
|
||||
$data = [
|
||||
'name'=> $object->getName(),
|
||||
'description' => $object->getDescription(),
|
||||
];
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param null|string $type
|
||||
* @return array
|
||||
*/
|
||||
protected function rules(?string $type = 'POST'): array {
|
||||
if ($type == 'POST') { //crete
|
||||
return [
|
||||
'name' => [
|
||||
'required',
|
||||
function ($attribute, $value, $fail) {
|
||||
// Check if milestone name already exists in the database
|
||||
$existingMilestone = Milestone::where('name', $value)->first();
|
||||
if ($existingMilestone) {
|
||||
$fail("The {$attribute} milestone name already exists in the database.");
|
||||
}
|
||||
},
|
||||
],
|
||||
'description' => [
|
||||
'required',
|
||||
]
|
||||
];
|
||||
|
||||
}
|
||||
elseif($type == 'PUT') { //update
|
||||
return [
|
||||
'name' => [
|
||||
'required',
|
||||
],
|
||||
'description' => [
|
||||
'required',
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function messages(): array {
|
||||
return [];
|
||||
}
|
||||
|
||||
}
|
||||
@@ -44,8 +44,7 @@ class FetchesPerfexCRMTask
|
||||
|
||||
return (object) $data;
|
||||
}else{
|
||||
// Log::error($response);
|
||||
Helper::debugLoggerForPerfexCRM($response);
|
||||
Helper::debugLogger($response);
|
||||
return null;
|
||||
}
|
||||
}catch(\Exception $exception){
|
||||
|
||||
@@ -38,8 +38,7 @@ class UpdatesPerfexCRMCustomer
|
||||
$data = $response->json();
|
||||
return (object) $data;
|
||||
}else{
|
||||
// Log::error($response);
|
||||
Helper::debugLoggerForPerfexCRM($response);
|
||||
Helper::debugLogger($response);
|
||||
return null;
|
||||
}
|
||||
}catch(\Exception $exception){
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Rewards\ControllersLogic;
|
||||
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
use App\Classes\Modules\Rewards\Services\CreatesReward;
|
||||
use App\Classes\Modules\Rewards\DataTransferObjects\RewardObject;
|
||||
use App\Classes\Modules\Rewards\Standards\Rules\CanCreateReward;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class CreateRewardLogic extends AbstractControllerLogic
|
||||
{
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function notification():array {
|
||||
return [
|
||||
'title' => 'Create/Update Reward',
|
||||
'message' => 'You have successfully created/updated a reward'
|
||||
];
|
||||
}
|
||||
|
||||
/** @var CreatesReward */
|
||||
private $createsReward;
|
||||
|
||||
/** @var CanCreateReward */
|
||||
private $canCreateReward;
|
||||
|
||||
/**
|
||||
* CreateRewardLogic constructor.
|
||||
*/
|
||||
public function __construct(CreatesReward $createsMilestone, CanCreateReward $canCreateReward)
|
||||
{
|
||||
$this->createsReward = $createsMilestone;
|
||||
$this->canCreateReward = $canCreateReward;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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
|
||||
{
|
||||
$userRewardObject = new RewardObject(
|
||||
$request->input('id'),
|
||||
$request->input('name'),
|
||||
$request->input('description'),
|
||||
$request->input('value'),
|
||||
$request->input('type'),
|
||||
$request->input('is_active'),
|
||||
$request->input('order'),
|
||||
);
|
||||
|
||||
$this->canCreateReward->passes($userRewardObject);
|
||||
|
||||
$result = $this->createsReward->execute($userRewardObject);
|
||||
|
||||
return $this->response(['data' => $result]);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Rewards\ControllersLogic;
|
||||
|
||||
use App\Http\Resources\RewardResource;
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
|
||||
use App\Classes\Modules\Rewards\Services\FetchesReward;
|
||||
|
||||
use App\Classes\Modules\Rewards\Standards\Rules\CanDeleteReward;
|
||||
use App\Classes\Modules\Rewards\Services\DeletesReward;
|
||||
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class DeleteRewardLogic extends AbstractControllerLogic
|
||||
{
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function notification():array {
|
||||
return [
|
||||
'title' => 'Delete Reward',
|
||||
'message' => 'You have successfully deleted the Reward'
|
||||
];
|
||||
}
|
||||
|
||||
/** @var CanDeleteReward */
|
||||
private $canDeleteReward;
|
||||
|
||||
/** @var DeletesReward */
|
||||
private $deletesReward;
|
||||
|
||||
/** @var FetchesReward */
|
||||
private $fetchesReward;
|
||||
|
||||
|
||||
/**
|
||||
* DeleteRewardLogic constructor.
|
||||
* @param CanDeleteReward $canDeleteReward
|
||||
* @param DeletesReward $deletesReward
|
||||
* @param FetchesReward $fetchesReward
|
||||
*/
|
||||
public function __construct(
|
||||
CanDeleteReward $canDeleteReward,
|
||||
DeletesReward $deletesReward,
|
||||
FetchesReward $fetchesReward
|
||||
)
|
||||
{
|
||||
$this->canDeleteReward = $canDeleteReward;
|
||||
$this->deletesReward = $deletesReward;
|
||||
$this->fetchesReward = $fetchesReward;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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
|
||||
{
|
||||
|
||||
$query = $this->fetchesReward->execute(['id' => $request->route('id')]);
|
||||
$this->canDeleteReward->passes();
|
||||
$this->deletesReward->execute($query);
|
||||
|
||||
return $this->resourceResponse(new RewardResource($query));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Rewards\ControllersLogic;
|
||||
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
use App\Classes\Modules\Rewards\Services\ListsRewards;
|
||||
use App\Http\Resources\RewardDetailsResource;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ListRewardsDetailsLogic extends AbstractControllerLogic
|
||||
{
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function notification():array {
|
||||
return [
|
||||
'title' => 'Retrieved Rewards Details',
|
||||
'message' => 'You have successfully retrieved a list of Rewards Details'
|
||||
];
|
||||
}
|
||||
|
||||
/** @var ListsRewards */
|
||||
private $listsRewards;
|
||||
|
||||
/**
|
||||
* ListRewardsDetailsLogic constructor.
|
||||
* @param ListsRewards $listsRewards
|
||||
*/
|
||||
public function __construct(ListsRewards $listsRewards)
|
||||
{
|
||||
$this->listsRewards = $listsRewards;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
* @throws \App\Classes\Exceptions\MalformedRequestException
|
||||
*/
|
||||
public function logic(Request $request) : JsonResponse
|
||||
{
|
||||
$query = $this->listsRewards->execute($this->listsRewards->deserializeFilters($request->input('filters')));
|
||||
|
||||
return $this->collectionResponse(RewardDetailsResource::collection($query));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Rewards\ControllersLogic;
|
||||
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
use App\Classes\Modules\Rewards\Services\ListsRewards;
|
||||
use App\Http\Resources\RewardResource;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ListRewardsLogic extends AbstractControllerLogic
|
||||
{
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function notification():array {
|
||||
return [
|
||||
'title' => 'Retrieved Rewards',
|
||||
'message' => 'You have successfully retrieved a list of Rewards'
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
/** @var ListsRewards */
|
||||
private $listsRewards;
|
||||
|
||||
/**
|
||||
* ListRewardsLogic constructor.
|
||||
* @param ListsRewards $listsRewards
|
||||
*/
|
||||
public function __construct(ListsRewards $listsRewards)
|
||||
{
|
||||
$this->listsRewards = $listsRewards;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
* @throws \App\Classes\Exceptions\MalformedRequestException
|
||||
*/
|
||||
public function logic(Request $request) : JsonResponse
|
||||
{
|
||||
$query = $this->listsRewards->execute($this->listsRewards->deserializeFilters($request->input('filters')));
|
||||
|
||||
return $this->collectionResponse(RewardResource::collection($query));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Rewards\DataTransferObjects;
|
||||
|
||||
use App\Classes\General\Interfaces\DataTransferObject;
|
||||
|
||||
class RewardObject implements DataTransferObject
|
||||
{
|
||||
/** @var int */
|
||||
private $id;
|
||||
|
||||
/** @var string */
|
||||
private $name;
|
||||
|
||||
/** @var string */
|
||||
private $description;
|
||||
|
||||
/** @var string */
|
||||
private $value;
|
||||
|
||||
/** @var string */
|
||||
private $type;
|
||||
|
||||
/** @var bool */
|
||||
private $isActive;
|
||||
|
||||
/** @var int */
|
||||
private $order;
|
||||
|
||||
/**
|
||||
* RewardObject constructor.
|
||||
* @param int $id
|
||||
* @param string $name
|
||||
* @param string $description
|
||||
* @param string $value
|
||||
* @param string $type
|
||||
* @param bool $isActive
|
||||
* @param int $order
|
||||
*/
|
||||
public function __construct(int $id, string $name, string $description, string $value, string $type, bool $isActive = true, ?int $order = 9999)
|
||||
{
|
||||
$this->id = $id;
|
||||
$this->name = $name;
|
||||
$this->description = $description;
|
||||
$this->value = $value;
|
||||
$this->type = $type;
|
||||
$this->isActive = $isActive;
|
||||
$this->order = $order;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getId(): int
|
||||
{
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getName(): string
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getDescription(): string
|
||||
{
|
||||
return $this->description;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getValue(): string
|
||||
{
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getType(): string
|
||||
{
|
||||
return $this->type;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function getIsActive(): bool
|
||||
{
|
||||
return $this->isActive;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getOrder(): int
|
||||
{
|
||||
return $this->order ?? 9999;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Rewards\Services;
|
||||
|
||||
use App\Classes\General\Eloquent\AbstractUpdateRecord;
|
||||
use App\Classes\Modules\Rewards\DataTransferObjects\RewardObject;
|
||||
use App\Models\Reward;
|
||||
use App\Classes\Exceptions\MalformedRequestException;
|
||||
use Illuminate\Database\QueryException;
|
||||
|
||||
class CreatesReward extends AbstractUpdateRecord
|
||||
{
|
||||
/**
|
||||
* @param RewardObject $object
|
||||
* @return \Illuminate\Database\Eloquent\Model
|
||||
* @throws \App\Classes\Exceptions\MalformedRequestException
|
||||
*/
|
||||
public function execute(RewardObject $object) {
|
||||
|
||||
// $model = new Reward();
|
||||
// $model->name = $object->getName();
|
||||
// $model->description = $object->getDescription();
|
||||
// $model->value = $object->getValue();
|
||||
// $model->type = $object->getType();
|
||||
// $model->is_active = $object->getIsActive();
|
||||
// return $this->handler($model);
|
||||
|
||||
try{
|
||||
$data = [
|
||||
'id' => $object->getId(),
|
||||
'name' => $object->getName(),
|
||||
'description' => $object->getDescription(),
|
||||
'value' => $object->getValue(),
|
||||
'type' => $object->getType(),
|
||||
'is_active' => $object->getIsActive(),
|
||||
'order' => $object->getOrder(),
|
||||
];
|
||||
|
||||
return Reward::upsert([$data], ['id'], ['name', 'description', 'value', 'type', 'is_active', 'order']);
|
||||
|
||||
} catch (QueryException $exception){
|
||||
throw new MalformedRequestException($exception);
|
||||
}
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user