createsVoucherifyVoucher = $createsVoucherifyVoucher; $this->createsVoucher = $createsVoucher; $this->fetchesMilestone = $fetchesMilestone; $this->createsMilestoneProgress = $createsMilestoneProgress; $this->createsUserReward = $createsUserReward; $this->fetchesVoucherifyVoucher = $fetchesVoucherifyVoucher; $this->fetchesVoucher = $fetchesVoucher; $this->validatesVoucherifyVoucher = $validatesVoucherifyVoucher; } /** * @param User $user * @param array $milestone_constants * @return void * @throws \App\Classes\Exceptions\MalformedRequestException * @throws \Voucherify\ClientException */ public function execute(User $user, array $milestone_constants) { try{ foreach($milestone_constants as $constant) { //update milestone progress /** @var Milestone $milestone */ $milestone = $this->fetchesMilestone->execute(['name' => $constant]); $result = null; if($user->milestoneProgress->count() > 0){ $result = $user->milestoneProgress->where('milestone_id', $milestone->id)->first(); } if(!$result){ $result = $this->createsMilestoneProgress->execute($milestone, $user->id); } if($result){ //fetch completed miletones $completedMilestones = MilestoneProgress::where('user_id', $user->id)->pluck('milestone_id'); $rewards = $milestone->rewards; //check for rewards that have a corresponding milestone count if(count($rewards) > 0){ $this->checkMilestoneForReward($user, $completedMilestones, $rewards); } } } } catch (\Exception $e) { Log::error($e); } } /** * @param User $user * @param object $completedMilestones * @param object $rewards * @return void */ private function checkMilestoneForReward(User $user, object $completedMilestones, object $rewards) { $milestoneIds = $rewards[0]->milestones->pluck('id'); if ($milestoneIds->intersect($completedMilestones)->count() >= count($rewards[0]->milestones)) { /** @var Reward $reward */ foreach ($rewards as $reward) { $result = null; if (!$user->rewards->contains('reward_id', $reward->id)) { $voucherId = 0; $voucherName = ''; $voucherType = ""; if($reward->type == RewardType::REWARD_AMOUNT){ //Voucherify - Create Voucher $result = $this->createsVoucherifyVoucher->execute($user, intval($reward->value)); } else{ //Voucherify - Validates Voucher $ValidateVoucherifyVoucherObject = new ValidateVoucherifyVoucherObject(0, $reward->value, 0.00, $user); $voucherifyVoucherValidated = $this->validatesVoucherifyVoucher->execute($ValidateVoucherifyVoucherObject); if(!isset($voucherifyVoucherValidated->reason)){ //Voucherify - Get Voucher $result = $this->fetchesVoucherifyVoucher->execute($user, $reward->value); } } if($result && !isset($result->reason)){ $voucherName = isset($result->campaign) ? $result->campaign : $reward->name; $voucherType = $result->discount->type; $voucherValue = isset($result->discount->amount_off) ? $result->discount->amount_off : $result->discount->percent_off; $voucherStartDate = $result->start_date; $voucherEndDate = $result->expiration_date; //create voucher $voucherObject = new VoucherObject($result->code, isset($voucherName) ? $voucherName : "", null, $voucherType, $voucherValue, null, $voucherStartDate, $voucherEndDate); $voucher = $this->createsVoucher->execute($voucherObject); if(!$voucher) $voucher = $this->fetchesVoucher->execute(['code' => $voucherObject->getCode()]); $voucherId = $voucher->id; //create reward to user (user_reward) $voucherCount = $user->rewards->where('voucher_id', $voucher->id)->count(); if($voucherCount == 0){ $this->createsUserReward->execute($reward, $user, $voucherId); } } else{ Log::info('CheckMilestonesForRewardProcessor: no voucher fetched or created for reward '. json_encode($reward)); } } } } } }