mirror of
https://gitlab.com/CIEFWorldwideSdnBhd/exchange-2.0.git
synced 2026-08-19 04:23:55 +00:00
193 lines
8.8 KiB
PHP
193 lines
8.8 KiB
PHP
<?php
|
|
|
|
namespace App\Classes\Modules\Vouchers\Processors\Voucherify;
|
|
|
|
use App\Classes\Modules\Vouchers\Services\CreatesVoucher;
|
|
use App\Classes\Modules\Vouchers\Services\FetchesVoucher;
|
|
use App\Classes\Modules\Vouchers\DataTransferObjects\VoucherObject;
|
|
use App\Classes\Modules\Vouchers\Services\Voucherify\RedeemsVoucherifyVoucher;
|
|
use App\Classes\Modules\Vouchers\Services\CreatesVoucherRedemption;
|
|
use App\Classes\Modules\Vouchers\DataTransferObjects\RedeemVoucherifyVoucherObject;
|
|
use App\Classes\Modules\Vouchers\DataTransferObjects\CreateVoucherifyOrderObject;
|
|
use App\Classes\Modules\Vouchers\Services\Voucherify\CreatesVoucherifyOrder;
|
|
use App\Classes\Modules\Vouchers\Services\CreatesVoucherEntityMapping;
|
|
use App\Classes\Modules\Vouchers\DataTransferObjects\VoucherEntityObject;
|
|
use App\Classes\Modules\Rewards\Services\CreatesUserReward;
|
|
use App\Classes\ValueObjects\Constants\TransactionType;
|
|
use App\Classes\ValueObjects\Constants\VoucherifyEntityType;
|
|
use App\Models\User;
|
|
use App\Models\Transaction;
|
|
use App\Models\Voucher;
|
|
use App\Models\VoucherCampaign;
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
class BookingToVoucherifyProcessor
|
|
{
|
|
/** @var CreatesVoucher */
|
|
private $createsVoucher;
|
|
|
|
/** @var FetchesVoucher */
|
|
private $fetchesVoucher;
|
|
|
|
/** @var CreatesVoucherRedemption */
|
|
private $createsVoucherRedemption;
|
|
|
|
/** @var RedeemsVoucherifyVoucher */
|
|
private $redeemsVoucherifyVoucher;
|
|
|
|
/** @var CreatesVoucherifyOrder */
|
|
private $createsVoucherifyOrder;
|
|
|
|
/** @var CreatesVoucherEntityMapping */
|
|
private $createsVoucherEntityMapping;
|
|
|
|
/** @var CreatesUserReward */
|
|
private $createsUserReward;
|
|
|
|
/**
|
|
* BookingToVoucherifyProcessor constructor.
|
|
* @param CreatesVoucher $createsVoucher
|
|
* @param FetchesVoucher $fetchesVoucher
|
|
* @param CreatesVoucherRedemption $createsVoucherRedemption
|
|
* @param RedeemsVoucherifyVoucher $redeemsVoucherifyVoucher
|
|
* @param CreatesVoucherifyOrder $createsVoucherifyOrder
|
|
* @param CreatesVoucherEntityMapping $createsVoucherEntityMapping
|
|
* @param CreatesUserReward $createsUserReward
|
|
*/
|
|
public function __construct(CreatesVoucher $createsVoucher, FetchesVoucher $fetchesVoucher, CreatesVoucherRedemption $createsVoucherRedemption, RedeemsVoucherifyVoucher $redeemsVoucherifyVoucher, CreatesVoucherifyOrder $createsVoucherifyOrder, CreatesVoucherEntityMapping $createsVoucherEntityMapping, CreatesUserReward $createsUserReward)
|
|
{
|
|
$this->createsVoucher = $createsVoucher;
|
|
$this->fetchesVoucher = $fetchesVoucher;
|
|
$this->createsVoucherRedemption = $createsVoucherRedemption;
|
|
$this->redeemsVoucherifyVoucher = $redeemsVoucherifyVoucher;
|
|
$this->createsVoucherifyOrder = $createsVoucherifyOrder;
|
|
$this->createsVoucherEntityMapping = $createsVoucherEntityMapping;
|
|
$this->createsUserReward = $createsUserReward;
|
|
}
|
|
|
|
|
|
/**
|
|
* @param User $user
|
|
* @param Transaction $transaction
|
|
* @param int $companyId
|
|
* @param float $amount
|
|
* @param float $voucherDiscountAmount
|
|
* @param string $voucherCode
|
|
* @return void
|
|
* @throws \App\Classes\Exceptions\MalformedRequestException
|
|
* @throws \Voucherify\ClientException
|
|
*/
|
|
public function execute(User $user, Transaction $transaction, int $companyId, float $amount, float $voucherDiscountAmount, ?string $voucherCode = "")
|
|
{
|
|
try{
|
|
$voucherify_customer_id = "";
|
|
$voucherify_order_id = "";
|
|
if($voucherCode){
|
|
$employeeWhoOwnsTheVoucher = null;
|
|
|
|
$employees = $user->company()->first()->employees;
|
|
if(count($employees) > 1){
|
|
foreach($employees as $singleEmployee){
|
|
$userRewards = $singleEmployee->rewards;
|
|
foreach($userRewards as $userReward){
|
|
if ($userReward->voucher && $userReward->voucher->code === $voucherCode) {
|
|
Log::info('3. Company with multiple employees: ' . json_encode($singleEmployee) . ", voucher: " . $voucherCode);
|
|
$employeeWhoOwnsTheVoucher = $singleEmployee;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(!$employeeWhoOwnsTheVoucher){
|
|
$employeeWhoOwnsTheVoucher = $user;
|
|
}
|
|
|
|
$redeemVoucherifyVoucherObject = new RedeemVoucherifyVoucherObject($companyId, $transaction->id, $voucherCode, $amount, $employeeWhoOwnsTheVoucher);
|
|
$redeemVoucherResult = $this->redeemsVoucherifyVoucher->execute($redeemVoucherifyVoucherObject);
|
|
|
|
// Log::info('redeemVoucherResult: '.json_encode($redeemVoucherResult));
|
|
|
|
$redeemedVoucher = $redeemVoucherResult->voucher;
|
|
$redemptionId = $redeemVoucherResult->id;
|
|
|
|
if($redeemVoucherResult && isset($redeemVoucherResult->order)){
|
|
$voucherify_order_id = $redeemVoucherResult->order->id;
|
|
}
|
|
|
|
if($redeemVoucherResult && isset($redeemVoucherResult->customer)){
|
|
$voucherify_customer_id = $redeemVoucherResult->customer->id;
|
|
}
|
|
|
|
$voucher = $this->recordVoucherInfo($redeemedVoucher);
|
|
$this->createsVoucherRedemption->execute($transaction, $voucher, $redemptionId, $voucherDiscountAmount);
|
|
$this->recordVoucherForUserInfo($employeeWhoOwnsTheVoucher, $voucher);
|
|
}
|
|
else{
|
|
$createVoucherifyOrderObject = new CreateVoucherifyOrderObject($user, $companyId, $transaction->id, $amount, true, $transaction->type == TransactionType::TOP_UP);
|
|
$createVoucherufyOrderResult = $this->createsVoucherifyOrder->execute($createVoucherifyOrderObject);
|
|
|
|
if($createVoucherufyOrderResult && isset($createVoucherufyOrderResult->id)){
|
|
$voucherify_order_id = $createVoucherufyOrderResult->id;
|
|
if(isset($createVoucherufyOrderResult->customer)){
|
|
$voucherify_customer_id = $createVoucherufyOrderResult->customer->id;
|
|
}
|
|
}
|
|
}
|
|
|
|
$this->recordVoucherifyOrderInfo($voucherify_order_id, $transaction);
|
|
$this->recordVoucherifyCustomerInfo($voucherify_customer_id, $user);
|
|
|
|
} catch (\Exception $e) {
|
|
Log::error($e);
|
|
}
|
|
}
|
|
|
|
private function recordVoucherInfo(object $redeemedVoucher){
|
|
//Create records at 3 tables
|
|
$voucherValue = isset($redeemedVoucher->discount->amount_off) ? $redeemedVoucher->discount->amount_off : $redeemedVoucher->discount->percent_off;
|
|
$voucherType = $redeemedVoucher->discount ? $redeemedVoucher->discount->type : null;
|
|
$voucherifyCampaignId = isset($redeemedVoucher->campaign_id) ? $redeemedVoucher->campaign_id : null;
|
|
|
|
$voucherCampaign = null;
|
|
if($voucherifyCampaignId){
|
|
$voucherCampaign = VoucherCampaign::where('campaign_id', $voucherifyCampaignId)->first();
|
|
}
|
|
|
|
$voucherObject= new VoucherObject($redeemedVoucher->code, isset($redeemedVoucher->metadata->displayname) ? $redeemedVoucher->metadata->displayname : "", null, $voucherType, $voucherValue, $voucherCampaign ? $voucherCampaign->id : null);
|
|
$voucher = $this->createsVoucher->execute($voucherObject);
|
|
if(!$voucher) $voucher = $this->fetchesVoucher->execute(['code' => $voucherObject->getCode()]);
|
|
|
|
return $voucher;
|
|
}
|
|
|
|
private function recordVoucherForUserInfo(User $user, Voucher $voucher){
|
|
//create reward to user (user_reward)
|
|
$voucherCount = $user->rewards->where('voucher_id', $voucher->id)->count();
|
|
if($voucherCount == 0){
|
|
$this->createsUserReward->execute(null, $user, $voucher->id);
|
|
}
|
|
}
|
|
|
|
private function recordVoucherifyOrderInfo(string $voucherify_order_id, Transaction $transaction){
|
|
//Update Database - 1 table
|
|
if($voucherify_order_id){
|
|
$voucherify_entity = $transaction->voucherifyEntities()->first();
|
|
if(!$voucherify_entity){
|
|
$voucherEntityObject = new VoucherEntityObject($voucherify_order_id, VoucherifyEntityType::ORDER);
|
|
$this->createsVoucherEntityMapping->execute($transaction, $voucherEntityObject);
|
|
}
|
|
}
|
|
}
|
|
|
|
private function recordVoucherifyCustomerInfo(string $voucherify_customer_id, User $user){
|
|
//Update Database - 1 table
|
|
if($voucherify_customer_id){
|
|
$voucherify_entity = $user->voucherifyEntities()->first();
|
|
if(!$voucherify_entity){
|
|
$voucherEntityObject = new VoucherEntityObject($voucherify_customer_id, VoucherifyEntityType::CUSTOMER);
|
|
$this->createsVoucherEntityMapping->execute($user, $voucherEntityObject);
|
|
}
|
|
}
|
|
}
|
|
}
|