mirror of
https://gitlab.com/CIEFWorldwideSdnBhd/exchange-2.0.git
synced 2026-08-23 14:33:59 +00:00
Merge branch 'master' of gitlab.com:CIEFWorldwideSdnBhd/exchange-2.0 into dillon/accounting-bank-mapping
# Conflicts: # app/Models/Transaction.php
This commit is contained in:
@@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -65,7 +65,7 @@ class AutoPurchaseOrderFillLogic extends AbstractControllerLogic
|
||||
public function logic(Request $request) : JsonResponse
|
||||
{
|
||||
$bookings = Booking::where('service_id', '!=', 4)->where(function($query){
|
||||
return $query->whereMonth('created_at', '=', 04)->whereYear('created_at', 2023);
|
||||
return $query->whereMonth('created_at', '=', 03)->whereYear('created_at', 2023);
|
||||
})->whereDoesntHave('transactions', function($q){
|
||||
$q->where('type', TransactionType::PURCHASE_ORDER);
|
||||
$q->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED]);
|
||||
|
||||
@@ -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'){
|
||||
|
||||
@@ -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,246 @@
|
||||
<?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(in_array($model->type, [TransactionType::PAYMENT, TransactionType::BILL, TransactionType::PURCHASE_ORDER])) {
|
||||
$transaction = ($model->type === TransactionType::BILL ? $model->owner : $model);
|
||||
$bookingInfo = $this->extractBookingInfo($transaction);
|
||||
$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($transaction, $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 = [];
|
||||
$ownerServiceId = $model->type === TransactionType::BILL ? $model->owner->owner->service_id : $model->owner->service_id;
|
||||
|
||||
if ($status === ApprovalStatus::PENDING_VERIFICATION) {
|
||||
$tasks = $this->handlePendingVerificationStatus($model, $ownerServiceId);
|
||||
} elseif ($status === ApprovalStatus::APPROVED) {
|
||||
$tasks = $this->handleApprovedStatus($model, $ownerServiceId);
|
||||
}
|
||||
|
||||
return $tasks;
|
||||
}
|
||||
|
||||
private function handlePendingVerificationStatus(Transaction $model, int $serviceId): array
|
||||
{
|
||||
$tasks = [];
|
||||
switch($model->type) {
|
||||
case TransactionType::PAYMENT:
|
||||
$tasks = $this->definePaymentTasks($model);
|
||||
break;
|
||||
case TransactionType::PURCHASE_ORDER:
|
||||
if ($serviceId === 1 || $serviceId === 3) {
|
||||
$task = PerfexCRMTasks::TASK_PURCHASE_ORDER_1;
|
||||
$task['status'] = PerfexCRMTaskStatus::IN_PROGRESS;
|
||||
$tasks = [$task];
|
||||
}
|
||||
break;
|
||||
case TransactionType::BILL:
|
||||
$tasks = $this->handleBillPendingStatus($serviceId);
|
||||
break;
|
||||
}
|
||||
|
||||
return $tasks;
|
||||
}
|
||||
|
||||
private function handleApprovedStatus(Transaction $model, int $serviceId): array
|
||||
{
|
||||
$tasks = [];
|
||||
switch($model->type) {
|
||||
case TransactionType::PAYMENT:
|
||||
$tasks = $this->handlePaymentApprovedStatus($serviceId);
|
||||
break;
|
||||
case TransactionType::BILL:
|
||||
if ($serviceId === 4) {
|
||||
$tasks = $this->completeTask(PerfexCRMTasks::TASK_1688_PAYMENT_9, PerfexCRMTasks::TASK_1688_PAYMENT_10);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return $tasks;
|
||||
}
|
||||
|
||||
private function handlePaymentApprovedStatus(int $serviceId): array
|
||||
{
|
||||
$tasks = [];
|
||||
switch ($serviceId) {
|
||||
case 1:
|
||||
$tasks = $this->completeTask(PerfexCRMTasks::TASK_1_DAY_TRANSFER_2, PerfexCRMTasks::TASK_1_DAY_TRANSFER_5);
|
||||
break;
|
||||
case 3:
|
||||
$tasks = $this->completeTask(PerfexCRMTasks::TASK_3_DAY_TRANSFER_2, PerfexCRMTasks::TASK_3_DAY_TRANSFER_5);
|
||||
break;
|
||||
case 4:
|
||||
$tasks = $this->completeTask(PerfexCRMTasks::TASK_1688_PAYMENT_2, PerfexCRMTasks::TASK_1688_PAYMENT_5);
|
||||
break;
|
||||
}
|
||||
|
||||
return $tasks;
|
||||
}
|
||||
|
||||
private function handleBillPendingStatus(int $serviceId): array
|
||||
{
|
||||
$tasks = [];
|
||||
switch ($serviceId) {
|
||||
case 1:
|
||||
$tasks = $this->completeTask(PerfexCRMTasks::TASK_1_DAY_TRANSFER_5, PerfexCRMTasks::TASK_1_DAY_TRANSFER_6);
|
||||
break;
|
||||
case 3:
|
||||
$tasks = $this->completeTask(PerfexCRMTasks::TASK_3_DAY_TRANSFER_5, PerfexCRMTasks::TASK_3_DAY_TRANSFER_6);
|
||||
break;
|
||||
case 4:
|
||||
$tasks = $this->completeTask(PerfexCRMTasks::TASK_1688_PAYMENT_5, PerfexCRMTasks::TASK_1688_PAYMENT_7);
|
||||
break;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
$withInvoice = ($model->type === TransactionType::PAYMENT && $model->owner === Booking::class && $status === ApprovalStatus::APPROVED);
|
||||
UpdatePerfexCRMPrelude::dispatch($model, $updatePerfexCRMObject, $withInvoice);
|
||||
}
|
||||
|
||||
private function completeTask($startTask, $endTask) {
|
||||
$startTask['status'] = PerfexCRMTaskStatus::COMPLETED;
|
||||
$endTask['status'] = PerfexCRMTaskStatus::IN_PROGRESS;
|
||||
|
||||
return [$startTask, $endTask];
|
||||
}
|
||||
}
|
||||
@@ -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,7 +205,9 @@ class UpdatePerfexCRMProcessor
|
||||
// Get existing or create task
|
||||
$result = $this->fetchesPerfexCRMTask->execute($tasks[$count]['name'], $milestoneId, 'project', $projectId);
|
||||
if(isset($result->payload)){
|
||||
if($taskStatus != PerfexCRMTaskStatus::NOT_STARTED && $result->payload[0]['status'] == PerfexCRMTaskStatus::NOT_STARTED)
|
||||
//&& $result->payload[0]['status'] == PerfexCRMTaskStatus::NOT_STARTED
|
||||
Log::info(json_encode([$taskStatus]));
|
||||
if($taskStatus != PerfexCRMTaskStatus::NOT_STARTED )
|
||||
{
|
||||
$task = $result->payload[0];
|
||||
$result = $this->updatesPerfexCRMTask->execute($task['id'], $task['name'], $task['milestone'], $task['rel_id'], $taskStatus, $task['startdate'], is_null($task['duedate']) ? '': $task['duedate']);
|
||||
|
||||
@@ -90,10 +90,11 @@ class CreateSupplierTransactionProcessor
|
||||
$object = new TransactionObject($billNumber, TransactionType::BILL, $supplier->id, 1,
|
||||
$supplier->banks()->where('default', true)->first()->id, PaymentMethodType::CASH,
|
||||
$payment->original_amount * (1 / $rate), $payment->original_amount, 1, $payment->original_currency_id,
|
||||
$rate, 0, $serviceCharge, null, ApprovalStatus::PENDING_VERIFICATION);
|
||||
$rate, 0, $serviceCharge, null, ApprovalStatus::PENDING_SUBMISSION);
|
||||
|
||||
/** @var Transaction $billTransaction */
|
||||
$billTransaction = $this->createsTransaction->execute($payment, $object);
|
||||
$this->updatesTransactionStatus->execute($billTransaction, ApprovalStatus::PENDING_VERIFICATION);
|
||||
$this->pushBill($billTransaction);
|
||||
|
||||
$transferFeeNumber = $this->generatesTransactionBillNumber->execute('TRFR-');
|
||||
@@ -140,4 +141,4 @@ class CreateSupplierTransactionProcessor
|
||||
$this->transferFee->push($transferFee);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -116,6 +116,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) {
|
||||
|
||||
@@ -27,9 +27,10 @@
|
||||
<div class="row m-b-10">
|
||||
<div class="col">
|
||||
<validation-wrapper-component :validator="$v.parameters.holder_name">
|
||||
<label>Account Holder Name</label>
|
||||
<label>Account Holder Name / Company Name</label>
|
||||
<input type="text" class="form-control" v-model="parameters.holder_name" :disabled="disabled">
|
||||
</validation-wrapper-component>
|
||||
<span class="text-danger fs-10 m-l-5" v-if="serviceType">{{ serviceType.id != 4 ? '*Please ensure to use the appropriate company name for corporate transfers, instead of personal names.' : ''}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row m-b-10">
|
||||
|
||||
+1
-1
@@ -13,7 +13,7 @@
|
||||
<div class="row m-b-15">
|
||||
<div class="col">
|
||||
<validation-wrapper-component :validator="$v.parameters.identification_no">
|
||||
<label class="text-primary">{{ data.type === 0 ? 'IC/Passport' : 'SSM Registration' }} Number</label>
|
||||
<label class="text-primary">{{ data.type === 0 ? 'IC' : 'SSM Registration' }} Number</label>
|
||||
<div class="controls">
|
||||
<input type="text" class="form-control fs-12" v-model="parameters.identification_no">
|
||||
</div>
|
||||
|
||||
@@ -26,12 +26,12 @@
|
||||
:endpoint="route('api.company.list')"
|
||||
:options="{
|
||||
segments_in: [parameters.id],
|
||||
with_total_payments: true,
|
||||
recency: '2022-02-15',
|
||||
frequency: 15,
|
||||
business_type: 2,
|
||||
with_bookings: true,
|
||||
order_by: { column: 'total_payments', DESC: true },
|
||||
// with_total_payments: true,
|
||||
// recency: '2022-02-15',
|
||||
// frequency: 15,
|
||||
// business_type: 2,
|
||||
// with_bookings: true,
|
||||
// order_by: { column: 'total_payments', DESC: true },
|
||||
}"
|
||||
>
|
||||
<template slot="list" slot-scope="{ data }">
|
||||
|
||||
Reference in New Issue
Block a user