Merge remote-tracking branch 'origin/master'

This commit is contained in:
Omair Saleh
2023-03-13 01:06:42 +08:00
60 changed files with 3570 additions and 22 deletions
-1
View File
@@ -21,7 +21,6 @@ gox.iml
rebuild_docker.sh
docker/*
db/*
docker-compose.yml
package-lock.json
public/*
/public/*
@@ -0,0 +1,41 @@
<?php
namespace App\Classes\Jobs;
use App\Classes\Modules\PerfexCRM\Processors\CreatePerfexCRMLeadProcessor;
use App\Classes\Modules\PerfexCRM\Services\FetchesPerfexCRMLead;
use App\Classes\Modules\PerfexCRM\Services\UpdatesPerfexCRMLead;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\CreateLeadPerfexCRMObject;
class CreatePerfexCRMCustomer implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/** @var CreateLeadPerfexCRMObject */
private $createLeadPerfexCRMObject;
/**
* CreatePerfexCRMCustomer constructor.
* @param CreateLeadPerfexCRMObject $createLeadPerfexCRMObject
*/
public function __construct(CreateLeadPerfexCRMObject $createLeadPerfexCRMObject)
{
$this->createLeadPerfexCRMObject = $createLeadPerfexCRMObject;
}
public function handle()
{
$lead = (App()->make(FetchesPerfexCRMLead::class))->execute($this->createLeadPerfexCRMObject->getEmail());
if(!is_null($lead)){
(App()->make(UpdatesPerfexCRMLead::class))->execute($lead, $this->createLeadPerfexCRMObject->getCompanyReference());
}
else{
(App()->make(CreatePerfexCRMLeadProcessor::class))->execute($this->createLeadPerfexCRMObject);
}
}
}
@@ -0,0 +1,42 @@
<?php
namespace App\Classes\Jobs;
use App\Classes\Modules\PerfexCRM\Processors\CreatePerfexCRMInvoiceProcessor;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class CreatePerfexCRMInvoice implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/** @var $transaction*/
private $transaction;
/** @var $purchaseOrder*/
private $purchaseOrder;
/** @var $supplier*/
private $supplier;
/**
* CreatePerfexCRMInvoice constructor.
* @param $transaction
* @param $purchaseOrder
* @param $supplier
*/
public function __construct($transaction, $purchaseOrder, $supplier)
{
$this->transaction = $transaction;
$this->purchaseOrder = $purchaseOrder;
$this->supplier = $supplier;
}
public function handle()
{
(App()->make(CreatePerfexCRMInvoiceProcessor::class))->execute($this->transaction, $this->purchaseOrder, $this->supplier);
}
}
@@ -0,0 +1,42 @@
<?php
namespace App\Classes\Jobs;
use App\Classes\Modules\PerfexCRM\Processors\CreatePerfexCRMTaskProcessor;
use App\Classes\Modules\PerfexCRM\Services\FetchesPerfexCRMLead;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\CreateTaskPerfexCRMObject;
class CreatePerfexCRMSingleTask implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/** @var FetchesPerfexCRMLead */
private $fetchesPerfexCRMLead;
/** @var CreateTaskPerfexCRMObject */
private $createTaskPerfexCRMObject;
/**
* CreatePerfexCRMSingleTask constructor.
* @param CreateTaskPerfexCRMObject $createTaskPerfexCRMObject
*/
public function __construct(CreateTaskPerfexCRMObject $createTaskPerfexCRMObject)
{
$this->createTaskPerfexCRMObject = $createTaskPerfexCRMObject;
}
public function handle()
{
$lead = (App()->make(FetchesPerfexCRMLead::class))->execute($this->createTaskPerfexCRMObject->getEmail());
if(!is_null($lead))
{
$this->createTaskPerfexCRMObject->setLeadId($lead->id);
(App()->make(CreatePerfexCRMTaskProcessor::class))->execute($this->createTaskPerfexCRMObject);
}
}
}
+33
View File
@@ -0,0 +1,33 @@
<?php
namespace App\Classes\Jobs;
use App\Classes\Modules\PerfexCRM\Processors\InitializePerfexCRMProcessor;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\InitialPerfexCRMObject;
class InitializePerfexCRM implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/** @var InitialPerfexCRMObject */
private $initialPerfexCRMObject;
/**
* InitializePerfexCRM constructor.
* @param InitialPerfexCRMObject $initialPerfexCRMObject
*/
public function __construct(InitialPerfexCRMObject $initialPerfexCRMObject)
{
$this->initialPerfexCRMObject = $initialPerfexCRMObject;
}
public function handle()
{
(App()->make(InitializePerfexCRMProcessor::class))->execute($this->initialPerfexCRMObject);
}
}
+33
View File
@@ -0,0 +1,33 @@
<?php
namespace App\Classes\Jobs;
use App\Classes\Modules\PerfexCRM\Processors\UpdatePerfexCRMProcessor;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\UpdatePerfexCRMObject;
class UpdatePerfexCRM implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/** @var UpdatePerfexCRMObject */
private $updatePerfexCRMObject;
/**
* UpdatePerfexCRM constructor.
* @param UpdatePerfexCRMObject $updatePerfexCRMObject
*/
public function __construct(UpdatePerfexCRMObject $updatePerfexCRMObject)
{
$this->updatePerfexCRMObject = $updatePerfexCRMObject;
}
public function handle()
{
(App()->make(UpdatePerfexCRMProcessor::class))->execute($this->updatePerfexCRMObject);
}
}
@@ -10,18 +10,22 @@ use App\Classes\Modules\Accounts\Processors\GenerateEmailVerificationAttemptProc
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\Companies\DataTransferObjects\EmploymentObject;
use App\Classes\Modules\Contacts\Processors\CreateContactProcessor;
use App\Classes\Modules\PerfexCRM\Processors\CreatePerfexCRMLeadProcessor;
use App\Classes\Modules\Companies\DataTransferObjects\EmploymentObject;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\CreateLeadPerfexCRMObject;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
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\Models\Company;
use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
class CreateCustomerLogic extends AbstractControllerLogic
{
@@ -56,6 +60,9 @@ class CreateCustomerLogic extends AbstractControllerLogic
/** @var GenerateEmailVerificationAttemptProcessor */
private $generateEmailVerificationAttemptProcessor;
/** @var CreatePerfexCRMLeadProcessor */
private $createPerfexCRMLeadProcessor;
/**
* CreateCustomerLogic constructor.
* @param CreateUserProcessor $createUserProcessor
@@ -65,8 +72,10 @@ class CreateCustomerLogic extends AbstractControllerLogic
* @param AssignSegmentProcessor $assignSegmentProcessor
* @param AuthenticationProcessor $authenticationProcessor
* @param GenerateEmailVerificationAttemptProcessor $generateEmailVerificationAttemptProcessor
* @param CreatePerfexCRMLeadProcessor $createPerfexCRMLeadProcessor
*/
public function __construct(CreateUserProcessor $createUserProcessor, CreateCompanyProcessor $createCompanyProcessor, CreateContactProcessor $createContactProcessor, AssignEmployeeProcessor $assignEmployeeProcessor, AssignSegmentProcessor $assignSegmentProcessor, AuthenticationProcessor $authenticationProcessor, GenerateEmailVerificationAttemptProcessor $generateEmailVerificationAttemptProcessor)
public function __construct(CreateUserProcessor $createUserProcessor, CreateCompanyProcessor $createCompanyProcessor, CreateContactProcessor $createContactProcessor, AssignEmployeeProcessor $assignEmployeeProcessor, AssignSegmentProcessor $assignSegmentProcessor, AuthenticationProcessor $authenticationProcessor, GenerateEmailVerificationAttemptProcessor $generateEmailVerificationAttemptProcessor,
CreatePerfexCRMLeadProcessor $createPerfexCRMLeadProcessor)
{
$this->createUserProcessor = $createUserProcessor;
$this->createCompanyProcessor = $createCompanyProcessor;
@@ -75,6 +84,7 @@ class CreateCustomerLogic extends AbstractControllerLogic
$this->assignSegmentProcessor = $assignSegmentProcessor;
$this->authenticationProcessor = $authenticationProcessor;
$this->generateEmailVerificationAttemptProcessor = $generateEmailVerificationAttemptProcessor;
$this->createPerfexCRMLeadProcessor = $createPerfexCRMLeadProcessor;
}
/**
@@ -101,9 +111,21 @@ class CreateCustomerLogic extends AbstractControllerLogic
$this->assignSegmentProcessor->execute($company);
$this->generateEmailVerificationAttemptProcessor->execute($user);
if(config('perfexcrm.is_enabled') == 'true'){
//$this->createPerfexCRMLeadProcessor->execute($request);
$createLeadPerfexCRMObject = new CreateLeadPerfexCRMObject(
$request->input('name'),
$request->input('email'),
$request->input('phone'),
$request->input('type') === CompanyType::COMPANY_BUSINESS ? $request->input('company_name') : $request->input('name'),
$company->reference
);
CreatePerfexCRMCustomer::dispatch($createLeadPerfexCRMObject);
}
$this->generateEmailVerificationAttemptProcessor->execute($user);
return $this->response($this->authenticationProcessor->execute($request));
}
}
}
@@ -107,9 +107,9 @@ class CallbackBillplzLogic
$token = Auth::fromUser(User::find(1));
$request->headers->set('Authorization', 'Bearer '.$token);
$marking = $transaction->owner instanceof Booking ? $transaction->booking->marking : $transaction->owner->owner->bookings()->orderBy('id', 'DESC')->first()->marking;
$marking = $transaction->owner instanceof Booking ? $transaction->booking->marking : (count($transaction->owner->owner->bookings()->get())? $transaction->owner->owner->bookings()->orderBy('id', 'DESC')->first()->marking: null);
return $request->method() === 'POST' ? true : view('pages.payments_redirect', ['marking' => $marking, 'transaction' => $transaction, 'status' => $status]);
return $request->method() === 'POST' ? true : view('pages.payments_redirect', ['marking' => $marking ?? null, 'transaction' => $transaction, 'status' => $status]);
}
}
@@ -13,6 +13,8 @@ use App\Classes\Modules\Bookings\Services\CreatesBooking;
use App\Classes\Modules\Bookings\Services\GeneratesBookingMarking;
use App\Classes\Modules\Bookings\DataTransferObjects\BookingObject;
use App\Classes\Modules\PerfexCRM\Processors\BookingToPerfexCRMProcessor;
use App\Http\Resources\BookingResource;
use ErrorException;
@@ -44,19 +46,24 @@ class CreateBookingLogic extends AbstractControllerLogic
/** @var FetchesCompany */
private $fetchesCompany;
/** @var BookingToPerfexCRMProcessor */
private $bookingToPerfexCRMProcessor;
/**
* CreateBookingLogic constructor.
* @param CanCreateBooking $canCreateBooking
* @param CreatesBooking $createsBooking
* @param GeneratesBookingMarking $generatesBookingMarking
* @param FetchesCompany $fetchesCompany
* @param BookingToPerfexCRMProcessor $bookingToPerfexCRMProcessor
*/
public function __construct(CanCreateBooking $canCreateBooking, CreatesBooking $createsBooking, GeneratesBookingMarking $generatesBookingMarking, FetchesCompany $fetchesCompany)
public function __construct(CanCreateBooking $canCreateBooking, CreatesBooking $createsBooking, GeneratesBookingMarking $generatesBookingMarking, FetchesCompany $fetchesCompany, BookingToPerfexCRMProcessor $bookingToPerfexCRMProcessor)
{
$this->canCreateBooking = $canCreateBooking;
$this->createsBooking = $createsBooking;
$this->generatesBookingMarking = $generatesBookingMarking;
$this->fetchesCompany = $fetchesCompany;
$this->bookingToPerfexCRMProcessor = $bookingToPerfexCRMProcessor;
}
@@ -77,7 +84,11 @@ class CreateBookingLogic extends AbstractControllerLogic
$booking = $this->createsBooking->execute($company, $object);
if(config('perfexcrm.is_enabled') == 'true'){
$this->bookingToPerfexCRMProcessor->execute($booking);
}
return $this->resourceResponse(new BookingResource($booking));
}
}
}
@@ -9,6 +9,7 @@ use App\Classes\Modules\Companies\Services\UpdatesCompanyStatus;
use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject;
use App\Classes\Modules\Documents\Services\CreatesDocument;
use App\Classes\Modules\Documents\Services\CreatesFiles;
use App\Classes\Modules\PerfexCRM\Processors\NewLeadTaskToPerfexCRMProcessor;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\CompanyType;
use App\Classes\ValueObjects\Constants\DocumentType;
@@ -42,6 +43,8 @@ class CreateIdentificationDocumentLogic extends AbstractControllerLogic
/** @var UpdatesCompanyStatus */
private $updatesCompanyStatus;
/** @var NewLeadTaskToPerfexCRMProcessor */
private $newLeadTaskToPerfexCRMProcessor;
/**
* CreateIdentificationDocumentLogic constructor.
@@ -49,13 +52,15 @@ class CreateIdentificationDocumentLogic extends AbstractControllerLogic
* @param CreatesDocument $createsDocument
* @param CreatesFiles $createsFile
* @param UpdatesCompanyStatus $updatesCompanyStatus
* @param NewLeadTaskToPerfexCRMProcessor $newLeadTaskToPerfexCRMProcessor
*/
public function __construct(FetchesCompany $fetchesCompany, CreatesDocument $createsDocument, CreatesFiles $createsFile, UpdatesCompanyStatus $updatesCompanyStatus)
public function __construct(FetchesCompany $fetchesCompany, CreatesDocument $createsDocument, CreatesFiles $createsFile, UpdatesCompanyStatus $updatesCompanyStatus, NewLeadTaskToPerfexCRMProcessor $newLeadTaskToPerfexCRMProcessor)
{
$this->fetchesCompany = $fetchesCompany;
$this->createsDocument = $createsDocument;
$this->createsFile = $createsFile;
$this->updatesCompanyStatus = $updatesCompanyStatus;
$this->newLeadTaskToPerfexCRMProcessor = $newLeadTaskToPerfexCRMProcessor;
}
/**
@@ -78,7 +83,11 @@ class CreateIdentificationDocumentLogic extends AbstractControllerLogic
$this->updatesCompanyStatus->execute($company, ApprovalStatus::PENDING_VERIFICATION);
if(config('perfexcrm.is_enabled') == 'true'){
$this->newLeadTaskToPerfexCRMProcessor->execute($company);
}
return $this->response([]);
}
}
}
@@ -0,0 +1,74 @@
<?php
namespace App\Classes\Modules\PerfexCRM\DataTransferObjects;
use Illuminate\Http\Request;
use App\Classes\General\Interfaces\DataTransferObject;
class CreateLeadPerfexCRMObject implements DataTransferObject
{
/** @var string */
private $name;
/** @var string */
private $email;
/** @var string */
private $phone;
/** @var string */
private $companyName;
/** @var string */
private $companyReference;
public function __construct(string $name, string $email, string $phone, string $companyName, string $companyReference)
{
$this->name = $name;
$this->email = $email;
$this->phone = $phone;
$this->companyName = $companyName;
$this->companyReference = $companyReference;
}
/**
* @return string
*/
public function getName(): string
{
return $this->name;
}
/**
* @return string
*/
public function getEmail(): string
{
return $this->email;
}
/**
* @return string
*/
public function getPhone(): string
{
return $this->phone;
}
/**
* @return string
*/
public function getCompanyName(): string
{
return $this->companyName;
}
/**
* @return string
*/
public function getCompanyReference(): string
{
return $this->companyReference;
}
}
@@ -0,0 +1,127 @@
<?php
namespace App\Classes\Modules\PerfexCRM\DataTransferObjects;
use App\Classes\General\Interfaces\DataTransferObject;
class CreateTaskPerfexCRMObject implements DataTransferObject
{
/** @var string */
private $email;
/** @var string */
private $name;
/** @var string */
private $description;
/** @var string */
private $leadId;
/** @var string */
private $milestoneId;
/** @var string */
private $projectId;
/** @var string */
private $reference;
/** @var string */
private $onTaskCompletion;
/** @var string */
private $status;
public function __construct(string $email, string $name, string $description, string $leadId, string $projectId, string $milestoneId, string $reference, string $onTaskCompletion, string $status)
{
$this->email = $email;
$this->name = $name;
$this->description = $description;
$this->leadId = $leadId;
$this->projectId = $projectId;
$this->milestoneId = $milestoneId;
$this->reference = $reference;
$this->onTaskCompletion = $onTaskCompletion;
$this->status = $status;
}
/**
* @return string
*/
public function getEmail(): string
{
return $this->email;
}
/**
* @return string
*/
public function getName(): string
{
return $this->name;
}
/**
* @return string
*/
public function getDescription(): string
{
return $this->description;
}
/**
* @return string
*/
public function getLeadId(): string
{
return $this->leadId;
}
public function setLeadId(string $leadId)
{
$this->leadId = $leadId;
}
/**
* @return string
*/
public function getProjectId(): string
{
return $this->projectId;
}
/**
* @return string
*/
public function getMilestoneId(): string
{
return $this->milestoneId;
}
/**
* @return string
*/
public function getReference(): string
{
return $this->reference;
}
/**
* @return string
*/
public function getOnTaskCompletion(): string
{
return $this->onTaskCompletion;
}
/**
* @return string
*/
public function getStatus(): string
{
return $this->status;
}
}
@@ -0,0 +1,99 @@
<?php
namespace App\Classes\Modules\PerfexCRM\DataTransferObjects;
use Illuminate\Http\Request;
use App\Classes\General\Interfaces\DataTransferObject;
class CustomerContactObject implements DataTransferObject
{
/** @var int */
private $customerId;
/** @var string */
private $firstname;
/** @var string */
private $lastname;
/** @var string */
private $email;
/** @var string */
private $password;
/** @var string */
private $isPrimary;
/** @var string */
private $sendSetPasswordEmail;
public function __construct(string $customerId, string $firstname, string $lastname, string $email, string $password, string $isPrimary, string $sendSetPasswordEmail)
{
$this->customerId = $customerId;
$this->firstname = $firstname;
$this->lastname = $lastname;
$this->email = $email;
$this->password = $password;
$this->isPrimary = $isPrimary;
$this->sendSetPasswordEmail = $sendSetPasswordEmail;
}
/**
* @return int
*/
public function getCustomerId(): int
{
return $this->customerId;
}
/**
* @return string
*/
public function getFirstName(): string
{
return $this->firstname;
}
/**
* @return string
*/
public function getLastName(): string
{
return $this->lastname;
}
/**
* @return string
*/
public function getEmail(): string
{
return $this->email;
}
/**
* @return string
*/
public function getPassword(): string
{
return $this->password;
}
/**
* @return string
*/
public function getIsPrimary(): string
{
return $this->isPrimary;
}
/**
* @return string
*/
public function getSendSetPasswordEmail(): string
{
return $this->sendSetPasswordEmail;
}
}
@@ -0,0 +1,124 @@
<?php
namespace App\Classes\Modules\PerfexCRM\DataTransferObjects;
use Illuminate\Http\Request;
use App\Classes\General\Interfaces\DataTransferObject;
class InitialPerfexCRMObject implements DataTransferObject
{
/** @var string */
private $companyName;
/** @var string */
private $companyReference;
/** @var string */
private $contactName;
/** @var string */
private $contactEmail;
/** @var string */
private $bookingMarking;
/** @var string */
private $projectName;
/** @var int */
private $projectStatus;
/** @var array */
private $milestoneNames;
/** @var array */
private $taskNames;
public function __construct(string $companyName, string $companyReference, string $contactName, string $contactEmail, string $bookingMarking, string $projectName, int $projectStatus, array $milestoneNames, array $taskNames)
{
$this->companyName = $companyName;
$this->companyReference = $companyReference;
$this->contactName = $contactName;
$this->contactEmail = $contactEmail;
$this->bookingMarking = $bookingMarking;
$this->projectName = $projectName;
$this->projectStatus = $projectStatus;
$this->milestoneNames = $milestoneNames;
$this->taskNames = $taskNames;
}
/**
* @return string
*/
public function getCompanyName(): string
{
return $this->companyName;
}
/**
* @return string
*/
public function getCompanyReference(): string
{
return $this->companyReference;
}
/**
* @return string
*/
public function getContactName(): string
{
return $this->contactName;
}
/**
* @return string
*/
public function getContactEmail(): string
{
return $this->contactEmail;
}
/**
* @return string
*/
public function getBookingMarking(): string
{
return $this->bookingMarking;
}
/**
* @return string
*/
public function getProjectName(): string
{
return $this->projectName;
}
/**
* @return string
*/
public function getProjectStatus(): int
{
return $this->projectStatus;
}
/**
* @return array
*/
public function getMilestoneNames(): array
{
return $this->milestoneNames;
}
/**
* @return array
*/
public function getTaskNames(): array
{
return $this->taskNames;
}
}
@@ -0,0 +1,86 @@
<?php
namespace App\Classes\Modules\PerfexCRM\DataTransferObjects;
use Illuminate\Http\Request;
use App\Classes\General\Interfaces\DataTransferObject;
class InvoicePaymentPerfexCRMObject implements DataTransferObject
{
/** @var int */
private $invoiceId;
/** @var float */
private $amount;
/** @var string */
private $date;
/** @var int */
private $paymentMode;
/** @var string */
private $transactionId;
/** @var string */
private $note;
public function __construct(int $invoiceId, float $amount, string $date, int $paymentMode, string $transactionId, string $note)
{
$this->invoiceId = $invoiceId;
$this->amount = $amount;
$this->date = $date;
$this->paymentMode = $paymentMode;
$this->transactionId = $transactionId;
$this->note = $note;
}
/**
* @return int
*/
public function getInvoiceId(): int
{
return $this->invoiceId;
}
/**
* @return float
*/
public function getAmount(): float
{
return $this->amount;
}
/**
* @return string
*/
public function getDate(): string
{
return $this->date;
}
/**
* @return int
*/
public function getPaymentMode(): int
{
return $this->paymentMode;
}
/**
* @return string
*/
public function getTransactionId(): string
{
return $this->transactionId;
}
/**
* @return string
*/
public function getNote(): string
{
return $this->note;
}
}
@@ -0,0 +1,145 @@
<?php
namespace App\Classes\Modules\PerfexCRM\DataTransferObjects;
use Illuminate\Http\Request;
use App\Classes\General\Interfaces\DataTransferObject;
class InvoicePerfexCRMObject implements DataTransferObject
{
/** @var string */
private $clientId;
/** @var string */
private $number;
/** @var string */
private $date;
/** @var string */
private $dueDate;
/** @var string */
private $currency;
/** @var float */
private $subTotal;
/** @var float */
private $total;
/** @var string */
private $billingStreet;
/** @var string */
private $projectId;
/** @var array */
private $allowedPaymentModes;
/** @var array */
private $invoiceItems;
public function __construct(string $clientId, string $number, string $date, string $dueDate, string $currency, float $subTotal, float $total, string $billingStreet, string $projectId, array $allowedPaymentModes, array $invoiceItems)
{
$this->clientId = $clientId;
$this->number = $number;
$this->date = $date;
$this->dueDate = $dueDate;
$this->currency = $currency;
$this->subTotal = $subTotal;
$this->total = $total;
$this->billingStreet = $billingStreet;
$this->projectId = $projectId;
$this->allowedPaymentModes = $allowedPaymentModes;
$this->invoiceItems = $invoiceItems;
}
/**
* @return string
*/
public function getClientId(): string
{
return $this->clientId;
}
/**
* @return string
*/
public function getNumber(): string
{
return $this->number;
}
/**
* @return string
*/
public function getDate(): string
{
return $this->date;
}
/**
* @return string
*/
public function getDueDate(): string
{
return $this->dueDate;
}
/**
* @return string
*/
public function getCurrency(): string
{
return $this->currency;
}
/**
* @return float
*/
public function getSubTotal(): float
{
return $this->subTotal;
}
/**
* @return float
*/
public function getTotal(): float
{
return $this->total;
}
/**
* @return string
*/
public function getBillingStreet(): string
{
return $this->billingStreet;
}
/**
* @return string
*/
public function getProjectId(): string
{
return $this->projectId;
}
/**
* @return array
*/
public function getAllowedPaymentModes(): array
{
return $this->allowedPaymentModes;
}
/**
* @return array
*/
public function getInvoiceItems(): array
{
return $this->invoiceItems;
}
}
@@ -0,0 +1,86 @@
<?php
namespace App\Classes\Modules\PerfexCRM\DataTransferObjects;
use Illuminate\Http\Request;
use App\Classes\General\Interfaces\DataTransferObject;
class InvoiceSingleItemPerfexCRMObject implements DataTransferObject
{
/** @var string */
public $description;
/** @var string */
public $longDescription;
/** @var float */
public $qty;
/** @var float */
public $rate;
/** @var int */
public $order;
/** @var string */
public $unit;
public function __construct(string $description, string $longDescription, float $qty, float $rate, int $order, string $unit)
{
$this->description = $description;
$this->longDescription = $longDescription;
$this->qty = $qty;
$this->rate = $rate;
$this->order = $order;
$this->unit = $unit;
}
/**
* @return string
*/
public function getDescription(): string
{
return $this->description;
}
/**
* @return string
*/
public function getLongDescription(): string
{
return $this->longDescription;
}
/**
* @return float
*/
public function getQty(): float
{
return $this->qty;
}
/**
* @return float
*/
public function getRate(): float
{
return $this->rate;
}
/**
* @return int
*/
public function getOrder(): int
{
return $this->order;
}
/**
* @return string
*/
public function getUnit(): string
{
return $this->unit;
}
}
@@ -0,0 +1,124 @@
<?php
namespace App\Classes\Modules\PerfexCRM\DataTransferObjects;
use Illuminate\Http\Request;
use App\Classes\General\Interfaces\DataTransferObject;
class UpdatePerfexCRMObject implements DataTransferObject
{
/** @var string */
private $companyName;
/** @var string */
private $companyReference;
/** @var string */
private $contactName;
/** @var string */
private $contactEmail;
/** @var string */
private $bookingMarking;
/** @var string */
private $projectName;
/** @var int */
private $projectStatus;
/** @var array */
private $milestoneNames;
/** @var array */
private $taskNames;
public function __construct(string $companyName, string $companyReference, string $contactName, string $contactEmail, string $bookingMarking, string $projectName, int $projectStatus, array $milestoneNames, array $taskNames)
{
$this->companyName = $companyName;
$this->companyReference = $companyReference;
$this->contactName = $contactName;
$this->contactEmail = $contactEmail;
$this->bookingMarking = $bookingMarking;
$this->projectName = $projectName;
$this->projectStatus = $projectStatus;
$this->milestoneNames = $milestoneNames;
$this->taskNames = $taskNames;
}
/**
* @return string
*/
public function getCompanyName(): string
{
return $this->companyName;
}
/**
* @return string
*/
public function getCompanyReference(): string
{
return $this->companyReference;
}
/**
* @return string
*/
public function getContactName(): string
{
return $this->contactName;
}
/**
* @return string
*/
public function getContactEmail(): string
{
return $this->contactEmail;
}
/**
* @return string
*/
public function getBookingMarking(): string
{
return $this->bookingMarking;
}
/**
* @return string
*/
public function getProjectName(): string
{
return $this->projectName;
}
/**
* @return int
*/
public function getProjectStatus(): int
{
return $this->projectStatus;
}
/**
* @return array
*/
public function getMilestoneNames(): array
{
return $this->milestoneNames;
}
/**
* @return array
*/
public function getTaskNames(): array
{
return $this->taskNames;
}
}
@@ -0,0 +1,44 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Processors;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\UpdatePerfexCRMObject;
use App\Classes\Jobs\UpdatePerfexCRM;
use App\Models\Booking;
use App\Classes\ValueObjects\Constants\PerfexCRMProjectStatus;
class BookingToPerfexCRMProcessor
{
/**
* @param Booking $booking
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(Booking $booking)
{
$companyReference = $booking->company->reference;
$companyName = $booking->company->name;
$employee = $booking->company->employees()->first();
$contactEmail = $employee->email;
$contactName = $employee->name;
$bookingMarking = $booking->marking;
$serviceTypeName = $booking->company->services()->where('id', $booking->service_id)->first()->name;
$projectName = 'Exchange | '.$serviceTypeName.' | '.$bookingMarking;
$updatePerfexCRMObject = new UpdatePerfexCRMObject(
$companyName,
$companyReference,
$contactName,
$contactEmail,
$bookingMarking,
$projectName,
PerfexCRMProjectStatus::NOT_STARTED,
[],
[]
);
UpdatePerfexCRM::dispatch($updatePerfexCRMObject);
return true;
}
}
@@ -0,0 +1,198 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Processors;
// use App\Classes\Modules\PerfexCRM\DataTransferObjects\ContactObject;
use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMInvoice;
use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMInvoicePayment;
use App\Classes\Modules\PerfexCRM\Services\ConvertsPerfexCRMLeadToCustomer;
use App\Classes\Modules\PerfexCRM\Services\FetchesPerfexCRMProject;
use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMCustomerProject;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\InvoicePerfexCRMObject;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\InvoicePaymentPerfexCRMObject;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\InvoiceSingleItemPerfexCRMObject;
use App\Classes\ValueObjects\Constants\PerfexCRMProjectStatus;
use Carbon\Carbon;
class CreatePerfexCRMInvoiceProcessor
{
/** @var CreatesPerfexCRMInvoice */
private $createsPerfexCRMInvoice;
/** @var CreatesPerfexCRMInvoicePayment */
private $createsPerfexCRMInvoicePayment;
/** @var ConvertsPerfexCRMLeadToCustomer */
private $convertsPerfexCRMLeadToCustomer;
/** @var FetchesPerfexCRMProject */
private $fetchesPerfexCRMProject;
/** @var CreatesPerfexCRMCustomerProject */
private $createsPerfexCRMCustomerProject;
/**
* CreatePerfexCRMInvoiceProcessor constructor.
* @param CreatesPerfexCRMInvoice $createsPerfexCRMInvoice
*/
public function __construct(CreatesPerfexCRMInvoice $createsPerfexCRMInvoice,
CreatesPerfexCRMInvoicePayment $createsPerfexCRMInvoicePayment,
ConvertsPerfexCRMLeadToCustomer $convertsPerfexCRMLeadToCustomer,
FetchesPerfexCRMProject $fetchesPerfexCRMProject,
CreatesPerfexCRMCustomerProject $createsPerfexCRMCustomerProject)
{
$this->createsPerfexCRMInvoice = $createsPerfexCRMInvoice;
$this->createsPerfexCRMInvoicePayment = $createsPerfexCRMInvoicePayment;
$this->convertsPerfexCRMLeadToCustomer = $convertsPerfexCRMLeadToCustomer;
$this->fetchesPerfexCRMProject = $fetchesPerfexCRMProject;
$this->createsPerfexCRMCustomerProject = $createsPerfexCRMCustomerProject;
}
/**
* @param $transaction
* @param $purchaseOrder
* @param $supplier
* @return null|object
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute($transaction, $purchaseOrder, $supplier) {
$clientId = "";
$number = $transaction->bill_no;
$prefix = "INV-";
//This will remove the prefix if prefix already exist in the string
if (substr($number, 0, strlen($prefix)) == $prefix) {
$number = substr($number, strlen($prefix));
}
$number = 'EXC-'.$number;
$date = Carbon::parse($transaction->booking->created_at)->format('Y-m-d');
$dueDate = Carbon::parse($transaction->booking->created_at)->format('Y-m-d');
$currency = 1; //cief TODO: To look into Malaysia and Chinese currency
$subTotal = 0.00;
$total = 0.00;
$billingStreet = "";
$addresses = $supplier->addresses()->where('billing', '=', true)->first();
$billingStreet = $billingStreet.$addresses->street_one;
$billingStreet = $billingStreet.$addresses->street_two.',';
$billingStreet = $billingStreet.$addresses->district()->first()->name.',';
$billingStreet = $billingStreet.$addresses->postcode;
$billingStreet = $billingStreet.$addresses->state()->first()->name.',';
$billingStreet = $billingStreet.$addresses->country()->first()->name;
$allowedPaymentModes = [];
$invoiceItems = [];
$email = $supplier->employees()->first()->email;
$result = $this->convertsPerfexCRMLeadToCustomer->execute($email);
if(isset($result->payload)){
$clientId = $result->payload['client_id'];
}
//get project
$projectId = "";
$bookingMarking = $transaction->owner->marking;
$serviceTypeName = $transaction->owner->company->services()->where('id', $transaction->owner->service_id)->first()->name;
$projectName = 'Exchange | '.$serviceTypeName.' | '.$bookingMarking;
$project = $this->fetchesPerfexCRMProject->execute($projectName, $clientId);
if(!is_null($project)){
$projectId = $project->id;
}
else{
$result = $this->createsPerfexCRMCustomerProject->execute($projectName, PerfexCRMProjectStatus::NOT_STARTED, $clientId);
if(isset($result->payload)){ //Here means project creation successful
$projectId = $result->payload['project_id'];
}
}
//newitems
foreach ($purchaseOrder->transactionDetails as $key => $transaction_detail){
$order = $key + 1;
$stockCode = $transaction_detail->product_code;
$description = $transaction_detail->product_name;
$quantity = $transaction_detail->quantity;
$unitPrice = 0.00;
if($transaction->booking()->first()->fix_currency_id !== 1)
$unitPrice = (1/$transaction->currency_rate) * $transaction_detail->price;
else
$unitPrice = $transaction_detail->price;
//$totalAmount = 0.00;
if($transaction->booking()->first()->fix_currency_id !== 1){
//$totalAmount = (float)number_format( (1/$transaction->currency_rate) * $transaction_detail->price, 2,'.','')*$transaction_detail->quantity;
$subTotal += number_format((1/$transaction->currency_rate) * $transaction_detail->price, 2,'.','') * $transaction_detail->quantity;
}
else
{
//$totalAmount = (float)number_format($transaction_detail->price, 2,'.','')*$transaction_detail->quantity;
$subTotal += number_format($transaction_detail->price, 2,'.','') * $transaction_detail->quantity;
}
//string $description, string $longDescription, int $qty, int $rate, int $order, string $unit
$invoiceSingleItem = new InvoiceSingleItemPerfexCRMObject(
$description,
"",
$quantity,
$unitPrice,
$order,
""
);
array_push($invoiceItems, $invoiceSingleItem);
}
if($transaction->booking()->first()->fix_currency_id !== 1){
$total = ((1/$transaction->currency_rate) * $transaction->amount) + $transaction->service_charge + $transaction->tax;
}
else{
$total = $transaction->amount + $transaction->service_charge + $transaction->tax;
}
//This setting is similar to Setup > Leads > Sources, Setup > Leads > Statuses
//Can be found at Finance > Payment Modes
array_push($allowedPaymentModes, 1, 2);
$invoicePerfexCRMObject = new InvoicePerfexCRMObject(
$clientId,
$number,
$date,
$dueDate,
$currency,
$subTotal,
$total,
$billingStreet,
$projectId,
$allowedPaymentModes,
$invoiceItems
);
$result = $this->createsPerfexCRMInvoice->execute($invoicePerfexCRMObject);
if(!is_null($result))
{
if($result->payload['id']){
$invoicePaymentPerfexCRMObject = new InvoicePaymentPerfexCRMObject(
$result->payload['id'],
$total,
$date,
1,
"",
""
);
$this->createsPerfexCRMInvoicePayment->execute($invoicePaymentPerfexCRMObject);
}
}
//else: logs will record the following:
//"status":false,"error":{"number":"The Invoice number is already in use"},"message":"<p>The Invoice number is already in use<\/p>"}
return true;
}
}
@@ -0,0 +1,36 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Processors;
// use App\Classes\Modules\PerfexCRM\DataTransferObjects\ContactObject;
use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMLead;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\CreateLeadPerfexCRMObject;
class CreatePerfexCRMLeadProcessor
{
/** @var CreatesPerfexCRMLead */
private $createsPerfexCRMLead;
/**
* CreatePerfexCRMLeadProcessor constructor.
* @param CreatesPerfexCRMLead $createsPerfexCRMLead
*/
public function __construct(CreatesPerfexCRMLead $createsPerfexCRMLead)
{
$this->createsPerfexCRMLead = $createsPerfexCRMLead;
}
/**
* @param CreateLeadPerfexCRMObject $createLeadPerfexCRMObject
* @return null|object
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(CreateLeadPerfexCRMObject $createLeadPerfexCRMObject) {
return $this->createsPerfexCRMLead->execute($createLeadPerfexCRMObject);
}
}
@@ -0,0 +1,41 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Processors;
use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMTask;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\CreateTaskPerfexCRMObject;
class CreatePerfexCRMTaskProcessor
{
/** @var CreatesPerfexCRMTask */
private $createsPerfexCRMTask;
/**
* @param CreatesPerfexCRMTask $createsPerfexCRMTask
*/
public function __construct(CreatesPerfexCRMTask $createsPerfexCRMTask)
{
$this->createsPerfexCRMTask = $createsPerfexCRMTask;
}
/**
* @param CreateTaskPerfexCRMObject $createTaskPerfexCRMObject
* @return true
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(CreateTaskPerfexCRMObject $createTaskPerfexCRMObject) {
$this->createsPerfexCRMTask->execute(
$createTaskPerfexCRMObject->getName(),
$createTaskPerfexCRMObject->getDescription(),
$createTaskPerfexCRMObject->getLeadId(),
$createTaskPerfexCRMObject->getMilestoneId(),
$createTaskPerfexCRMObject->getProjectId(),
$createTaskPerfexCRMObject->getReference(),
$createTaskPerfexCRMObject->getOnTaskCompletion(),
$createTaskPerfexCRMObject->getStatus(),
);
return true;
}
}
@@ -0,0 +1,195 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Processors;
use App\Classes\Modules\PerfexCRM\Services\ConvertsPerfexCRMLeadToCustomer;
use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMCustomerProject;
use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMMilestone;
use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMTask;
use App\Classes\Modules\PerfexCRM\Services\FetchesPerfexCRMProject;
use App\Classes\Modules\PerfexCRM\Services\FetchesPerfexCRMMilestone;
use App\Classes\Modules\PerfexCRM\Services\FetchesPerfexCRMTask;
use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMCustomer;
use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMCustomerContact;
use App\Classes\Modules\PerfexCRM\Services\UpdatesPerfexCRMCustomer;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\CustomerContactObject;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\InitialPerfexCRMObject;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\UpdatePerfexCRMObject;
use App\Classes\ValueObjects\Constants\PerfexCRMMilestones;
use App\Classes\ValueObjects\Constants\PerfexCRMTasks;
use App\Classes\ValueObjects\Constants\PerfexCRMTaskStatus;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Illuminate\Http\Request;
class InitializePerfexCRMProcessor
{
/** @var ConvertsPerfexCRMLeadToCustomer */
private $convertsPerfexCRMLeadToCustomer;
/** @var CreatesPerfexCRMCustomerProject */
private $createsPerfexCRMCustomerProject;
/** @var CreatesPerfexCRMMilestone */
private $createsPerfexCRMMilestone;
/** @var CreatesPerfexCRMTask */
private $createsPerfexCRMTask;
/** @var FetchesPerfexCRMProject */
private $fetchesPerfexCRMProject;
/** @var FetchesPerfexCRMMilestone */
private $fetchesPerfexCRMMilestone;
/** @var FetchesPerfexCRMTask */
private $fetchesPerfexCRMTask;
/** @var CreatesPerfexCRMCustomer */
private $createsPerfexCRMCustomer;
/** @var CreatesPerfexCRMCustomerContact */
private $createsPerfexCRMCustomerContact;
/** @var UpdatesPerfexCRM */
private $updatePerfexCRM;
/** @var UpdatesPerfexCRMCustomer */
private $updatesPerfexCRMCustomer;
/**
* @param ConvertsPerfexCRMLeadToCustomer $convertsPerfexCRMLeadToCustomer
* @param CreatesPerfexCRMCustomerProject $createsPerfexCRMCustomerProject
* @param CreatesPerfexCRMMilestone $createsPerfexCRMMilestone
* @param CreatesPerfexCRMTask $createsPerfexCRMTask
* @param FetchesPerfexCRMProject $fetchesPerfexCRMProject
* @param FetchesPerfexCRMMilestone $fetchesPerfexCRMMilestone
* @param FetchesPerfexCRMTask $fetchesPerfexCRMTask
* @param CreatesPerfexCRMCustomer $createsPerfexCRMCustomer
* @param CreatesPerfexCRMCustomerContact $createsPerfexCRMCustomerContact
* @param UpdatesPerfexCRMCustomer $updatesPerfexCRMCustomer
*/
public function __construct(ConvertsPerfexCRMLeadToCustomer $convertsPerfexCRMLeadToCustomer,
CreatesPerfexCRMCustomerProject $createsPerfexCRMCustomerProject,
CreatesPerfexCRMMilestone $createsPerfexCRMMilestone,
CreatesPerfexCRMTask $createsPerfexCRMTask,
FetchesPerfexCRMProject $fetchesPerfexCRMProject,
FetchesPerfexCRMMilestone $fetchesPerfexCRMMilestone,
FetchesPerfexCRMTask $fetchesPerfexCRMTask,
CreatesPerfexCRMCustomer $createsPerfexCRMCustomer,
CreatesPerfexCRMCustomerContact $createsPerfexCRMCustomerContact,
UpdatesPerfexCRMCustomer $updatesPerfexCRMCustomer)
{
$this->convertsPerfexCRMLeadToCustomer = $convertsPerfexCRMLeadToCustomer;
$this->createsPerfexCRMCustomerProject = $createsPerfexCRMCustomerProject;
$this->createsPerfexCRMMilestone = $createsPerfexCRMMilestone;
$this->createsPerfexCRMTask = $createsPerfexCRMTask;
$this->fetchesPerfexCRMProject = $fetchesPerfexCRMProject;
$this->fetchesPerfexCRMMilestone = $fetchesPerfexCRMMilestone;
$this->fetchesPerfexCRMTask = $fetchesPerfexCRMTask;
$this->createsPerfexCRMCustomer = $createsPerfexCRMCustomer;
$this->createsPerfexCRMCustomerContact = $createsPerfexCRMCustomerContact;
$this->updatesPerfexCRMCustomer = $updatesPerfexCRMCustomer;
}
/**
* @param InitialPerfexCRMObject $initialPerfexCRMObject
* @return null|object
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(InitialPerfexCRMObject $initialPerfexCRMObject) {
// 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 = $initialPerfexCRMObject->getCompanyName();
$result = $this->convertsPerfexCRMLeadToCustomer->execute($initialPerfexCRMObject->getContactEmail());
if(isset($result->payload)){
$crmClientId = $result->payload['client_id'];
if (isset($result->payload['company'])) {
$crmCompany = $result->payload['company'];
}
}
else{
//if reach this point, this means this user is not a official customer nor is a lead in crm
//Create Customer has 2 parts: Create Company (client), Create Contact
$result = $this->createsPerfexCRMCustomer->execute($crmCompany);
if(is_null($result)){
$crmCompany = $crmCompany." 2";
$result = $this->createsPerfexCRMCustomer->execute($crmCompany);
}
$crmClientId = $result->payload['clientId'];
$customerContactObject = new CustomerContactObject(
$crmClientId,
$initialPerfexCRMObject->getContactName(),
$initialPerfexCRMObject->getContactName(),
$initialPerfexCRMObject->getContactEmail(),
"pU^T@sC#9Q",
"on",
"on"
);
$result = $this->createsPerfexCRMCustomerContact->execute($customerContactObject);
}
//Update custom fields to identify company reference from exchange or shipping portal
$value_exists = false;
if (isset($result->payload['customfields'])) {
foreach ($result->payload['customfields'] as $element) {
if ($element['value'] === $initialPerfexCRMObject->getCompanyReference()) {
$value_exists = true;
break;
}
}
}
if(!$value_exists);
{
$result = $this->updatesPerfexCRMCustomer->execute($crmClientId, $crmCompany, $initialPerfexCRMObject->getCompanyReference());
}
// Get existing or create project, project has to exist first before milestone can appear under it
$result = $this->createsPerfexCRMCustomerProject->execute($initialPerfexCRMObject->getProjectName(), $initialPerfexCRMObject->getProjectStatus(), $crmClientId);
if(isset($result->payload)){ //Here means project creation successful
$projectId = $result->payload['project_id'];
}
else{
$projectId = $this->fetchesPerfexCRMProject->execute($initialPerfexCRMObject->getProjectName(), $crmClientId)->id;
}
$tasks = $initialPerfexCRMObject->getTaskNames();
if(count($tasks) > 0){
//Create tasks with milestone
for($count=0; $count < count($tasks); $count++) {
$milestoneId = 0; //By default milestoneId is 0, having this set at individual task is optional
if($tasks[$count]['milestone'] != "") //Create milestone only if it is defined
{
// Get existing or create milestone, milestone has to exist first before task can appear under it
$result = $this->createsPerfexCRMMilestone->execute($tasks[$count]['milestone'], $projectId, $count);
if(isset($result->payload)){
$milestoneId = $result->payload['milestone_id'];
}
else{
$milestone = $this->fetchesPerfexCRMMilestone->execute($tasks[$count]['milestone'], $projectId);
$array = json_decode(json_encode($milestone), true);
$milestoneId = $array[0]['id'];
}
}
$taskStatus = PerfexCRMTaskStatus::NOT_STARTED;
if($tasks[$count]['status'] != ''){
$taskStatus = $tasks[$count]['status'];
}
// Get existing or create task
$result = $this->createsPerfexCRMTask->execute($tasks[$count]['name'], $tasks[$count]['description'], '', $milestoneId, $projectId, $tasks[$count]['reference'], $tasks[$count]['on_task_completion'], $taskStatus);
if(is_null($result)){
break; //Breaking the rest of the tasks in array assuming that they are all created as a batch previously
}
}
}
return true;
}
}
@@ -0,0 +1,38 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Processors;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\CreateTaskPerfexCRMObject;
use App\Classes\Jobs\CreatePerfexCRMSingleTask;
use App\Classes\ValueObjects\Constants\PerfexCRMTasks;
use App\Models\Company;
class NewLeadTaskToPerfexCRMProcessor
{
/**
* @param Company $company
* @return true
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(Company $company)
{
$employee = $company->employees()->first();
$contactEmail = $employee->email;
$createTaskPerfexCRMObject = new CreateTaskPerfexCRMObject(
$contactEmail,
PerfexCRMTasks::TASK_IDENTIFICATION_1['name'],
PerfexCRMTasks::TASK_IDENTIFICATION_1['description'],
"",
"",
"",
"",
"",
PerfexCRMTasks::TASK_IDENTIFICATION_1['status']
);
CreatePerfexCRMSingleTask::dispatch($createTaskPerfexCRMObject);
return true;
}
}
@@ -0,0 +1,127 @@
<?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\UpdatePerfexCRM;
use App\Models\Transaction;
class TransactionToPerfexCRMProcessor
{
/**
* @param Transaction $model
* @param int $status
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(Transaction $model, int $status)
{
// dd(json_encode($status));
if($model->owner instanceof \App\Models\Booking) {
$companyReference = $model->owner->company->reference;
$companyName = $model->owner->company->name;
$employee = $model->owner->company->employees()->first();
$contactEmail = $employee->email;
$contactName = $employee->name;
$bookingMarking = $model->owner->marking;
$serviceTypeName = $model->owner->company->services()->where('id', $model->owner->service_id)->first()->name;
$projectName = 'Exchange | '.$serviceTypeName.' | '.$bookingMarking;
if($status == ApprovalStatus::APPROVED)
{
if($model->type == TransactionType::PAYMENT){
$tasks = [
PerfexCRMTasks::TASK_1
];
if($model->owner->service_id == 1){
$tasks = [
PerfexCRMTasks::TASK_1,
PerfexCRMTasks::TASK_1_DAY_TRANSFER_1,
PerfexCRMTasks::TASK_1_DAY_TRANSFER_2,
PerfexCRMTasks::TASK_1_DAY_TRANSFER_3,
PerfexCRMTasks::TASK_1_DAY_TRANSFER_4,
PerfexCRMTasks::TASK_1_DAY_TRANSFER_5,
PerfexCRMTasks::TASK_1_DAY_TRANSFER_6,
];
}
else if($model->owner->service_id == 3){
$tasks = [
PerfexCRMTasks::TASK_1,
PerfexCRMTasks::TASK_3_DAY_TRANSFER_1,
PerfexCRMTasks::TASK_3_DAY_TRANSFER_2,
PerfexCRMTasks::TASK_3_DAY_TRANSFER_3,
PerfexCRMTasks::TASK_3_DAY_TRANSFER_4,
PerfexCRMTasks::TASK_3_DAY_TRANSFER_5,
PerfexCRMTasks::TASK_3_DAY_TRANSFER_6,
];
}
else if($model->owner->service_id == 4){
$tasks = [
PerfexCRMTasks::TASK_1,
PerfexCRMTasks::TASK_1688_PAYMENT_1,
PerfexCRMTasks::TASK_1688_PAYMENT_2,
PerfexCRMTasks::TASK_1688_PAYMENT_3,
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,
];
}
$updatePerfexCRMObject = new UpdatePerfexCRMObject(
$companyName,
$companyReference,
$contactName,
$contactEmail,
$bookingMarking,
$projectName,
PerfexCRMProjectStatus::IN_PROGRESS,
[],
$tasks
);
UpdatePerfexCRM::dispatch($updatePerfexCRMObject);
}
}
else if($status == ApprovalStatus::PENDING_VERIFICATION){
if($model->type == TransactionType::PURCHASE_ORDER){
$tasks = [];
if($model->owner->service_id == 1 || $model->owner->service_id == 3){
$tasks = [
PerfexCRMTasks::TASK_PURCHASE_ORDER_1,
PerfexCRMTasks::TASK_PURCHASE_ORDER_2,
];
}
if(count($tasks) > 0){
$updatePerfexCRMObject = new UpdatePerfexCRMObject(
$companyName,
$companyReference,
$contactName,
$contactEmail,
$bookingMarking,
$projectName,
PerfexCRMProjectStatus::IN_PROGRESS,
[],
$tasks
);
UpdatePerfexCRM::dispatch($updatePerfexCRMObject);
}
}
}
}
return true;
}
}
@@ -0,0 +1,210 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Processors;
use App\Classes\Modules\PerfexCRM\Services\ConvertsPerfexCRMLeadToCustomer;
use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMCustomerProject;
use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMMilestone;
use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMTask;
use App\Classes\Modules\PerfexCRM\Services\FetchesPerfexCRMProject;
use App\Classes\Modules\PerfexCRM\Services\FetchesPerfexCRMMilestone;
use App\Classes\Modules\PerfexCRM\Services\FetchesPerfexCRMTask;
use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMCustomer;
use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMCustomerContact;
use App\Classes\Modules\PerfexCRM\Services\UpdatesPerfexCRMTask;
use App\Classes\Modules\PerfexCRM\Services\UpdatesPerfexCRMCustomer;
use App\Classes\Modules\PerfexCRM\Services\UpdatesPerfexCRMProject;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\CustomerContactObject;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\UpdatePerfexCRMObject;
use App\Classes\ValueObjects\Constants\PerfexCRMTaskStatus;
use App\Classes\ValueObjects\Constants\PerfexCRMProjectStatus;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Illuminate\Http\Request;
class UpdatePerfexCRMProcessor
{
/** @var ConvertsPerfexCRMLeadToCustomer */
private $convertsPerfexCRMLeadToCustomer;
/** @var CreatesPerfexCRMCustomerProject */
private $createsPerfexCRMCustomerProject;
/** @var CreatesPerfexCRMMilestone */
private $createsPerfexCRMMilestone;
/** @var CreatesPerfexCRMTask */
private $createsPerfexCRMTask;
/** @var FetchesPerfexCRMProject */
private $fetchesPerfexCRMProject;
/** @var FetchesPerfexCRMMilestone */
private $fetchesPerfexCRMMilestone;
/** @var FetchesPerfexCRMTask */
private $fetchesPerfexCRMTask;
/** @var CreatesPerfexCRMCustomer */
private $createsPerfexCRMCustomer;
/** @var CreatesPerfexCRMCustomerContact */
private $createsPerfexCRMCustomerContact;
/** @var UpdatesPerfexCRMTask */
private $updatesPerfexCRMTask;
/** @var UpdatesPerfexCRMCustomer */
private $updatesPerfexCRMCustomer;
/** @var UpdatesPerfexCRMProject */
private $updatesPerfexCRMProject;
/**
* @param ConvertsPerfexCRMLeadToCustomer $convertsPerfexCRMLeadToCustomer
* @param CreatesPerfexCRMCustomerProject $createsPerfexCRMCustomerProject
* @param CreatesPerfexCRMMilestone $createsPerfexCRMMilestone
* @param CreatesPerfexCRMTask $createsPerfexCRMTask
* @param FetchesPerfexCRMProject $fetchesPerfexCRMProject
* @param FetchesPerfexCRMMilestone $fetchesPerfexCRMMilestone
* @param FetchesPerfexCRMTask $fetchesPerfexCRMTask
* @param CreatesPerfexCRMCustomer $createsPerfexCRMCustomer
* @param CreatesPerfexCRMCustomerContact $createsPerfexCRMCustomerContact
* @param UpdatesPerfexCRMTask $updatesPerfexCRMTask
* @param UpdatesPerfexCRMCustomer $updatesPerfexCRMCustomer
* @param UpdatesPerfexCRMProject $updatesPerfexCRMProject
*/
public function __construct(ConvertsPerfexCRMLeadToCustomer $convertsPerfexCRMLeadToCustomer,
CreatesPerfexCRMCustomerProject $createsPerfexCRMCustomerProject,
CreatesPerfexCRMMilestone $createsPerfexCRMMilestone,
CreatesPerfexCRMTask $createsPerfexCRMTask,
FetchesPerfexCRMProject $fetchesPerfexCRMProject,
FetchesPerfexCRMMilestone $fetchesPerfexCRMMilestone,
FetchesPerfexCRMTask $fetchesPerfexCRMTask,
CreatesPerfexCRMCustomer $createsPerfexCRMCustomer,
CreatesPerfexCRMCustomerContact $createsPerfexCRMCustomerContact,
UpdatesPerfexCRMTask $updatesPerfexCRMTask,
UpdatesPerfexCRMCustomer $updatesPerfexCRMCustomer,
UpdatesPerfexCRMProject $updatesPerfexCRMProject)
{
$this->convertsPerfexCRMLeadToCustomer = $convertsPerfexCRMLeadToCustomer;
$this->createsPerfexCRMCustomerProject = $createsPerfexCRMCustomerProject;
$this->createsPerfexCRMMilestone = $createsPerfexCRMMilestone;
$this->createsPerfexCRMTask = $createsPerfexCRMTask;
$this->fetchesPerfexCRMProject = $fetchesPerfexCRMProject;
$this->fetchesPerfexCRMMilestone = $fetchesPerfexCRMMilestone;
$this->fetchesPerfexCRMTask = $fetchesPerfexCRMTask;
$this->createsPerfexCRMCustomer = $createsPerfexCRMCustomer;
$this->createsPerfexCRMCustomerContact = $createsPerfexCRMCustomerContact;
$this->updatesPerfexCRMTask = $updatesPerfexCRMTask;
$this->updatesPerfexCRMCustomer = $updatesPerfexCRMCustomer;
$this->updatesPerfexCRMProject = $updatesPerfexCRMProject;
}
/**
* @param UpdatePerfexCRMObject $updatePerfexCRMObject
* @return null|object
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(UpdatePerfexCRMObject $updatePerfexCRMObject) {
// 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();
$result = $this->convertsPerfexCRMLeadToCustomer->execute($updatePerfexCRMObject->getContactEmail());
if(isset($result->payload)){
$crmClientId = $result->payload['client_id'];
if (isset($result->payload['company'])) {
$crmCompany = $result->payload['company'];
}
}
else{
//if reach this point, this means this user is not a official customer nor is a lead in crm
//Create Customer has 2 parts: Create Company (client), Create Contact
$result = $this->createsPerfexCRMCustomer->execute($crmCompany);
if(is_null($result)){
$crmCompany = $crmCompany." 2";
$result = $this->createsPerfexCRMCustomer->execute($crmCompany);
}
$crmClientId = $result->payload['clientId'];
$customerContactObject = new CustomerContactObject(
$crmClientId,
$updatePerfexCRMObject->getContactName(),
$updatePerfexCRMObject->getContactName(),
$updatePerfexCRMObject->getContactEmail(),
"pU^T@sC#9Q",
"on",
"on"
);
$result = $this->createsPerfexCRMCustomerContact->execute($customerContactObject);
}
//Update custom fields to identify company reference from exchange or shipping portal
$value_exists = false;
if (isset($result->payload['customfields'])) {
foreach ($result->payload['customfields'] as $element) {
if ($element['value'] === $updatePerfexCRMObject->getCompanyReference()) {
$value_exists = true;
break;
}
}
}
if(!$value_exists);
{
$result = $this->updatesPerfexCRMCustomer->execute($crmClientId, $crmCompany, $updatePerfexCRMObject->getCompanyReference());
}
// Get existing or create project, project has to exist first before milestone can appear under it
$result = $this->createsPerfexCRMCustomerProject->execute($updatePerfexCRMObject->getProjectName(), $updatePerfexCRMObject->getProjectStatus(), $crmClientId);
if(isset($result->payload)){ //Here means project creation successful
$projectId = $result->payload['project_id'];
}
else{
$project = $this->fetchesPerfexCRMProject->execute($updatePerfexCRMObject->getProjectName(), $crmClientId);
$projectId = $project->id;
//if the project status is anything but PerfexCRMProjectStatus::NOT_STARTED, update the project
if($updatePerfexCRMObject->getProjectStatus() != PerfexCRMProjectStatus::NOT_STARTED)
{
$this->updatesPerfexCRMProject->execute($project, $updatePerfexCRMObject->getProjectStatus());
}
}
$tasks = $updatePerfexCRMObject->getTaskNames();
if(count($tasks) > 0){
//Create tasks with milestone
for($count=0; $count < count($tasks); $count++) {
$milestoneId = 0; //By default milestoneId is 0, having this set at individual task is optional
if($tasks[$count]['milestone'] != "") //Create milestone only if it is defined
{
// Get existing or create milestone, milestone has to exist first before task can appear under it
$result = $this->createsPerfexCRMMilestone->execute($tasks[$count]['milestone'], $projectId, $count);
if(isset($result->payload)){
$milestoneId = $result->payload['milestone_id'];
}
else{
$milestone = $this->fetchesPerfexCRMMilestone->execute($tasks[$count]['milestone'], $projectId);
$array = json_decode(json_encode($milestone), true);
$milestoneId = $array[0]['id'];
}
}
$taskStatus = PerfexCRMTaskStatus::NOT_STARTED;
if($tasks[$count]['status'] != ''){
$taskStatus = $tasks[$count]['status'];
}
// Get existing or create task
$result = $this->createsPerfexCRMTask->execute($tasks[$count]['name'], $tasks[$count]['description'], '', $milestoneId, $projectId, $tasks[$count]['reference'], $tasks[$count]['on_task_completion'], $taskStatus);
if(is_null($result)){
break; //Breaking the rest of the tasks in array assuming that they are all created as a batch previously
}
}
}
return true;
}
}
@@ -0,0 +1,34 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Services;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
class ConvertsPerfexCRMLeadToCustomer
{
/**
* @param string $email
* @return null|object
* @throws MalformedRequestException
*/
public function execute(string $email) {
try{
$response = Http::withHeaders([
'authtoken' => config('perfexcrm.api_key'),])
->get(config('perfexcrm.base_url').'/api/leads/convertocustomer/'.$email);
if($response->successful()){
$data = $response->json();
return (object) $data;
}else{
Log::error($response);
return null;
}
}catch(\Exception $exception){
throw new MalformedRequestException('Unable to get correct response from Perfex CRM server' . $exception->getMessage());
}
}
}
@@ -0,0 +1,37 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Services;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
class CreatesPerfexCRMCustomer
{
/**
* @param string $companyName
* @return null|object
* @throws MalformedRequestException
*/
public function execute(string $companyName) {
try{
$data = [
'company' => $companyName
];
$response = Http::asForm()->withHeaders([
'authtoken' => config('perfexcrm.api_key')])
->post(config('perfexcrm.base_url').'/api/customers',$data);
if($response->successful()){
$data = $response->json();
return (object) $data;
}else{
Log::error($response);
return null;
}
}catch(\Exception $exception){
throw new MalformedRequestException('Unable to get correct response from Perfex CRM server' . $exception->getMessage());
}
}
}
@@ -0,0 +1,44 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Services;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\CustomerContactObject;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
class CreatesPerfexCRMCustomerContact
{
/**
* @param CustomerContactObject $customerContactObject
* @return null|object
* @throws MalformedRequestException
*/
public function execute(CustomerContactObject $customerContactObject) {
try{
$data = [
'customer_id' => $customerContactObject->getCustomerId(),
'firstname' => $customerContactObject->getFirstName(),
'lastname' => $customerContactObject->getLastName(),
'email' => $customerContactObject->getEmail(), //$email
'password' => $customerContactObject->getPassword(),
'is_primary' => $customerContactObject->getIsPrimary(),
//'send_set_password_email' => $customerContactObject->getSendSetPasswordEmail(),
];
$response = Http::asForm()->withHeaders([
'authtoken' => config('perfexcrm.api_key')])
->post(config('perfexcrm.base_url').'/api/contacts',$data);
if($response->successful()){
$data = $response->json();
return (object) $data;
}else{
Log::error($response);
return null;
}
}catch(\Exception $exception){
throw new MalformedRequestException('Unable to get correct response from Perfex CRM server' . $exception->getMessage());
}
}
}
@@ -0,0 +1,43 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Services;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
class CreatesPerfexCRMCustomerProject
{
/**
* @param string $projectName
* @param string $clientId
* @return null|object
* @throws MalformedRequestException
*/
public function execute(string $projectName, int $status, string $clientId) {
try{
$data = [
'name' => $projectName,
'rel_type' => 'customer',
'billing_type' => 1,
'clientid' => $clientId,
'start_date' => date('Y-m-d'),
'status' => $status
];
$response = Http::asForm()->withHeaders([
'authtoken' => config('perfexcrm.api_key')])
->post(config('perfexcrm.base_url').'/api/projects',$data);
if($response->successful()){
$data = $response->json();
return (object) $data;
}else{
Log::error($response);
return null;
}
}catch(\Exception $exception){
throw new MalformedRequestException('Unable to get correct response from Perfex CRM server' . $exception->getMessage());
}
}
}
@@ -0,0 +1,60 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Services;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\InvoicePerfexCRMObject;
class CreatesPerfexCRMInvoice
{
/**
* @param InvoicePerfexCRMObject $invoicePerfexCRMObject
* @return null|object
* @throws MalformedRequestException
*/
public function execute(InvoicePerfexCRMObject $invoicePerfexCRMObject) {
try{
$data = [
'clientid' => $invoicePerfexCRMObject->getClientId(),
'number' => $invoicePerfexCRMObject->getNumber(),
'date' => $invoicePerfexCRMObject->getDate(),
'duedate' => $invoicePerfexCRMObject->getDueDate(),
'currency' => $invoicePerfexCRMObject->getCurrency(),
'subtotal' => number_format($invoicePerfexCRMObject->getSubTotal(), 2, '.', ''),
'total' => number_format($invoicePerfexCRMObject->getTotal(), 2, '.', ''),
'billing_street' => $invoicePerfexCRMObject->getBillingStreet(),
'project_id' => $invoicePerfexCRMObject->getProjectId(),
'allowed_payment_modes[0]' => 1,
'allowed_payment_modes[1]' => 2,
];
for($count=0; $count < count($invoicePerfexCRMObject->getInvoiceItems()); $count++) {
$oneItem = [
"newitems[".$count."][description]" => $invoicePerfexCRMObject->getInvoiceItems()[$count]->description,
"newitems[".$count."][long_description]" => $invoicePerfexCRMObject->getInvoiceItems()[$count]->longDescription,
"newitems[".$count."][qty]" => $invoicePerfexCRMObject->getInvoiceItems()[$count]->qty,
"newitems[".$count."][rate]" => $invoicePerfexCRMObject->getInvoiceItems()[$count]->rate,
"newitems[".$count."][order]" => $invoicePerfexCRMObject->getInvoiceItems()[$count]->order,
"newitems[".$count."][unit]" => $invoicePerfexCRMObject->getInvoiceItems()[$count]->unit,
];
$data = array_merge($data, $oneItem);
}
$response = Http::asForm()->withHeaders([
'authtoken' => config('perfexcrm.api_key')])
->post(config('perfexcrm.base_url').'/api/invoices',$data);
if($response->successful()){
$data = $response->json();
return (object) $data;
}else{
Log::error($response);
return null;
}
}catch(\Exception $exception){
throw new MalformedRequestException('Unable to get correct response from Perfex CRM server' . $exception->getMessage());
}
}
}
@@ -0,0 +1,43 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Services;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\InvoicePaymentPerfexCRMObject;
class CreatesPerfexCRMInvoicePayment
{
/**
* @param InvoicePaymentPerfexCRMObject $invoicePaymentPerfexCRMObject
* @return null|object
* @throws MalformedRequestException
*/
public function execute(InvoicePaymentPerfexCRMObject $invoicePaymentPerfexCRMObject) {
try{
$data = [
'invoiceid' => $invoicePaymentPerfexCRMObject->getInvoiceId(),
'amount' => number_format($invoicePaymentPerfexCRMObject->getAmount(), 2, '.', ''),
'date' => $invoicePaymentPerfexCRMObject->getDate(),
'paymentmode' => $invoicePaymentPerfexCRMObject->getPaymentMode(),
'transactionid' => $invoicePaymentPerfexCRMObject->getTransactionId(),
'note' => $invoicePaymentPerfexCRMObject->getNote(),
];
$response = Http::asForm()->withHeaders([
'authtoken' => config('perfexcrm.api_key')])
->post(config('perfexcrm.base_url').'/api/invoices/recordpayment',$data);
if($response->successful()){
$data = $response->json();
return (object) $data;
}else{
Log::error($response);
return null;
}
}catch(\Exception $exception){
throw new MalformedRequestException('Unable to get correct response from Perfex CRM server' . $exception->getMessage());
}
}
}
@@ -0,0 +1,50 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Services;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
use App\Classes\Modules\PerfexCRM\DataTransferObjects\CreateLeadPerfexCRMObject;
class CreatesPerfexCRMLead
{
/**
* @param CreateLeadPerfexCRMObject $createLeadPerfexCRMObject
* @return null|object
* @throws MalformedRequestException
*/
public function execute(CreateLeadPerfexCRMObject $createLeadPerfexCRMObject) {
try{
$custom_fields = [
"leads" => [
3 => $createLeadPerfexCRMObject->getCompanyReference()
]
];
$data = [
'name' => $createLeadPerfexCRMObject->getName(),
'email' => $createLeadPerfexCRMObject->getEmail(),
'phonenumber' => $createLeadPerfexCRMObject->getPhone(),
'company' => $createLeadPerfexCRMObject->getCompanyName(),
'source' => 1, //1: Exchange, 2: Shipping Portal
'status' => 2, //2: Lead, 1: Customer,
'custom_fields' => $custom_fields
];
$response = Http::asForm()->withHeaders([
'authtoken' => config('perfexcrm.api_key')])
->post(config('perfexcrm.base_url').'/api/leads/byemail',$data);
if($response->successful()){
$data = $response->json();
return (object) $data;
}else{
Log::error($response);
return null;
}
}catch(\Exception $exception){
throw new MalformedRequestException('Unable to get correct response from Perfex CRM server' . $exception->getMessage());
}
}
}
@@ -0,0 +1,46 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Services;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
class CreatesPerfexCRMMilestone
{
/**
* @param string $$milestoneName
* @param string $projectId
* @param string $milestoneOrder
* @return null|object
* @throws MalformedRequestException
*/
public function execute(string $milestoneName, string $projectId, string $milestoneOrder = "") {
try{
$data = [
'name' => $milestoneName,
'project_id' => $projectId,
'due_date' => date('Y-m-d'),
'start_date' => date('Y-m-d')
];
if($milestoneOrder != ""){
$data['milestone_order'] = $milestoneOrder;
}
$response = Http::asForm()->withHeaders([
'authtoken' => config('perfexcrm.api_key')])
->post(config('perfexcrm.base_url').'/api/milestones',$data);
if($response->successful()){
$data = $response->json();
return (object) $data;
}else{
Log::error($response);
return null;
}
}catch(\Exception $exception){
throw new MalformedRequestException('Unable to get correct response from Perfex CRM server' . $exception->getMessage());
}
}
}
@@ -0,0 +1,68 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Services;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
class CreatesPerfexCRMTask
{
/**
* @param string $taskName
* @param string $taskDescription
* @param string $leadId
* @param string $milestoneId
* @param string $projectId
* @param string $reference, default: ''
* @param string $on_task_completion, default: ''
* @param string $status, default: 1
* @return null|object
* @throws MalformedRequestException
*/
public function execute(string $taskName, string $taskDescription, string $leadId, string $milestoneId, string $projectId, string $reference = '', string $on_task_completion = '', string $status = "1") {
try{
$data = [
'name' => $taskName,
'description' => $taskDescription,
'milestone' => $milestoneId,
'startdate' => date('Y-m-d'),
'rel_type' => 'project',
'rel_id' => $projectId,
'status' => $status,
'is_system_created' => 1,
'reference' => $reference,
'on_task_completion' => $on_task_completion
];
if($leadId != '') {
$data = [
'name' => $taskName,
'description' => $taskDescription,
'milestone' => $milestoneId,
'startdate' => date('Y-m-d'),
'rel_type' => 'lead',
'rel_id' => $leadId,
'status' => $status,
'is_system_created' => 1,
'reference' => $reference,
'on_task_completion' => $on_task_completion
];
}
$response = Http::asForm()->withHeaders([
'authtoken' => config('perfexcrm.api_key')])
->post(config('perfexcrm.base_url').'/api/tasks',$data);
if($response->successful()){
$data = $response->json();
return (object) $data;
}else{
Log::error($response);
return null;
}
}catch(\Exception $exception){
throw new MalformedRequestException('Unable to get correct response from Perfex CRM server' . $exception->getMessage());
}
}
}
@@ -0,0 +1,34 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Services;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
class FetchesPerfexCRMCustomer
{
/**
* @param string $email
* @return null|object
* @throws MalformedRequestException
*/
public function execute(string $email) {
try{
$response = Http::withHeaders([
'authtoken' => config('perfexcrm.api_key'),])
->get(config('perfexcrm.base_url').'/api/customers/byemail/'.$email);
if($response->successful()){
$data = $response->json();
return (object) $data;
}else{
Log::error($response);
return null;
}
}catch(\Exception $exception){
throw new MalformedRequestException('Unable to get correct response from Perfex CRM server: ' . $exception->getMessage());
}
}
}
@@ -0,0 +1,36 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Services;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
class FetchesPerfexCRMInvoice
{
/**
* @param string $clientId
* @param string $invoicePrefix
* @param string $invoiceNumber
* @return null|object
* @throws MalformedRequestException
*/
public function execute(string $clientId, string $invoicePrefix, string $invoiceNumber) {
try{
$response = Http::withHeaders([
'authtoken' => config('perfexcrm.api_key'),])
->get(config('perfexcrm.base_url').'/api/invoices/customsearch/'.$clientId.'/'.$invoicePrefix.'/'.$invoiceNumber);
if($response->successful()){
$data = $response->json();
return (object) $data;
}else{
Log::error($response);
return null;
}
}catch(\Exception $exception){
throw new MalformedRequestException('Unable to get correct response from Perfex CRM server: ' . $exception->getMessage());
}
}
}
@@ -0,0 +1,34 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Services;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
class FetchesPerfexCRMLead
{
/**
* @param string $email
* @return null|object
* @throws MalformedRequestException
*/
public function execute(string $email) {
try{
$response = Http::withHeaders([
'authtoken' => config('perfexcrm.api_key'),])
->get(config('perfexcrm.base_url').'/api/leads/byemail/'.$email);
if($response->successful()){
$data = $response->json();
return (object) $data;
}else{
Log::error($response);
return null;
}
}catch(\Exception $exception){
throw new MalformedRequestException('Unable to get correct response from Perfex CRM server: ' . $exception->getMessage());
}
}
}
@@ -0,0 +1,35 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Services;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
class FetchesPerfexCRMMilestone
{
/**
* @param string $milestoneName
* @param string $projectId
* @return null|object
* @throws MalformedRequestException
*/
public function execute(string $milestoneName, string $projectId) {
try{
$response = Http::withHeaders([
'authtoken' => config('perfexcrm.api_key'),])
->get(config('perfexcrm.base_url').'/api/milestones/bynameandprojectid/'.rawurlencode($milestoneName).'/'.$projectId);
if($response->successful()){
$data = $response->json();
return (object) $data;
}else{
Log::error($response);
return null;
}
}catch(\Exception $exception){
throw new MalformedRequestException('Unable to get correct response from Perfex CRM server' . $exception->getMessage());
}
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Services;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
class FetchesPerfexCRMProject
{
/**
* @param string $projectName
* @param string $clientId
* @return null|object
* @throws MalformedRequestException
*/
public function execute(string $projectName, string $clientId) {
try{
$data = [
'name' => $projectName,
'clientid' => $clientId,
];
$response = Http::asForm()->withHeaders([
'authtoken' => config('perfexcrm.api_key')])
->post(config('perfexcrm.base_url').'/api/projects/bynameandclientid', $data);
if($response->successful()){
$data = $response->json();
return (object) $data;
}else{
Log::error($response);
return null;
}
}catch(\Exception $exception){
throw new MalformedRequestException('Unable to get correct response from Perfex CRM server' . $exception->getMessage());
}
}
}
@@ -0,0 +1,35 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Services;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
class FetchesPerfexCRMTask
{
/**
* @param string $taskName
* @param string $milestoneId
* @return null|object
* @throws MalformedRequestException
*/
public function execute(string $taskName, string $milestoneId) {
try{
$response = Http::withHeaders([
'authtoken' => config('perfexcrm.api_key'),])
->get(config('perfexcrm.base_url').'/api/tasks/bynameandmilestoneid/'.rawurlencode($taskName).'/'.$milestoneId);
if($response->successful()){
$data = $response->json();
return (object) $data;
}else{
Log::error($response);
return null;
}
}catch(\Exception $exception){
throw new MalformedRequestException('Unable to get correct response from Perfex CRM server' . $exception->getMessage());
}
}
}
@@ -0,0 +1,46 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Services;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
class UpdatesPerfexCRMCustomer
{
/**
* @param string $customerId
* @param string $companyReference
* @return null|object
* @throws MalformedRequestException
*/
public function execute(string $customerId, string $companyName, string $companyReference) {
try{
$custom_fields = [
"customers" => [
1 => $companyReference
]
];
$data = [
'company' => $companyName,
'custom_fields' => $custom_fields
];
$response = Http::asJson()->withHeaders([
'authtoken' => config('perfexcrm.api_key')])
->put(config('perfexcrm.base_url').'/api/customers/'.$customerId, $data);
if($response->successful()){
$data = $response->json();
return (object) $data;
}else{
Log::error($response);
return null;
}
}catch(\Exception $exception){
throw new MalformedRequestException('Unable to get correct response from Perfex CRM server' . $exception->getMessage());
}
}
}
@@ -0,0 +1,68 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Services;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
class UpdatesPerfexCRMInvoice
{
/**
* @param $invoice
* @param string $projectId
* @return null|object
* @throws MalformedRequestException
*/
public function execute($invoice, string $projectId) {
try{
// <p>The Invoice number field is required.<\/p>
// <p>The Invoice date field is required.<\/p>
// <p>The Currency field is required.<\/p>
// <p>The Items field is required.<\/p>
// <p>The Allow Payment Mode field is required.<\/p>
// <p>The Billing Street field is required.<\/p>
// <p>The Sub Total field is required.<\/p>
// <p>The Total field is required.<\/p>
$newInvoiceItems = [];
foreach ($invoice->items as $item) {
$item['itemid'] = $item['id'];
unset($item['id']);
$item['order'] = $item['item_order'];
unset($item['item_order']);
array_push($newInvoiceItems,$item);
}
$data = [
'number' => $invoice->number,
'date' => $invoice->date,
'duedate' => $invoice->date,
'currency' => $invoice->currency,
'subtotal' => $invoice->subtotal,
'total' => $invoice->total,
'billing_street' => $invoice->billing_street,
'shipping_street' => $invoice->billing_street,
'project_id' => $projectId,
'items' => $newInvoiceItems,
'allowed_payment_modes' => $invoice->allowed_payment_modes,
];
$response = Http::asJson()->withHeaders([
'authtoken' => config('perfexcrm.api_key')])
->put(config('perfexcrm.base_url').'/api/invoices/'.$invoice->id, $data);
if($response->successful()){
$data = $response->json();
return (object) $data;
}else{
Log::error($response);
return null;
}
}catch(\Exception $exception){
dd(json_encode($exception));
throw new MalformedRequestException('Unable to get correct response from Perfex CRM server: ' . $exception->getMessage());
}
}
}
@@ -0,0 +1,50 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Services;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
class UpdatesPerfexCRMLead
{
/**
* @param $lead
* @param string $companyReference
* @return null|object
* @throws MalformedRequestException
*/
public function execute($lead, string $companyReference) {
try{
$custom_fields = [
"leads" => [
3 => $companyReference
]
];
$data = [
'name' => $lead->name,
'email' => $lead->email,
'phonenumber' => $lead->phonenumber,
'company' => $lead->company,
'custom_fields' => $custom_fields,
'source' => $lead->source,
'status' => $lead->status,
];
$response = Http::asJson()->withHeaders([
'authtoken' => config('perfexcrm.api_key')])
->put(config('perfexcrm.base_url').'/api/leads/'.$lead->id, $data);
if($response->successful()){
$data = $response->json();
return (object) $data;
}else{
Log::error($response);
return null;
}
}catch(\Exception $exception){
throw new MalformedRequestException('Unable to get correct response from Perfex CRM server: ' . $exception->getMessage());
}
}
}
@@ -0,0 +1,43 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Services;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
class UpdatesPerfexCRMProject
{
/**
* @param $project
* @param int $status
* @return null|object
* @throws MalformedRequestException
*/
public function execute($project, int $status) {
try{
$data = [
'name' => $project->name,
'clientid' => $project->clientid,
// 'rel_type' => 'customer',
'billing_type' => 1,
'start_date' => $project->start_date,
'status' => $status
];
$response = Http::asJson()->withHeaders([
'authtoken' => config('perfexcrm.api_key')])
->put(config('perfexcrm.base_url').'/api/projects/'.$project->id, $data);
if($response->successful()){
$data = $response->json();
return (object) $data;
}else{
Log::error($response);
return null;
}
}catch(\Exception $exception){
throw new MalformedRequestException('Unable to get correct response from Perfex CRM server: ' . $exception->getMessage());
}
}
}
@@ -0,0 +1,48 @@
<?php
namespace App\Classes\Modules\PerfexCRM\Services;
use Illuminate\Support\Facades\Http;
use App\Classes\Exceptions\MalformedRequestException;
use Illuminate\Support\Facades\Log;
class UpdatesPerfexCRMTask
{
/**
* @param string $taskName
* @param string $milestoneId
* @param string $projectId
* @param string $status, default: 1
* @return null|object
* @throws MalformedRequestException
*/
public function execute(string $taskId, string $taskName, string $milestoneId, string $projectId, string $status = "1") {
try{
$data = [
'name' => $taskName,
'milestone' => $milestoneId,
'startdate' => date('Y-m-d'),
'duedate' => date('Y-m-d'),
'rel_type' => 'project',
'rel_id' => $projectId,
'status' => $status,
'repeat_every' => '',
];
$response = Http::asJson()->withHeaders([
'authtoken' => config('perfexcrm.api_key')])
->put(config('perfexcrm.base_url').'/api/tasks/'.$taskId, $data);
if($response->successful()){
$data = $response->json();
return (object) $data;
}else{
Log::error($response);
return null;
}
}catch(\Exception $exception){
throw new MalformedRequestException('Unable to get correct response from Perfex CRM server' . $exception->getMessage());
}
}
}
@@ -18,6 +18,7 @@ use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\SegmentConstants;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Classes\ValueObjects\Constants\DocumentType;
use App\Classes\Jobs\CreatePerfexCRMInvoice;
use App\Models\Booking;
use App\Models\SegmentConstant;
@@ -51,6 +52,7 @@ class CreateInvoiceTransactionProcessor
/** @var CreateInvoiceDocumentProcessor */
private $invoiceDocumentProcessor;
/**
* CreateInvoiceTransactionProcessor constructor.
* @param ListsTransactions $listsTransactions
@@ -192,6 +194,11 @@ class CreateInvoiceTransactionProcessor
// supply deliver order
$this->invoiceDocumentProcessor->execute($supplier_deliver_order_transaction, $purchaseOrder, $supplier, DocumentType::SUPPLIER_DELIVER_ORDER);
// update perfex crm
if(config('perfexcrm.is_enabled') == 'true'){
CreatePerfexCRMInvoice::dispatch($invoice_transaction, $purchaseOrder, $supplier);
}
$this->updatesBookingStatus->execute($booking, ApprovalStatus::COMPLETED);
}
}
@@ -27,6 +27,9 @@ class UpdateWalletTransactionProcessor
/** @var UpdatesTransactionStatus */
private $updatesTransactionStatus;
/** @var UpdatesWallet */
private $updatesWallet;
public function __construct(UpdatesTransactionStatus $updatesTransactionStatus, UpdatesWallet $updatesWallet, FetchesTransaction $fetchesTransaction)
{
$this->fetchesTransaction = $fetchesTransaction;
@@ -4,9 +4,27 @@ namespace App\Classes\Modules\Transactions\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Models\Transaction;
use App\Classes\Modules\PerfexCRM\Processors\TransactionToPerfexCRMProcessor;
use App\Classes\Modules\PerfexCRM\Processors\NewLeadTaskToPerfexCRMProcessor;
class UpdatesTransactionStatus extends AbstractUpdateRecord
{
/** @var TransactionToPerfexCRMProcessor */
private $transactionToPerfexCRMProcessor;
/** @var NewLeadTaskToPerfexCRMProcessor */
private $newLeadTaskToPerfexCRMProcessor;
/**
* UpdatesTransactionStatus constructor.
* @param TransactionToPerfexCRMProcessor $transactionToPerfexCRMProcessor
* @param NewLeadTaskToPerfexCRMProcessor $newLeadTaskToPerfexCRMProcessor
*/
public function __construct(TransactionToPerfexCRMProcessor $transactionToPerfexCRMProcessor, NewLeadTaskToPerfexCRMProcessor $newLeadTaskToPerfexCRMProcessor)
{
$this->transactionToPerfexCRMProcessor = $transactionToPerfexCRMProcessor;
$this->newLeadTaskToPerfexCRMProcessor = $newLeadTaskToPerfexCRMProcessor;
}
/**
* @param Transaction $model
@@ -16,8 +34,12 @@ class UpdatesTransactionStatus extends AbstractUpdateRecord
*/
public function execute(Transaction $model, int $status)
{
if(config('perfexcrm.is_enabled') == 'true'){
$this->transactionToPerfexCRMProcessor->execute($model, $status);
// $this->newLeadTaskToPerfexCRMProcessor->execute();
}
$model->status = $status;
return $this->handler($model);
}
}
}
@@ -0,0 +1,14 @@
<?php
namespace App\Classes\ValueObjects\Constants;
final class PerfexCRMInvoiceStatus {
public const UNPAID = 1;
public const PAID = 2;
public const PARTIALLY_PAID = 3;
public const OVERDUE = 4;
}
@@ -0,0 +1,12 @@
<?php
namespace App\Classes\ValueObjects\Constants;
class PerfexCRMMilestones
{
public const MILESTONE_1 = 'MILESTONE 1 - Customer Paid';
public const MILESTONE_2 = 'MILESTONE 2 - Order Placed';
public const MILESTONE_3 = 'MILESTONE 3 - Purchase Order Approved';
public const MILESTONE_4 = 'MILESTONE 4';
public const MILESTONE_5 = 'MILESTONE 5';
}
@@ -0,0 +1,16 @@
<?php
namespace App\Classes\ValueObjects\Constants;
final class PerfexCRMProjectStatus {
public const NOT_STARTED = 1;
public const IN_PROGRESS = 2;
public const ON_HOLD = 3;
public const FINISHED = 4;
public const CANCELLED = 5;
}
@@ -0,0 +1,17 @@
<?php
namespace App\Classes\ValueObjects\Constants;
final class PerfexCRMTaskStatus {
public const NOT_STARTED = 1;
public const AWAITING_FEEDBACK = 2;
public const TESTING = 3;
public const IN_PROGRESS = 4;
public const COMPLETED = 5;
}
@@ -0,0 +1,455 @@
<?php
namespace App\Classes\ValueObjects\Constants;
class PerfexCRMTasks
{
public const TASK_1 = [
'name' => 'Customer Paid',
'description' => '',
'milestone' => 'MILESTONE 1 - Customer Paid',
'reference' => '',
'on_task_completion' => '',
'status' => PerfexCRMTaskStatus::COMPLETED
];
public const TASK_1_DAY_TRANSFER_1 = [
'name' => 'Map Bank Transaction Record',
'description' => '○ Purpose: To map a transaction to bank transaction in the bank statement<br>
○ Initial Status: <b>In Progress</b> <br>
○ Deadline: If payment is created before 4:30 pm, it must be made on the same day. If payment is created after 4:30 pm, it must be made the next day <br>
○ Responsible department: Accounts <br>
○ Next step: Change the status of the Approve payment status to "In Progress" upon successful completion of the operation. <br>
○ Additional details: ** Any specific requirements or notes for the operation.** <br>
○ Dependencies: None <br>
○ Outcomes: Bank transaction is mapped successfully, allowing the next steps in the process to be initiated. <br>',
'milestone' => '',
'reference' => 'TASK_1_DAY_TRANSFER_1',
'on_task_completion' => 'TASK_1_DAY_TRANSFER_2',
'status' => PerfexCRMTaskStatus::IN_PROGRESS
];
public const TASK_1_DAY_TRANSFER_2 = [
'name' => 'Approve Payment',
'description' => '○ Purpose: To verify and approve the customer\'s payment on exchange<br>
○ Initial Status: Not Started<br>
○ Deadline:If payment is created before 4:30 pm, it must be made on the same day. If payment is created after 4:30 pm, it must be made the next day<br>
○ Responsible department: Accounts<br>
○ Next step:<br>
i. Change the status of the Issue Exchange Autocount Invoice operation to "In Progress"<br>
ii. Change the status of the Order Placed in White Form operation to "In Progress" upon successful completion.<br>
○ Additional details: When the payment method is FPX or Wallet this task is performed automatically by the system.<br>
○ Dependencies: Map Transaction operation must be completed before this operation can begin.<br>
○ 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',
'status' => ''
];
public const TASK_1_DAY_TRANSFER_3 = [
'name' => 'Issue Exchange Autocount Invoince',
'description' => '○ Purpose: To issue an invoice for the customer\'s payment in accounting software.<br>
○ Initial Status: Not Started<br>
○ Deadline: Next day<br>
○ Responsible department: Accounts<br>
○ Next step: Change the status of the Knockoff Invoice operation to "In Progress" upon successful completion.<br>
○ Additional details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: Approve Payment operation must be completed before this operation can begin.<br>
○ Outcomes: An invoice will be issued in accounting software for the customer\'s payment.<br>',
'milestone' => '',
'reference' => 'TASK_1_DAY_TRANSFER_3',
'on_task_completion' => 'TASK_1_DAY_TRANSFER_4',
'status' => ''
];
public const TASK_1_DAY_TRANSFER_4 = [
'name' => 'Knockoff Invoice',
'description' => '○ Purpose: The purpose of this operation is to issue the official receipt and knockoff with invoice for the customer\'s payment.<br>
○ Initial Status: Not Started<br>
○ Deadline: Next day.<br>
○ Responsible Department: Accounts<br>
○ Next Step: None<br>
○ Additional Details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: Issue Exchange Autocount Invoice operation must be completed before this operation can begin.<br>
○ Outcomes: The customer\'s payment is applied to the accounting software invoice and invoice is marked as paid.<br>',
'milestone' => '',
'reference' => 'TASK_1_DAY_TRANSFER_4',
'on_task_completion' => 'TASK_1_DAY_TRANSFER_5',
'status' => ''
];
public const TASK_1_DAY_TRANSFER_5 = [
'name' => 'Order Placed in White Form',
'description' => '○ Purpose: To confirm that the order has been placed with the supplier.<br>
○ Initial Status: Not Started<br>
○ Deadline: Same day<br>
○ Responsible department: Operations<br>
○ Next step: Change the status of Upload China Bank Slip operation to "In Progress" upon successful completion.<br>
○ Additional details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: Approve Payment operation must be completed before this operation can begin.<br>
○ Outcomes: The order is placed with a supplier and the customer\'s order is confirmed.<br>',
'milestone' => '',
'reference' => 'TASK_1_DAY_TRANSFER_5',
'on_task_completion' => 'TASK_1_DAY_TRANSFER_6',
'status' => ''
];
public const TASK_1_DAY_TRANSFER_6 = [
'name' => 'Upload China Bank Slip',
'description' => '○ Purpose: To confirm that the customer order has been transferred to the customer\'s supplier.<br>
○ Initial Status: Not Started<br>
○ Deadline: Next day<br>
○ Responsible department: Operations<br>
○ Next step: None<br>
○ Additional details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: Order Placed in White Form operation must be completed before this operation can begin.<br>
○ Outcomes: The customer can download the payment transfer proof to send to their supplier.<br>',
'milestone' => '',
'reference' => 'TASK_1_DAY_TRANSFER_6',
'on_task_completion' => '',
'status' => ''
];
public const TASK_3_DAY_TRANSFER_1 = [
'name' => 'Map Bank Transaction Record',
'description' => '○ Purpose: To map a transaction to bank transaction in the bank statement<br>
○ Initial Status: <b>In Progress</b> <br>
○ Deadline: If payment is created before 4:30 pm, it must be made on the same day. If payment is created after 4:30 pm, it must be made the next day <br>
○ Responsible department: Accounts <br>
○ Next step: Change the status of the Approve payment status to "In Progress" upon successful completion of the operation. <br>
○ Additional details: ** Any specific requirements or notes for the operation.** <br>
○ Dependencies: None <br>
○ Outcomes: Bank transaction is mapped successfully, allowing the next steps in the process to be initiated. <br>',
'milestone' => '',
'reference' => 'TASK_3_DAY_TRANSFER_1',
'on_task_completion' => 'TASK_3_DAY_TRANSFER_2',
'status' => PerfexCRMTaskStatus::IN_PROGRESS
];
public const TASK_3_DAY_TRANSFER_2 = [
'name' => 'Approve Payment',
'description' => '○ Purpose: To verify and approve the customer\'s payment on exchange<br>
○ Initial Status: Not Started<br>
○ Deadline:If payment is created before 4:30 pm, it must be made on the same day. If payment is created after 4:30 pm, it must be made the next day<br>
○ Responsible department: Accounts<br>
○ Next step:<br>
i. Change the status of the Issue Exchange Autocount Invoice operation to "In Progress"<br>
ii. Change the status of the Order Placed in White Form operation to "In Progress" upon successful completion.<br>
○ Additional details: When the payment method is FPX or Wallet this task is performed automatically by the system.<br>
○ Dependencies: Map Transaction operation must be completed before this operation can begin.<br>
○ Outcomes: The payment will be approved in exchange, allowing the next steps in the process to be initiated.<br>',
'milestone' => '',
'reference' => 'TASK_3_DAY_TRANSFER_2',
'on_task_completion' => 'TASK_3_DAY_TRANSFER_3',
'status' => ''
];
public const TASK_3_DAY_TRANSFER_3 = [
'name' => 'Issue Exchange Autocount Invoince',
'description' => '○ Purpose: To issue an invoice for the customer\'s payment in accounting software.<br>
○ Initial Status: Not Started<br>
○ Deadline: Next day<br>
○ Responsible department: Accounts<br>
○ Next step: Change the status of the Knockoff Invoice operation to "In Progress" upon successful completion.<br>
○ Additional details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: Approve Payment operation must be completed before this operation can begin.<br>
○ Outcomes: An invoice will be issued in accounting software for the customer\'s payment.<br>',
'milestone' => '',
'reference' => 'TASK_3_DAY_TRANSFER_3',
'on_task_completion' => 'TASK_3_DAY_TRANSFER_4',
'status' => ''
];
public const TASK_3_DAY_TRANSFER_4 = [
'name' => 'Knockoff Invoice',
'description' => '○ Purpose: The purpose of this operation is to issue the official receipt and knockoff with invoice for the customer\'s payment.<br>
○ Initial Status: Not Started<br>
○ Deadline: Next day.<br>
○ Responsible Department: Accounts<br>
○ Next Step: None<br>
○ Additional Details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: Issue Exchange Autocount Invoice operation must be completed before this operation can begin.<br>
○ Outcomes: The customer\'s payment is applied to the accounting software invoice and invoice is marked as paid.<br>',
'milestone' => '',
'reference' => 'TASK_3_DAY_TRANSFER_4',
'on_task_completion' => 'TASK_3_DAY_TRANSFER_5',
'status' => ''
];
public const TASK_3_DAY_TRANSFER_5 = [
'name' => 'Order Placed in White Form',
'description' => '○ Purpose: To confirm that the order has been placed with the supplier.<br>
○ Initial Status: Not Started<br>
○ Deadline: After 2 days<br>
○ Responsible department: Operations<br>
○ Next step: Change the status of Upload China Bank Slip operation to "In Progress" upon successful completion.<br>
○ Additional details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: Approve Payment operation must be completed before this operation can begin.<br>
○ Outcomes: The order is placed with a supplier and the customer\'s order is confirmed.<br>',
'milestone' => '',
'reference' => 'TASK_3_DAY_TRANSFER_5',
'on_task_completion' => 'TASK_3_DAY_TRANSFER_6',
'status' => ''
];
public const TASK_3_DAY_TRANSFER_6 = [
'name' => 'Upload China Bank Slip',
'description' => '○ Purpose: To confirm that the customer order has been transferred to the customer\'s supplier.<br>
○ Initial Status: Not Started<br>
○ Deadline: After 3 days<br>
○ Responsible department: Operations<br>
○ Next step: None<br>
○ Additional details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: Order Placed in White Form operation must be completed before this operation can begin.<br>
○ Outcomes: The customer can download the payment transfer proof to send to their supplier.<br>',
'milestone' => '',
'reference' => 'TASK_3_DAY_TRANSFER_6',
'on_task_completion' => '',
'status' => ''
];
public const TASK_1688_PAYMENT_1 = [
'name' => 'Map Bank Transaction Record',
'description' => '○ Purpose: To map a transaction to bank transaction in the bank statement<br>
○ Initial Status: In Progress<br>
○ Deadline: If payment is created before 4:30 pm, it must be made on the same day. If payment is created after 4:30 pm, it must be made the next day<br>
○ Responsible department: Accounts<br>
○ Next step: Change the status of the Approve payment status to "In Progress" upon successful completion of the operation.<br>
○ Additional details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: None<br>
○ Outcomes: Bank transaction is mapped successfully, allowing the next<br>
steps in the process to be initiated.<br>',
'milestone' => '',
'reference' => 'TASK_1688_PAYMENT_1',
'on_task_completion' => 'TASK_1688_PAYMENT_2',
'status' => PerfexCRMTaskStatus::IN_PROGRESS
];
public const TASK_1688_PAYMENT_2 = [
'name' => 'Approve Payment',
'description' => '○ Purpose: To verify and approve the customer\'s payment on exchange<br>
○ Initial Status: Not Started<br>
○ Deadline:If payment is created before 4:30 pm, it must be made on the same day. If payment is created after 4:30 pm, it must be made the next day<br>
○ Responsible department: Accounts<br>
○ Next step:<br>
i. Change the status of the Issue Exchange Autocount Invoice operation to "In Progress"<br>
ii. Change the status of the Order Placed in White Form operation to "In Progress" upon successful completion.<br>
○ Additional details: When the payment method is FPX or Wallet this task is performed automatically by the system.<br>
○ Dependencies: Map Transaction operation must be completed before this operation can begin.<br>
○ 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',
'status' => ''
];
public const TASK_1688_PAYMENT_3 = [
'name' => 'Issue Exchange Autocount Invoice',
'description' => '○ Purpose: To issue an invoice for the customer\'s payment in accounting software.<br>
○ Initial Status: Not Started<br>
○ Deadline: Next day<br>
○ Responsible department: Accounts<br>
○ Next step: Change the status of the Knockoff Invoice operation to "In Progress" upon successful completion.<br>
○ Additional details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: Approve Payment operation must be completed before this operation can begin.<br>
○ Outcomes: An invoice will be issued in accounting software for the customer\'s payment.<br>',
'milestone' => '',
'reference' => 'TASK_1688_PAYMENT_3',
'on_task_completion' => 'TASK_1688_PAYMENT_4',
'status' => ''
];
public const TASK_1688_PAYMENT_4 = [
'name' => 'Knockoff Invoice',
'description' => '○ Purpose: The purpose of this operation is to issue the official receipt and knockoff with invoice for the customer\'s payment.<br>
○ Initial Status: Not Started<br>
○ Deadline: Next day.<br>
○ Responsible Department: Accounts<br>
○ Next Step: None<br>
○ Additional Details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: Issue Exchange Autocount Invoice operation must be completed before this operation can begin.<br>
○ Outcomes: The customer\'s payment is applied to the accounting software invoice and invoice is marked as paid.<br>',
'milestone' => '',
'reference' => 'TASK_1688_PAYMENT_4',
'on_task_completion' => 'TASK_1688_PAYMENT_5',
'status' => ''
];
public const TASK_1688_PAYMENT_5 = [
'name' => 'Order Placed in White Form',
'description' => '○ Purpose: To confirm that the order has been placed with the supplier.<br>
○ Initial Status: Not Started<br>
○ Deadline: Same Day<br>
○ Responsible department: Operations<br>
○ Next step: Change the status of Send White Form to Operation<br>
Department operation to "In Progress" upon successful completion.<br>
○ Additional details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: Approve Payment operation must be completed before this operation can begin.<br>
○ 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',
'status' => ''
];
public const TASK_1688_PAYMENT_6 = [
'name' => 'Send White Form to Operation Department',
'description' => '○ Purpose: To give confirmation to the operation department to process the order.<br>
○ Initial Status: Not Started<br>
○ Deadline: Same day<br>
○ Responsible department: Operations<br>
○ Next step: Change the status of Upload China Bank Slip operation to "In Progress" upon successful completion.<br>
○ Additional details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: Order Placed in White Form operation must be completed before this operation can begin.<br>
○ Outcomes: The customer\'s order is confirmed and placed in a white form.<br>',
'milestone' => '',
'reference' => 'TASK_1688_PAYMENT_6',
'on_task_completion' => 'TASK_1688_PAYMENT_7',
'status' => ''
];
public const TASK_1688_PAYMENT_7 = [
'name' => 'Authorize Customer\'s 1688 Account',
'description' => '○ Purpose: To authorize the alipay account to make payment to the customer\'s 1688 account.<br>
○ Initial Status: Not Started<br>
○ Deadline: Same day<br>
○ Responsible department: Operations<br>
○ Next step: Change the status of Make Payment for Customer 1688<br>
Order operation to "In Progress" upon successful completion.<br>
○ Additional details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: Send White Form to Operation Department operation<br>
must be completed before this operation can begin.<br>
○ Outcomes: The customer\'s 1688 account is authorized to use the alipay account for making payments.<br>',
'milestone' => '',
'reference' => 'TASK_1688_PAYMENT_7',
'on_task_completion' => 'TASK_1688_PAYMENT_8',
'status' => ''
];
public const TASK_1688_PAYMENT_8 = [
'name' => 'Make Payment for Customer 1688 Order',
'description' => '○ Purpose: To confirm that the order has been placed with the supplier.<br>
○ Initial Status: Not Started<br>
○ Deadline: Same day<br>
○ Responsible department: Operations<br>
○ Next step: Change the status of Upload China Bank Slip operation to "In Progress" upon successful completion.<br>
○ Additional details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: Authorize Customers 1688 Account operation must be completed before this operation can begin.<br>
○ Outcomes: The customers 1688 order is paid.<br>',
'milestone' => '',
'reference' => 'TASK_1688_PAYMENT_8',
'on_task_completion' => 'TASK_1688_PAYMENT_9',
'status' => ''
];
public const TASK_1688_PAYMENT_9 = [
'name' => 'Upload China Bank Slip',
'description' => '○ Purpose: To confirm that the customer order has been transferred to the customer\'s supplier.<br>
○ Initial Status: Not Started<br>
○ Deadline: After 3 days<br>
○ Responsible department: Operations<br>
○ Next step: None<br>
○ Additional details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: Make Payment for Customer 1688 Order operation must be completed before this operation can begin.<br>
○ Outcomes: The customer can download the payment transfer proof to send to their supplier.<br>',
'milestone' => '',
'reference' => 'TASK_1688_PAYMENT_9',
'on_task_completion' => 'TASK_1688_PAYMENT_10',
'status' => ''
];
public const TASK_1688_PAYMENT_10 = [
'name' => 'Upload 1688 Purchase Order PDF',
'description' => '○ Purpose: To store a copy of the original purchase order document for bookkeeping.<br>
○ Initial Status: Not Started<br>
○ Deadline: Same day<br>
○ Responsible department: Operations<br>
○ Next step: Change the status of Upload China Bank Slip operation to "In Progress" upon successful completion.<br>
○ Additional details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: Make Payment for Customer 1688 Order operation must be completed before this operation can begin.<br>
○ Outcomes: The 1688 purchase orders pdf is attached to the booking.<br>',
'milestone' => '',
'reference' => 'TASK_1688_PAYMENT_10',
'on_task_completion' => 'TASK_1688_PAYMENT_11',
'status' => ''
];
public const TASK_1688_PAYMENT_11 = [
'name' => 'Fill Up Purchase Order',
'description' => '○ Purpose: To store the purchase order details to generate the invoice.<br>
○ Initial Status: Not Started<br>
○ Deadline: Same day<br>
○ Responsible department: Operations<br>
○ Next step: Change the status of Approve Purchase Order operation to "In Progress" upon successful completion.<br>
○ Additional details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: Upload 1688 Purchase Order PDF operation must be completed before this operation can begin.<br>
○ Outcomes: The purchase orders details are added to the booking.<br>',
'milestone' => '',
'reference' => 'TASK_1688_PAYMENT_11',
'on_task_completion' => 'TASK_1688_PAYMENT_12',
'status' => ''
];
public const TASK_1688_PAYMENT_12 = [
'name' => 'Approve Purchase Order',
'description' => '○ Purpose: To check that the customer submitted a purchase order that complies with our companys guidelines.<br>
○ Initial Status: Not Started<br>
○ Deadline: Same day<br>
○ Responsible department: Operations<br>
○ Next step: Change the status of Complete Order bookkeeping operation to "In Progress" upon successful completion.<br>
○ Additional details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: Fill Up Purchase Order operation must be completed before this operation can begin.<br>
○ Outcomes: The purchase order submitted is approved.<br>',
'milestone' => '',
'reference' => 'TASK_1688_PAYMENT_12',
'on_task_completion' => 'TASK_1688_PAYMENT_13',
'status' => ''
];
public const TASK_1688_PAYMENT_13 = [
'name' => 'Complete Order bookeeping',
'description' => '○ Purpose: To complete the bookkeeping for the booking.<br>
○ Initial Status: Not Started<br>
○ Deadline: Same day<br>
○ Responsible department: Operations<br>
○ Next step: None<br>
○ Additional details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: Approve Purchase Order and Upload China Bank Slip operation must be completed before this operation can begin.<br>
○ Outcomes: The order is placed with a supplier and the customers order is confirmed.<br>',
'milestone' => '',
'reference' => 'TASK_1688_PAYMENT_13',
'on_task_completion' => '',
'status' => ''
];
public const TASK_PURCHASE_ORDER_1 = [
'name' => 'Approve Purchase Order',
'description' => '○ Purpose: To check that the customer submitted a purchase order that complies with our companys guidelines.<br>
○ Initial Status: In Progress<br>
○ Deadline: Next day<br>
○ Responsible department: Operation<br>
○ Next step: Change the status of the Approve payment status to "In Progress" upon successful completion of the operation.<br>
○ Additional details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: None<br>
○ 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',
'status' => PerfexCRMTaskStatus::IN_PROGRESS
];
public const TASK_PURCHASE_ORDER_2 = [
'name' => 'Complete Order bookkeeping',
'description' => '○ Purpose: To complete the bookkeeping for the booking.<br>
○ Initial Status: Not Started<br>
○ Deadline: Next day<br>
○ Responsible department: Account<br>
○ Next step: None<br>
○ Additional details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: Approve Purchase Order and Upload China Bank Slip operation must be completed before this operation can begin.<br>
○ Outcomes: A copy of the documents related to the booking should now all be in the google drive relevant folder.<br>',
'milestone' => '',
'reference' => 'TASK_PURCHASE_ORDER_2',
'on_task_completion' => '',
'status' => ''
];
public const TASK_IDENTIFICATION_1 = [
'name' => 'Approve Identification Verification',
'description' => '○ Purpose: To ensure the customer submit information matches the information in their identification document.<br>
○ Initial Status: In Progress<br>
○ Deadline: Same Day<br>
○ Responsible department: Operation<br>
○ Next step: None<br>
○ Additional details: ** Any specific requirements or notes for the operation.**<br>
○ Dependencies: None<br>
○ Outcomes: Customer account identification is verified<br>',
'milestone' => '',
'reference' => 'TASK_IDENTIFICATION_1',
'on_task_completion' => '',
'status' => PerfexCRMTaskStatus::IN_PROGRESS
];
}
+7
View File
@@ -0,0 +1,7 @@
<?php
return [
'base_url' => env('PERFEXCRM_BASE_URL', 'http://192.168.1.100:8084'), //cief todo: Update crm api domain here
'api_key' => env('PERFEXCRM_API_KEY', 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiZXhjaGFuZ2Utc2hpcHBpbmciLCJuYW1lIjoiRXhjaGFuZ2UgYW5kIFNoaXBwaW5nIFBvcnRhbCIsIkFQSV9USU1FIjoxNjc1MDg2Mzc4fQ.SGAHWl5stcxQwp55TBGeMRVTdlLeWQIbsvJh5glyVvs'),
'is_enabled' => env('PERFEXCRM_IS_ENABLED', 'true'),
];
+28
View File
@@ -0,0 +1,28 @@
FROM php:7.4-fpm
WORKDIR /var/www/html
RUN docker-php-ext-install pdo pdo_mysql
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
libzip-dev \
zip \
cron \
supervisor \
nano \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd \
&& docker-php-ext-install zip \
&& docker-php-ext-install bcmath
COPY --from=composer:1.9.3 /usr/bin/composer /usr/bin/composer
#NODEJS & NPM
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
RUN apt-get -y install nodejs
RUN chown -R www-data:www-data /var/www
RUN chmod 755 /var/www
+54
View File
@@ -0,0 +1,54 @@
version: '3'
networks:
exchange-staging:
services:
#################################################################
nginx:
image: nginx:stable-alpine
container_name: exchange-ngnix
ports:
- "8082:80"
volumes:
- ../:/var/www/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
- mysql
networks:
- exchange-staging
#################################################################
mysql:
image: mysql:5.7.29
container_name: exchange-mysql
restart: unless-stopped
tty: true
ports:
- 3302:3306
environment:
MYSQL_ROOT_USER: root
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: exchange-db
MYSQL_USER: master
MYSQL_PASSWORD: cDe7gcrRBWetaAP
volumes:
- mysql-data:/var/lib/mysql
networks:
- exchange-staging
#################################################################
php:
build:
context: .
dockerfile: Dockerfile
container_name: exchange-php
volumes:
- ../:/var/www/html
ports:
- "9002:9000"
networks:
- exchange-staging
#################################################################
volumes:
mysql-data:
+27
View File
@@ -0,0 +1,27 @@
server {
listen 80;
index index.php index.html;
server_name localhost;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/html/public;
server_name localhost;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_intercept_errors on;
fastcgi_keep_conn on;
fastcgi_param PHP_VALUE "auto_prepend_file= \n allow_url_include=Off";
}
}
@@ -43,9 +43,11 @@
<div class="btn btn-sm all-caps btn-outline-success b-rad-none">Transaction History</div>
</a>
@endif
<a href="{{route('booking.details', $marking)}}">
<div class="btn btn-sm all-caps btn-success b-rad-none" >{{$transaction->owner instanceof \App\Models\Booking ? 'Back to': 'Last'}} Booking</div>
</a>
@if($marking)
<a href="{{route('booking.details', $marking)}}">
<div class="btn btn-sm all-caps btn-success b-rad-none" >{{$transaction->owner instanceof \App\Models\Booking ? 'Back to': 'Last'}} Booking</div>
</a>
@endif
</div>
</div>
</div>
@@ -64,9 +66,11 @@
<a href="{{route('dashboard')}}">
<div class="btn btn-sm all-caps btn-outline-success b-rad-none">Dashboard</div>
</a>
<a href="{{route('booking.details', $marking)}}">
<div class="btn btn-sm all-caps btn-success b-rad-none" >{{$transaction->owner instanceof \App\Models\Booking ? 'Back to': 'Last'}} Booking</div>
</a>
@if($marking)
<a href="{{route('booking.details', $marking)}}">
<div class="btn btn-sm all-caps btn-success b-rad-none" >{{$transaction->owner instanceof \App\Models\Booking ? 'Back to': 'Last'}} Booking</div>
</a>
@endif
</div>
</div>
</div>
@@ -82,9 +86,11 @@
</div>
<div class="row m-b-20">
<div class="col">
<a href="{{route('booking.details', $marking)}}">
<div class="btn btn-sm all-caps btn-outline-success b-rad-none" >{{$transaction->owner instanceof \App\Models\Booking ? 'Back to': 'Last'}} Booking</div>
</a>
@if($marking)
<a href="{{route('booking.details', $marking)}}">
<div class="btn btn-sm all-caps btn-outline-success b-rad-none" >{{$transaction->owner instanceof \App\Models\Booking ? 'Back to': 'Last'}} Booking</div>
</a>
@endif
<a href="{{route('billplz.bill', $transaction->payment_reference)}}">
<div class="btn btn-sm all-caps btn-success b-rad-none">Retry Payment</div>
</a>
+1 -1
View File
@@ -34,7 +34,7 @@ Route::group(['prefix' => 'account', 'namespace' => 'Accounts', 'as' => 'account
});
Route::group(['prefix' => 'user', 'as' => 'user.', 'middleware' => 'valid.token'], function () {
Route::get('/{email}', 'FetchUserByEmailController@fetch')->name('company');
Route::get('email/{email}', 'FetchUserByEmailController@fetch')->name('company');
Route::post('/show', 'FetchUserController@fetch')->name('show');
Route::get('/list', 'ListUsersController@list')->name('list');
Route::put('/update/{id}', 'UpdateUserController@update')->name('update');