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; 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 : "", $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); } } } }