Working on subscriptions

This commit is contained in:
David Bomba 2021-04-07 18:06:50 +10:00
parent 498d8e4efc
commit 3a3ddc031c
4 changed files with 85 additions and 29 deletions

View File

@ -13,13 +13,14 @@ namespace App\Jobs\Cron;
use App\Libraries\MultiDB; use App\Libraries\MultiDB;
use App\Models\Invoice; use App\Models\Invoice;
use App\Utils\Traits\SubscriptionHooker;
use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
class SubscriptionCron class SubscriptionCron
{ {
use Dispatchable; use Dispatchable;
use SubscriptionHooker;
/** /**
* Create a new job instance. * Create a new job instance.
* *
@ -38,12 +39,15 @@ class SubscriptionCron
{ {
if (! config('ninja.db.multi_db_enabled')) { if (! config('ninja.db.multi_db_enabled')) {
$this->loopSubscriptions(); $this->loopSubscriptions();
} else { } else {
//multiDB environment, need to //multiDB environment, need to
foreach (MultiDB::$dbs as $db) { foreach (MultiDB::$dbs as $db) {
MultiDB::setDB($db); MultiDB::setDB($db);
$this->loopSubscriptions(); $this->loopSubscriptions();
} }
@ -56,7 +60,7 @@ class SubscriptionCron
$invoices = Invoice::where('is_deleted', 0) $invoices = Invoice::where('is_deleted', 0)
->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL]) ->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL])
->where('balance', '>', 0) ->where('balance', '>', 0)
->whereDate('due_date', '<=', now()->startOfDay()) ->whereDate('due_date', '<=', now()->addDay()->startOfDay())
->whereNotNull('subscription_id') ->whereNotNull('subscription_id')
->cursor(); ->cursor();
@ -65,18 +69,24 @@ class SubscriptionCron
$subscription = $invoice->subscription; $subscription = $invoice->subscription;
$body = [
'context' => 'plan_expired',
'client' => $invoice->client->hashed_id,
'invoice' => $invoice->hashed_id,
'subscription' => $subscription->hashed_id,
];
$this->sendLoad($subscription, $body);
//This will send the notification daily.
//We'll need to handle this by performing some action on the invoice to either archive it or delete it?
}); });
} }
/* Our daily cron should check
1. Is the subscription still in trial phase? private function handleWebhook($invoice, $subscription)
2. Check the recurring invoice and its remaining_cycles to see whether we need to cancel or perform any other function.
3. Any notifications that need to fire?
*/
private function processSubscription($client_subscription)
{ {
} }
} }

View File

@ -166,6 +166,11 @@ class Invoice extends BaseModel
return $this->belongsTo(User::class)->withTrashed(); return $this->belongsTo(User::class)->withTrashed();
} }
public function recurring_invoice()
{
return $this->belongsTo(RecurringInvoice::class)->withTrashed();
}
public function assigned_user() public function assigned_user()
{ {
return $this->belongsTo(User::class, 'assigned_user_id', 'id')->withTrashed(); return $this->belongsTo(User::class, 'assigned_user_id', 'id')->withTrashed();

View File

@ -32,12 +32,14 @@ use App\Repositories\SubscriptionRepository;
use App\Utils\Ninja; use App\Utils\Ninja;
use App\Utils\Traits\CleanLineItems; use App\Utils\Traits\CleanLineItems;
use App\Utils\Traits\MakesHash; use App\Utils\Traits\MakesHash;
use App\Utils\Traits\SubscriptionHooker;
use GuzzleHttp\RequestOptions; use GuzzleHttp\RequestOptions;
class SubscriptionService class SubscriptionService
{ {
use MakesHash; use MakesHash;
use CleanLineItems; use CleanLineItems;
use SubscriptionHooker;
/** @var subscription */ /** @var subscription */
private $subscription; private $subscription;
@ -231,29 +233,15 @@ class SubscriptionService
'db' => $this->subscription->company->db, 'db' => $this->subscription->company->db,
]); ]);
$headers = [ $response = $this->sendLoad($this->subscription, $body);
'Content-Type' => 'application/json',
'X-Requested-With' => 'XMLHttpRequest',
];
$client = new \GuzzleHttp\Client(
[
'headers' => $headers,
]);
try {
$response = $client->{$this->subscription->webhook_configuration['post_purchase_rest_method']}($this->subscription->webhook_configuration['post_purchase_url'],[
RequestOptions::JSON => ['body' => $body], RequestOptions::ALLOW_REDIRECTS => false
]);
}
catch(\Exception $e)
{
$body = array_merge($body, ['exception' => $e->getMessage()]);
}
/* Append the response to the system logger body */ /* Append the response to the system logger body */
if($response) { if(is_array($response)){
$body = $response;
}
else {
$status = $response->getStatusCode(); $status = $response->getStatusCode();
$response_body = $response->getBody(); $response_body = $response->getBody();

View File

@ -0,0 +1,53 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
namespace App\Utils\Traits;
use GuzzleHttp\RequestOptions;
/**
* Class SubscriptionHooker.
*/
trait SubscriptionHooker
{
public function sendLoad($subscription, $body)
{
$headers = [
'Content-Type' => 'application/json',
'X-Requested-With' => 'XMLHttpRequest',
];
if(count($subscription->webhook_configuration['post_purchase_headers']) >= 1)
$headers = array_merge($headers, $subscription->webhook_configuration['post_purchase_headers']);
$client = new \GuzzleHttp\Client(
[
'headers' => $headers,
]);
try {
$response = $client->{$subscription->webhook_configuration['post_purchase_rest_method']}($subscription->webhook_configuration['post_purchase_url'],[
RequestOptions::JSON => ['body' => $body], RequestOptions::ALLOW_REDIRECTS => false
]);
return $response;
}
catch(\Exception $e)
{
$body = array_merge($body, ['exception' => $e->getMessage()]);
return $body;
}
}
}