account = $account; } /** * Execute the job. * * @return void */ public function handle() { // if free plan, return if (Ninja::isSelfHost() || $this->account->isFreeHostedClient()) { return; } $plan_details = $this->account->getPlanDetails(); if (! $plan_details) { return; } /* Trial user cancelling early.... */ if ($plan_details['trial_plan']) { return; } /* Is the plan Active? */ if (! $plan_details['active']) { return; } /* Refundable client! */ $plan_start = $plan_details['started']; $plan_expires = $plan_details['expires']; $paid = $plan_details['paid']; $term = $plan_details['term']; $refund = $this->calculateRefundAmount($paid, $plan_expires); /* Are there any edge cases? */ //@TODO process refund by refunding directly to the payment_id; } private function calculateRefundAmount($amount, $plan_expires) { $end_date = Carbon::parse($plan_expires); $now = Carbon::now(); $days_left = $now->diffInDays($end_date); $pro_rata_ratio = $days_left / 365; $pro_rata_refund = $amount * $pro_rata_ratio; return $pro_rata_refund; } }