App\Ninja\Repositories\AccountRepository::createNinjaInvoice PHP Method

createNinjaInvoice() public method

public createNinjaInvoice ( $client, $clientAccount, $plan, $credit )
    public function createNinjaInvoice($client, $clientAccount, $plan, $credit = 0)
    {
        $term = $plan['term'];
        $plan_cost = $plan['price'];
        $num_users = $plan['num_users'];
        $plan = $plan['plan'];
        if ($credit < 0) {
            $credit = 0;
        }
        $account = $this->getNinjaAccount();
        $lastInvoice = Invoice::withTrashed()->whereAccountId($account->id)->orderBy('public_id', 'DESC')->first();
        $publicId = $lastInvoice ? $lastInvoice->public_id + 1 : 1;
        $invoice = new Invoice();
        $invoice->account_id = $account->id;
        $invoice->user_id = $account->users()->first()->id;
        $invoice->public_id = $publicId;
        $invoice->client_id = $client->id;
        $invoice->invoice_number = $account->getNextInvoiceNumber($invoice);
        $invoice->invoice_date = $clientAccount->getRenewalDate();
        $invoice->amount = $invoice->balance = $plan_cost - $credit;
        $invoice->invoice_type_id = INVOICE_TYPE_STANDARD;
        $invoice->save();
        if ($credit) {
            $credit_item = InvoiceItem::createNew($invoice);
            $credit_item->qty = 1;
            $credit_item->cost = -$credit;
            $credit_item->notes = trans('texts.plan_credit_description');
            $credit_item->product_key = trans('texts.plan_credit_product');
            $invoice->invoice_items()->save($credit_item);
        }
        $item = InvoiceItem::createNew($invoice);
        $item->qty = 1;
        $item->cost = $plan_cost;
        $item->notes = trans("texts.{$plan}_plan_{$term}_description");
        if ($plan == PLAN_ENTERPRISE) {
            $min = Utils::getMinNumUsers($num_users);
            $item->notes .= "\n\n###" . trans('texts.min_to_max_users', ['min' => $min, 'max' => $num_users]);
        }
        // Don't change this without updating the regex in PaymentService->createPayment()
        $item->product_key = 'Plan - ' . ucfirst($plan) . ' (' . ucfirst($term) . ')';
        $invoice->invoice_items()->save($item);
        $invitation = new Invitation();
        $invitation->account_id = $account->id;
        $invitation->user_id = $account->users()->first()->id;
        $invitation->public_id = $publicId;
        $invitation->invoice_id = $invoice->id;
        $invitation->contact_id = $client->contacts()->first()->id;
        $invitation->invitation_key = str_random(RANDOM_KEY_LENGTH);
        $invitation->save();
        return $invitation;
    }

Usage Example

コード例 #1
0
 public function fire()
 {
     $this->info(date('Y-m-d') . ' Running SendRenewalInvoices...');
     // get all accounts with plans expiring in 10 days
     $companies = Company::whereRaw('datediff(plan_expires, curdate()) = 10')->orderBy('id')->get();
     $this->info(count($companies) . ' companies found renewing in 10 days');
     foreach ($companies as $company) {
         if (!count($company->accounts)) {
             continue;
         }
         $account = $company->accounts->sortBy('id')->first();
         $plan = [];
         $plan['plan'] = $company->plan;
         $plan['term'] = $company->plan_term;
         $plan['num_users'] = $company->num_users;
         $plan['price'] = min($company->plan_price, Utils::getPlanPrice($plan));
         if ($company->pending_plan) {
             $plan['plan'] = $company->pending_plan;
             $plan['term'] = $company->pending_term;
             $plan['num_users'] = $company->pending_num_users;
             $plan['price'] = min($company->pending_plan_price, Utils::getPlanPrice($plan));
         }
         if ($plan['plan'] == PLAN_FREE || !$plan['plan'] || !$plan['term'] || !$plan['price']) {
             continue;
         }
         $client = $this->accountRepo->getNinjaClient($account);
         $invitation = $this->accountRepo->createNinjaInvoice($client, $account, $plan, 0, false);
         // set the due date to 10 days from now
         $invoice = $invitation->invoice;
         $invoice->due_date = date('Y-m-d', strtotime('+ 10 days'));
         $invoice->save();
         $term = $plan['term'];
         $plan = $plan['plan'];
         if ($term == PLAN_TERM_YEARLY) {
             $this->mailer->sendInvoice($invoice);
             $this->info("Sent {$term}ly {$plan} invoice to {$client->getDisplayName()}");
         } else {
             $this->info("Created {$term}ly {$plan} invoice for {$client->getDisplayName()}");
         }
     }
     $this->info('Done');
 }