crm changes

This commit is contained in:
edmondlang
2023-06-12 20:41:46 +08:00
parent 4218a4e398
commit 1591cb9162
11 changed files with 403 additions and 125 deletions
+16 -14
View File
@@ -10,7 +10,8 @@ use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\UpdatePerfexCRMObject;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\UpdatePerfexCRMInvoiceObject;
use Illuminate\Support\Facades\Log;
use PhpOffice\PhpSpreadsheet\Calculation\Logical\Boolean;
class UpdatePerfexCRM implements ShouldQueue
{
@@ -19,38 +20,39 @@ class UpdatePerfexCRM implements ShouldQueue
/** @var UpdatePerfexCRMObject */
private $updatePerfexCRMObject;
/** @var UpdatePerfexCRMInvoice */
private $nextJob;
/** @var */
/** @var */
private $transaction;
/** @var Boolean|null */
private $shouldCreateInvoice;
/**
* UpdatePerfexCRM constructor.
* @param UpdatePerfexCRMObject $updatePerfexCRMObject
* @param UpdatePerfexCRMInvoice $nextJob
* @param $transaction
* @param bool|null $shouldCreateInvoice
*/
public function __construct(UpdatePerfexCRMObject $updatePerfexCRMObject, $transaction, $nextJob)
public function __construct(UpdatePerfexCRMObject $updatePerfexCRMObject, $transaction, ?bool $shouldCreateInvoice = false)
{
$this->updatePerfexCRMObject = $updatePerfexCRMObject;
$this->nextJob = $nextJob;
$this->transaction = $transaction;
$this->shouldCreateInvoice = $shouldCreateInvoice;
}
public function handle()
{
$result = (App()->make(UpdatePerfexCRMProcessor::class))->execute($this->updatePerfexCRMObject);
/** @var UpdatePerfexCRMInvoice $nextJob*/
if($this->nextJob != null && $this->transaction != null){
$updatePerfexCRMInvoiceOject = new UpdatePerfexCRMInvoiceObject(
if($this->transaction != null && $this->shouldCreateInvoice){
$updatePerfexCRMInvoiceObject = new UpdatePerfexCRMInvoiceObject(
$this->updatePerfexCRMObject->getContactEmail(),
$this->updatePerfexCRMObject->getProjectName(),
$result->projectId,
$this->transaction,
true,
true
);
$this->nextJob::dispatch($updatePerfexCRMInvoiceOject);
UpdatePerfexCRMInvoice::dispatch($updatePerfexCRMInvoiceObject);
}
}
}
+3 -2
View File
@@ -30,7 +30,7 @@ class UpdatePerfexCRMInvoice implements ShouldQueue
/**
* CreatePerfexCRMSingleTask constructor.
* @param UpdatePerfexCRMInvoiceObject $createTaskPerfexCRMObject
* @param UpdatePerfexCRMInvoiceObject $updatePerfexCRMInvoiceObject
*/
public function __construct(UpdatePerfexCRMInvoiceObject $updatePerfexCRMInvoiceObject)
{
@@ -65,7 +65,8 @@ class UpdatePerfexCRMInvoice implements ShouldQueue
$invoiceId = $result->payload['id'];
} else {
// Log::error(json_encode('UpdatePerfexCRMInvoice CreatePerfexCRMInvoiceProcessor failed'));
Helper::debugLoggerForPerfexCRM('UpdatePerfexCRMInvoice CreatePerfexCRMInvoiceProcessor failed');
$log['message'] = 'UpdatePerfexCRMInvoice CreatePerfexCRMInvoiceProcessor failed';
Helper::debugLoggerForPerfexCRM($log);
}
}
else{
+34 -34
View File
@@ -21,50 +21,28 @@ class UpdatePerfexCRMPrelude implements ShouldQueue
/** @var UpdatePerfexCRMObject */
private $updatePerfexCRMObject;
/** @var UpdatePerfexCRM */
private $nextJob1;
/** @var UpdatePerfexCRMInvoice */
private $nextJob2;
/** @var Boolean|null */
private $shouldCreateInvoice;
/**
* UpdatePerfexCRMPrelude constructor.
* @param Transaction $transaction
* @param UpdatePerfexCRMObject $updatePerfexCRMObject
* @param UpdatePerfexCRM $nextJob1
* @param UpdatePerfexCRMInvoice $nextJob2
* @param bool|null $shouldCreateInvoice
*/
public function __construct(Transaction $transaction, UpdatePerfexCRMObject $updatePerfexCRMObject, $nextJob1, $nextJob2)
public function __construct(Transaction $transaction, UpdatePerfexCRMObject $updatePerfexCRMObject, ?bool $shouldCreateInvoice = false)
{
$this->transaction = $transaction;
$this->updatePerfexCRMObject = $updatePerfexCRMObject;
$this->nextJob1 = $nextJob1;
$this->nextJob2 = $nextJob2;
$this->shouldCreateInvoice = $shouldCreateInvoice;
}
public function handle()
{
$serviceTypeName = $this->transaction->owner->company->services()->where('id', $this->transaction->owner->service_id)->first()->name;
$booking = $this->transaction->booking;
$bank = $booking->bank;
$bankDetails = $this->transaction->owner->service_id == 4 ?
[
'1688_username' => $bank->account_no,
'1688_password' => $bank->holder_name,
'payment_pin' => $bank->bank_branch,
]:
[
'id' => $bank->id,
'type' => $bank->type,
'reference' => $bank->reference,
'bank_name' => $bank->bank_name,
'bank_branch' => $bank->bank_branch,
'holder_name' => $bank->holder_name,
'account_no' => $bank->account_no,
'country_id' => $bank->country_id,
'default' => $bank->default,
'status' => $bank->status,
];
$bankDetails = $this->generateBankDetails($booking->bank);
$data = [
'amount' => number_format($this->transaction->amount, 2, '.', ''),
'currency' => $this->transaction->currency_id == 1 ? "MYR" : "CNY",
@@ -75,14 +53,36 @@ class UpdatePerfexCRMPrelude implements ShouldQueue
'link_autocount_or' => 'https://docs.google.com/spreadsheets/d/1Q3rJBGQ9Bo04HZp5WR9zbLp7pIW2kfDYsabxG7JON-4/edit#gid=2013983170',
];
$result = $this->replacePlaceholders($this->updatePerfexCRMObject->getTasks(), $data);
$this->updatePerfexCRMObject->setTasks($result);
/** @var UpdatePerfexCRM $nextJob1 */
/** @var UpdatePerfexCRMInvoice $nextJob2 */
$this->nextJob1::dispatch($this->updatePerfexCRMObject, $this->transaction, $this->nextJob2);
UpdatePerfexCRM::dispatch($this->updatePerfexCRMObject, $this->transaction, $this->shouldCreateInvoice);
}
private function generateBankDetails($bank): array
{
return $this->transaction->owner->service_id == 4 ?
[
'1688_username' => $bank->account_no,
'1688_password' => $bank->holder_name,
'payment_pin' => $bank->bank_branch,
]:
[
'id' => $bank->id,
'type' => $bank->type,
'reference' => $bank->reference,
'bank_name' => $bank->bank_name,
'bank_branch' => $bank->bank_branch,
'holder_name' => $bank->holder_name,
'account_no' => $bank->account_no,
'country_id' => $bank->country_id,
'default' => $bank->default,
'status' => $bank->status,
];
}
function replacePlaceholders($template, $data, $prefix = '')
{
foreach ($template as $key => $value) {
@@ -17,6 +17,7 @@ use App\Classes\Modules\PerfexCRM\Processors\BookingToPerfexCRMProcessor;
use App\Http\Resources\BookingResource;
use App\Models\Booking;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@@ -82,6 +83,7 @@ class CreateBookingLogic extends AbstractControllerLogic
$this->canCreateBooking->passes($object);
/** @var Booking $booking */
$booking = $this->createsBooking->execute($company, $object);
if(config('perfexcrm.is_enabled') == 'true'){
@@ -5,27 +5,29 @@ 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\UpdatesTransaction;
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\Http\Resources\TransactionResource;
use App\Classes\Modules\Transactions\Processors\CreateCashBackTransactionProcessor;
use App\Models\Booking;
use App\Models\Transaction;
use App\Models\Wallet;
use Carbon\Carbon;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@@ -34,6 +36,7 @@ use App\Classes\Modules\Wallets\Services\RecalculatesWalletBalance;
class CreateBookingPaymentLogic extends AbstractControllerLogic
{
/**
* @return array
*/
@@ -68,14 +71,24 @@ 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;
/**
* CreateBookingPaymentLogic constructor.
* @param FetchesBookingQuotation $fetchBookingQuotation
* @param FetchesCompanyPaymentAttemptLimit $fetchesCompanyPaymentAttemptLimit
* @param GeneratesTransactionBillNumber $generatesTransactionBillNumber
@@ -84,10 +97,13 @@ class CreateBookingPaymentLogic extends AbstractControllerLogic
* @param CreatesBillplzBill $createsBillplzBill
* @param UpdatesWalletBalance $updatesWalletBalance
* @param UpdatesTransactionStatus $updatesTransactionStatus
* @param CreateCashBackTransactionProcessor $createCashBackTransactionProcessor
* @param RecalculatesWalletBalance $recalculatesWalletBalance
* @param FetchesVoucher $fetchesVoucher
* @param CreatesVoucher $createsVoucher
* @param CreatesVoucherRedemption $createsVoucherRedemption
* @param RedeemsVoucher $redeemsVoucher
*/
public function __construct(FetchesBookingQuotation $fetchBookingQuotation, FetchesCompanyPaymentAttemptLimit $fetchesCompanyPaymentAttemptLimit, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CreatesTransaction $createsTransaction, CalculatesBookingOutstanding $calculatesBookingOutstanding, CreatesBillplzBill $createsBillplzBill, UpdatesWalletBalance $updatesWalletBalance, UpdatesTransactionStatus $updatesTransactionStatus, CreateCashBackTransactionProcessor $createCashBackTransactionProcessor, RecalculatesWalletBalance $recalculatesWalletBalance)
public function __construct(FetchesBookingQuotation $fetchBookingQuotation, FetchesCompanyPaymentAttemptLimit $fetchesCompanyPaymentAttemptLimit, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CreatesTransaction $createsTransaction, CalculatesBookingOutstanding $calculatesBookingOutstanding, CreatesBillplzBill $createsBillplzBill, UpdatesWalletBalance $updatesWalletBalance, UpdatesTransactionStatus $updatesTransactionStatus, RecalculatesWalletBalance $recalculatesWalletBalance, FetchesVoucher $fetchesVoucher, CreatesVoucher $createsVoucher, CreatesVoucherRedemption $createsVoucherRedemption, RedeemsVoucher $redeemsVoucher)
{
$this->fetchBookingQuotation = $fetchBookingQuotation;
$this->fetchesCompanyPaymentAttemptLimit = $fetchesCompanyPaymentAttemptLimit;
@@ -97,75 +113,146 @@ class CreateBookingPaymentLogic extends AbstractControllerLogic
$this->createsBillplzBill = $createsBillplzBill;
$this->updatesWalletBalance = $updatesWalletBalance;
$this->updatesTransactionStatus = $updatesTransactionStatus;
$this->createCashBackTransactionProcessor = $createCashBackTransactionProcessor;
$this->recalculatesWalletBalance = $recalculatesWalletBalance;
$this->fetchesVoucher = $fetchesVoucher;
$this->createsVoucher = $createsVoucher;
$this->createsVoucherRedemption = $createsVoucherRedemption;
$this->redeemsVoucher = $redeemsVoucher;
}
/**
* @param Request $request
* @return JsonResponse
* @throws MalformedRequestException
*/
public function logic(Request $request) : JsonResponse
{
$booking = Booking::find($request->route('id'));
$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')]);
$conversionObject = $this->createConversionObject($request, $booking);
$outstanding = $this->calculatesBookingOutstanding->execute($booking);
$this->validatePayment($request, $booking, $conversionObject);
if($conversionObject->getAmount() > round($outstanding, 2)) throw new MalformedRequestException('Your payment must not be greater than '. $outstanding .'.');
$configurations = $this->fetchBookingQuotation->execute($booking->company, $conversionObject);
$paymentAttemptLimit = $this->fetchesCompanyPaymentAttemptLimit->execute($booking->company);
$configurations = $this->fetchBookingQuotation->execute($booking->company, $conversionObject, $request->input('voucher_code'));
$billNumber = $this->generatesTransactionBillNumber->execute('PYMT-');
$paymentReference = null;
$paymentReference = $this->handlePaymentMethods($request, $booking, $configurations, $billNumber);
$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);
$object = $this->createTransactionObject($booking, $configurations, $billNumber, $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::WALLET){
$this->updatesTransactionStatus->execute($transaction, ApprovalStatus::APPROVED);
if(PaymentMethodType::PAYMENT_METHODS[$request->input('payment_method')] == PaymentMethodType::PAYMENT_GATEWAY){
$this->updatesTransactionStatus->execute($transaction, ApprovalStatus::PENDING_VERIFICATION);
}
// $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());
}
}
}
@@ -2,6 +2,7 @@
namespace App\Classes\Modules\PerfexCRM\Processors;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\UpdatePerfexCRMObject;
use App\Classes\Jobs\UpdatePerfexCRM;
use App\Models\Booking;
@@ -11,10 +12,10 @@ class BookingToPerfexCRMProcessor
{
/**
* @param Booking $booking
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
* @return bool
* @throws MalformedRequestException
*/
public function execute(Booking $booking)
public function execute(Booking $booking): bool
{
$companyReference = $booking->company->reference;
$companyName = $booking->company->name;
@@ -37,6 +38,7 @@ class BookingToPerfexCRMProcessor
[],
[]
);
UpdatePerfexCRM::dispatch($updatePerfexCRMObject, null, null);
return true;
@@ -0,0 +1,169 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Processors;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\UpdatePerfexCRMObject;
use App\Classes\ValueObjects\Constants\PerfexCRMTasks;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Classes\ValueObjects\Constants\PerfexCRMProjectStatus;
use App\Classes\ValueObjects\Constants\PerfexCRMTaskStatus;
use App\Classes\Jobs\UpdatePerfexCRMInvoice;
use App\Classes\Jobs\UpdatePerfexCRM;
use App\Classes\Jobs\UpdatePerfexCRMPrelude;
use App\Models\Booking;
use App\Models\Transaction;
use Illuminate\Support\Facades\Log;
class TransactionToPerfexCRMProcessorV2
{
public function execute(Transaction $model, int $status)
{
try {
if($model->owner instanceof \App\Models\Booking) {
$bookingInfo = $this->extractBookingInfo($model);
$projectName = 'Exchange | ' . $bookingInfo['serviceTypeName'] . ' | ' . $bookingInfo['bookingMarking'];
$tasks = $this->defineTasks($model, $status);
if(count($tasks) > 0) {
$updatePerfexCRMObject = new UpdatePerfexCRMObject(
$bookingInfo['companyName'],
$bookingInfo['companyReference'],
$bookingInfo['contactName'],
$bookingInfo['contactEmail'],
$bookingInfo['bookingMarking'],
$projectName,
PerfexCRMProjectStatus::IN_PROGRESS,
[],
$tasks
);
$this->dispatchUpdateJob($model, $status, $updatePerfexCRMObject);
}
}
} catch (\Exception $exception) {
Log::error('TransactionToPerfexCRMProcessor debug:');
Log::error($exception);
}
return true;
}
private function extractBookingInfo(Transaction $model): array
{
$bookingInfo = [];
$bookingInfo['companyReference'] = $model->owner->company->reference;
$bookingInfo['companyName'] = $model->owner->company->name;
$bookingInfo['contactEmail'] = $model->owner->company->employees()->first()->email;
$bookingInfo['contactName'] = $model->owner->company->employees()->first()->name;
$bookingInfo['bookingMarking'] = $model->owner->marking;
$bookingInfo['serviceTypeName'] = $model->owner->company->services()->where('id', $model->owner->service_id)->first()->name;
return $bookingInfo;
}
private function defineTasks(Transaction $model, int $status): array
{
$tasks = [];
if($status === ApprovalStatus::PENDING_VERIFICATION && (int) $model->type === TransactionType::PAYMENT) {
$tasks = $this->definePaymentTasks($model);
} elseif($status === ApprovalStatus::PENDING_VERIFICATION && $model->type === TransactionType::PURCHASE_ORDER) {
if($model->owner->service_id === 1 || $model->owner->service_id === 3) {
$tasks = [PerfexCRMTasks::TASK_PURCHASE_ORDER_1];
}
} elseif($status === ApprovalStatus::APPROVED && $model->type === TransactionType::PAYMENT) {
$task = PerfexCRMTasks::TASK_1_DAY_TRANSFER_2;
$task['status'] = PerfexCRMTaskStatus::COMPLETED;
$tasks = [$task];
}
return $tasks;
}
private function definePaymentTasks(Transaction $model): array
{
$tasks = [
// PerfexCRMTasks::TASK_1
];
if ($model->owner->service_id === 1) {
$tasks = array_merge($tasks, $this->oneDayTransferTasks());
} elseif ($model->owner->service_id === 3) {
$tasks = array_merge($tasks, $this->threeDayTransferTasks());
} elseif ($model->owner->service_id === 4) {
$tasks = array_merge($tasks, $this->payment1688Tasks());
}
if ($model->owner->service_id === 1 || $model->owner->service_id === 3) {
$purchaseOrder = $model->booking->transactions()->where('type', TransactionType::PURCHASE_ORDER)->complete()->first();
if(is_null($purchaseOrder)){
$tasks = array_merge($tasks, $this->purchaseOrderTasks());
}
}
return $tasks;
}
private function oneDayTransferTasks(): array
{
return [
// PerfexCRMTasks::TASK_1_DAY_TRANSFER_1,
PerfexCRMTasks::TASK_1_DAY_TRANSFER_2,
// PerfexCRMTasks::TASK_1_DAY_TRANSFER_3,
// PerfexCRMTasks::TASK_1_DAY_TRANSFER_3_1,
// PerfexCRMTasks::TASK_1_DAY_TRANSFER_4,
PerfexCRMTasks::TASK_1_DAY_TRANSFER_5,
PerfexCRMTasks::TASK_1_DAY_TRANSFER_6
];
}
private function threeDayTransferTasks(): array
{
return [
// PerfexCRMTasks::TASK_3_DAY_TRANSFER_1,
PerfexCRMTasks::TASK_3_DAY_TRANSFER_2,
// PerfexCRMTasks::TASK_3_DAY_TRANSFER_3,
// PerfexCRMTasks::TASK_3_DAY_TRANSFER_3_1,
// PerfexCRMTasks::TASK_3_DAY_TRANSFER_4,
PerfexCRMTasks::TASK_3_DAY_TRANSFER_5,
PerfexCRMTasks::TASK_3_DAY_TRANSFER_6
];
}
private function payment1688Tasks(): array
{
return [
// PerfexCRMTasks::TASK_1688_PAYMENT_1,
PerfexCRMTasks::TASK_1688_PAYMENT_2,
// PerfexCRMTasks::TASK_1688_PAYMENT_3,
// PerfexCRMTasks::TASK_1688_PAYMENT_3_1,
// PerfexCRMTasks::TASK_1688_PAYMENT_4,
PerfexCRMTasks::TASK_1688_PAYMENT_5,
// PerfexCRMTasks::TASK_1688_PAYMENT_6,
PerfexCRMTasks::TASK_1688_PAYMENT_7,
PerfexCRMTasks::TASK_1688_PAYMENT_8,
PerfexCRMTasks::TASK_1688_PAYMENT_9,
PerfexCRMTasks::TASK_1688_PAYMENT_10,
PerfexCRMTasks::TASK_1688_PAYMENT_11,
PerfexCRMTasks::TASK_1688_PAYMENT_12,
PerfexCRMTasks::TASK_1688_PAYMENT_13
];
}
private function purchaseOrderTasks(): array
{
$potask1 = PerfexCRMTasks::TASK_PURCHASE_ORDER_1;
$potask1['status'] = PerfexCRMTaskStatus::NOT_STARTED;
return [
$potask1,
// PerfexCRMTasks::TASK_PURCHASE_ORDER_2
];
}
private function dispatchUpdateJob(Transaction $model, int $status, UpdatePerfexCRMObject $updatePerfexCRMObject)
{
Log::info(json_encode($updatePerfexCRMObject->getTasks()));
$withInvoice = ($model->type === TransactionType::PAYMENT && $model->owner === Booking::class && $status === ApprovalStatus::APPROVED);
UpdatePerfexCRMPrelude::dispatch($model, $updatePerfexCRMObject, $withInvoice);
}
}
@@ -109,7 +109,7 @@ class UpdatePerfexCRMProcessor
*/
public function execute(UpdatePerfexCRMObject $updatePerfexCRMObject) {
$projectId = "";
// Customer has to exist first before Project can appear under it
// Check with Perfex CRM, if this user (email) was previously a lead, should automatically now become a customer
$crmCompany = $updatePerfexCRMObject->getCompanyName();
@@ -205,6 +205,7 @@ class UpdatePerfexCRMProcessor
// Get existing or create task
$result = $this->fetchesPerfexCRMTask->execute($tasks[$count]['name'], $milestoneId, 'project', $projectId);
if(isset($result->payload)){
Log::info(json_encode([$taskStatus != PerfexCRMTaskStatus::NOT_STARTED, $result->payload[0]['status'] == PerfexCRMTaskStatus::NOT_STARTED]));
if($taskStatus != PerfexCRMTaskStatus::NOT_STARTED && $result->payload[0]['status'] == PerfexCRMTaskStatus::NOT_STARTED)
{
$task = $result->payload[0];
@@ -3,23 +3,24 @@
namespace App\Classes\Modules\Transactions\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\PerfexCRM\Processors\TransactionToPerfexCRMProcessorV2;
use App\Models\Transaction;
use App\Classes\Modules\PerfexCRM\Processors\TransactionToPerfexCRMProcessor;
class UpdatesTransactionStatus extends AbstractUpdateRecord
{
/** @var TransactionToPerfexCRMProcessor */
/** @var TransactionToPerfexCRMProcessorV2 */
private $transactionToPerfexCRMProcessor;
/**
* UpdatesTransactionStatus constructor.
* @param TransactionToPerfexCRMProcessor $transactionToPerfexCRMProcessor
* @param TransactionToPerfexCRMProcessorV2 $transactionToPerfexCRMProcessor
*/
public function __construct(TransactionToPerfexCRMProcessor $transactionToPerfexCRMProcessor)
public function __construct(TransactionToPerfexCRMProcessorV2 $transactionToPerfexCRMProcessor)
{
$this->transactionToPerfexCRMProcessor = $transactionToPerfexCRMProcessor;
}
/**
* @param Transaction $model
* @param int $status
@@ -43,9 +43,9 @@ class PerfexCRMTasks
○ Outcomes: The payment will be approved in exchange, allowing the next steps in the process to be initiated.<br>',
'milestone' => '',
'reference' => 'TASK_1_DAY_TRANSFER_2',
'on_task_completion' => 'TASK_1_DAY_TRANSFER_3,TASK_1_DAY_TRANSFER_5',
'on_task_completion' => 'TASK_1_DAY_TRANSFER_5',
'department' => 'Accounts',
'status' => '',
'status' => PerfexCRMTaskStatus::IN_PROGRESS,
'priority' => PerfexCRMTaskPriority::HIGH,
'duedate' => 0
];
@@ -160,9 +160,9 @@ class PerfexCRMTasks
○ Link to order page: {link_transfer}<br>',
'milestone' => '',
'reference' => 'TASK_3_DAY_TRANSFER_2',
'on_task_completion' => 'TASK_3_DAY_TRANSFER_3,TASK_3_DAY_TRANSFER_5',
'on_task_completion' => 'TASK_3_DAY_TRANSFER_5',
'department' => 'Accounts',
'status' => '',
'status' => PerfexCRMTaskStatus::IN_PROGRESS,
'priority' => PerfexCRMTaskPriority::HIGH,
'duedate' => 0
];
@@ -286,9 +286,9 @@ class PerfexCRMTasks
○ Outcomes: The payment will be approved in exchange, allowing the next steps in the process to be initiated.<br>',
'milestone' => '',
'reference' => 'TASK_1688_PAYMENT_2',
'on_task_completion' => 'TASK_1688_PAYMENT_3,TASK_1688_PAYMENT_5',
'on_task_completion' => 'TASK_1688_PAYMENT_5',
'department' => 'Accounts',
'status' => '',
'status' => PerfexCRMTaskStatus::IN_PROGRESS,
'priority' => PerfexCRMTaskPriority::HIGH,
'duedate' => 0
];
@@ -353,7 +353,7 @@ class PerfexCRMTasks
○ Outcomes: The order is placed with a supplier and the customer\'s order is confirmed.<br>',
'milestone' => '',
'reference' => 'TASK_1688_PAYMENT_5',
'on_task_completion' => 'TASK_1688_PAYMENT_6',
'on_task_completion' => 'TASK_1688_PAYMENT_7',
'department' => 'Operations',
'status' => '',
'priority' => PerfexCRMTaskPriority::HIGH,
@@ -454,14 +454,14 @@ class PerfexCRMTasks
○ link: {link_transfer}<br>',
'milestone' => '',
'reference' => 'TASK_1688_PAYMENT_12',
'on_task_completion' => 'TASK_1688_PAYMENT_13',
'on_task_completion' => '',
'department' => 'Operations',
'status' => '',
'priority' => PerfexCRMTaskPriority::LOW,
'duedate' => 1
];
public const TASK_1688_PAYMENT_13 = [
'name' => 'Complete Order bookeeping',
'name' => 'Complete Order bookkeeping',
'description' => '○ Purpose: To complete the bookkeeping for the booking.<br>
○ Initial Status: Not Started<br>
○ Deadline: Same day<br>
@@ -493,7 +493,7 @@ class PerfexCRMTasks
○ Outcomes: Bank transaction is mapped successfully, allowing the next steps in the process to be initiated.<br>',
'milestone' => '',
'reference' => 'TASK_PURCHASE_ORDER_1',
'on_task_completion' => 'TASK_PURCHASE_ORDER_2',
'on_task_completion' => '',
'department' => 'Operations',
'status' => PerfexCRMTaskStatus::IN_PROGRESS,
'priority' => PerfexCRMTaskPriority::LOW,
+13
View File
@@ -25,6 +25,11 @@ class Transaction extends AbstractModel implements Documentable, Transactionable
use SoftDeletes;
use LogData;
protected $casts = [
'type' => 'int',
'status' => 'int',
];
protected $table = 'transactions';
public function owner(): morphTo
@@ -112,6 +117,14 @@ class Transaction extends AbstractModel implements Documentable, Transactionable
return $this->HasOne(GroupTransaction::class, 'transaction_id');
}
/**
* @return HasOne
*/
public function voucherRedemption(): HasOne
{
return $this->HasOne(VoucherRedemption::class, 'transaction_id', 'id');
}
public function convert_original_amount()
{
if($this->booking()->first()->fix_currency_id !== 1) {