mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2024-11-06 03:02:34 +01:00
commit
f039d94cd3
@ -1 +1 @@
|
|||||||
5.1.17
|
5.1.18
|
@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
namespace App\Console;
|
namespace App\Console;
|
||||||
|
|
||||||
|
use App\Jobs\Cron\BillingSubscriptionCron;
|
||||||
use App\Jobs\Cron\RecurringInvoicesCron;
|
use App\Jobs\Cron\RecurringInvoicesCron;
|
||||||
use App\Jobs\Ninja\AdjustEmailQuota;
|
use App\Jobs\Ninja\AdjustEmailQuota;
|
||||||
use App\Jobs\Ninja\CompanySizeCheck;
|
use App\Jobs\Ninja\CompanySizeCheck;
|
||||||
@ -53,6 +54,8 @@ class Kernel extends ConsoleKernel
|
|||||||
|
|
||||||
$schedule->job(new UpdateExchangeRates)->daily()->withoutOverlapping();
|
$schedule->job(new UpdateExchangeRates)->daily()->withoutOverlapping();
|
||||||
|
|
||||||
|
$schedule->job(new BillingSubscriptionCron)->daily()->withoutOverlapping();
|
||||||
|
|
||||||
$schedule->job(new RecurringInvoicesCron)->hourly()->withoutOverlapping();
|
$schedule->job(new RecurringInvoicesCron)->hourly()->withoutOverlapping();
|
||||||
|
|
||||||
/* Run hosted specific jobs */
|
/* Run hosted specific jobs */
|
||||||
|
@ -0,0 +1,55 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Events\BillingSubscription;
|
||||||
|
|
||||||
|
use App\Models\BillingSubscription;
|
||||||
|
use App\Models\Company;
|
||||||
|
use Illuminate\Broadcasting\Channel;
|
||||||
|
use Illuminate\Broadcasting\InteractsWithSockets;
|
||||||
|
use Illuminate\Broadcasting\PresenceChannel;
|
||||||
|
use Illuminate\Broadcasting\PrivateChannel;
|
||||||
|
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
|
||||||
|
use Illuminate\Foundation\Events\Dispatchable;
|
||||||
|
use Illuminate\Queue\SerializesModels;
|
||||||
|
|
||||||
|
class BillingSubscriptionWasCreated
|
||||||
|
{
|
||||||
|
use Dispatchable, InteractsWithSockets, SerializesModels;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var BillingSubscription
|
||||||
|
*/
|
||||||
|
public $billing_subscription;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Company
|
||||||
|
*/
|
||||||
|
public $company;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
public $event_vars;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new event instance.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct(BillingSubscription $billing_subscription, Company $company, array $event_vars)
|
||||||
|
{
|
||||||
|
$this->billing_subscription = $billing_subscription;
|
||||||
|
$this->company = $company;
|
||||||
|
$this->event_vars = $event_vars;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the channels the event should broadcast on.
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Broadcasting\Channel|array
|
||||||
|
*/
|
||||||
|
public function broadcastOn()
|
||||||
|
{
|
||||||
|
return new PrivateChannel('channel-name');
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Events\ClientSubscription;
|
||||||
|
|
||||||
|
use App\Models\ClientSubscription;
|
||||||
|
use App\Models\Company;
|
||||||
|
use Illuminate\Broadcasting\Channel;
|
||||||
|
use Illuminate\Broadcasting\InteractsWithSockets;
|
||||||
|
use Illuminate\Broadcasting\PresenceChannel;
|
||||||
|
use Illuminate\Broadcasting\PrivateChannel;
|
||||||
|
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
|
||||||
|
use Illuminate\Foundation\Events\Dispatchable;
|
||||||
|
use Illuminate\Queue\SerializesModels;
|
||||||
|
|
||||||
|
class ClientSubscriptionWasCreated
|
||||||
|
{
|
||||||
|
use Dispatchable, InteractsWithSockets, SerializesModels;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var ClientSubscription
|
||||||
|
*/
|
||||||
|
public $client_subscription;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Company
|
||||||
|
*/
|
||||||
|
public $company;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
public $event_vars;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new event instance.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct(ClientSubscription $client_subscription, Company $company, array $event_vars)
|
||||||
|
{
|
||||||
|
$this->client_subscription = $client_subscription;
|
||||||
|
$this->company = $company;
|
||||||
|
$this->event_vars = $event_vars;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the channels the event should broadcast on.
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Broadcasting\Channel|array
|
||||||
|
*/
|
||||||
|
public function broadcastOn()
|
||||||
|
{
|
||||||
|
return new PrivateChannel('channel-name');
|
||||||
|
}
|
||||||
|
}
|
27
app/Factory/BillingSubscriptionFactory.php
Normal file
27
app/Factory/BillingSubscriptionFactory.php
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?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\Factory;
|
||||||
|
|
||||||
|
|
||||||
|
use App\Models\BillingSubscription;
|
||||||
|
|
||||||
|
class BillingSubscriptionFactory
|
||||||
|
{
|
||||||
|
public static function create(int $company_id, int $user_id): BillingSubscription
|
||||||
|
{
|
||||||
|
$billing_subscription = new BillingSubscription();
|
||||||
|
$billing_subscription->company_id = $company_id;
|
||||||
|
$billing_subscription->user_id = $user_id;
|
||||||
|
|
||||||
|
return $billing_subscription;
|
||||||
|
}
|
||||||
|
}
|
410
app/Http/Controllers/BillingSubscriptionController.php
Normal file
410
app/Http/Controllers/BillingSubscriptionController.php
Normal file
@ -0,0 +1,410 @@
|
|||||||
|
<?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\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Events\BillingSubscription\BillingSubscriptionWasCreated;
|
||||||
|
use App\Factory\BillingSubscriptionFactory;
|
||||||
|
use App\Http\Requests\BillingSubscription\CreateBillingSubscriptionRequest;
|
||||||
|
use App\Http\Requests\BillingSubscription\DestroyBillingSubscriptionRequest;
|
||||||
|
use App\Http\Requests\BillingSubscription\EditBillingSubscriptionRequest;
|
||||||
|
use App\Http\Requests\BillingSubscription\ShowBillingSubscriptionRequest;
|
||||||
|
use App\Http\Requests\BillingSubscription\StoreBillingSubscriptionRequest;
|
||||||
|
use App\Http\Requests\BillingSubscription\UpdateBillingSubscriptionRequest;
|
||||||
|
use App\Models\BillingSubscription;
|
||||||
|
use App\Repositories\BillingSubscriptionRepository;
|
||||||
|
use App\Transformers\BillingSubscriptionTransformer;
|
||||||
|
use App\Utils\Ninja;
|
||||||
|
|
||||||
|
class BillingSubscriptionController extends BaseController
|
||||||
|
{
|
||||||
|
protected $entity_type = BillingSubscription::class;
|
||||||
|
|
||||||
|
protected $entity_transformer = BillingSubscriptionTransformer::class;
|
||||||
|
|
||||||
|
protected $billing_subscription_repo;
|
||||||
|
|
||||||
|
public function __construct(BillingSubscriptionRepository $billing_subscription_repo)
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
|
||||||
|
$this->billing_subscription_repo = $billing_subscription_repo;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the list of BillingSubscriptions.
|
||||||
|
*
|
||||||
|
* @return Response
|
||||||
|
*
|
||||||
|
* @OA\Get(
|
||||||
|
* path="/api/v1/billing_subscriptions",
|
||||||
|
* operationId="getBillingSubscriptions",
|
||||||
|
* tags={"billing_subscriptions"},
|
||||||
|
* summary="Gets a list of billing_subscriptions",
|
||||||
|
* description="Lists billing_subscriptions.",
|
||||||
|
*
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Token"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/include"),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=200,
|
||||||
|
* description="A list of billing_subscriptions",
|
||||||
|
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/BillingSubscription"),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=422,
|
||||||
|
* description="Validation error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response="default",
|
||||||
|
* description="Unexpected Error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/Error"),
|
||||||
|
* ),
|
||||||
|
* )
|
||||||
|
*/
|
||||||
|
|
||||||
|
public function index(): \Illuminate\Http\Response
|
||||||
|
{
|
||||||
|
$billing_subscriptions = BillingSubscription::query()->company();
|
||||||
|
|
||||||
|
return $this->listResponse($billing_subscriptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the form for creating a new resource.
|
||||||
|
*
|
||||||
|
* @param CreateBillingSubscriptionRequest $request The request
|
||||||
|
*
|
||||||
|
* @return Response
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @OA\Get(
|
||||||
|
* path="/api/v1/billing_subscriptions/create",
|
||||||
|
* operationId="getBillingSubscriptionsCreate",
|
||||||
|
* tags={"billing_subscriptions"},
|
||||||
|
* summary="Gets a new blank billing_subscriptions object",
|
||||||
|
* description="Returns a blank object with default values",
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Token"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/include"),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=200,
|
||||||
|
* description="A blank billing_subscriptions object",
|
||||||
|
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/BillingSubscription"),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=422,
|
||||||
|
* description="Validation error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
|
||||||
|
*
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response="default",
|
||||||
|
* description="Unexpected Error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/Error"),
|
||||||
|
* ),
|
||||||
|
* )
|
||||||
|
*/
|
||||||
|
public function create(CreateBillingSubscriptionRequest $request): \Illuminate\Http\Response
|
||||||
|
{
|
||||||
|
$billing_subscription = BillingSubscriptionFactory::create(auth()->user()->company()->id, auth()->user()->id);
|
||||||
|
|
||||||
|
return $this->itemResponse($billing_subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a newly created resource in storage.
|
||||||
|
*
|
||||||
|
* @param StoreBillingSubscriptionRequest $request The request
|
||||||
|
*
|
||||||
|
* @return Response
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @OA\Post(
|
||||||
|
* path="/api/v1/billing_subscriptions",
|
||||||
|
* operationId="storeBillingSubscription",
|
||||||
|
* tags={"billing_subscriptions"},
|
||||||
|
* summary="Adds a billing_subscriptions",
|
||||||
|
* description="Adds an billing_subscriptions to the system",
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Token"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/include"),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=200,
|
||||||
|
* description="Returns the saved billing_subscriptions object",
|
||||||
|
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/BillingSubscription"),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=422,
|
||||||
|
* description="Validation error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
|
||||||
|
*
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response="default",
|
||||||
|
* description="Unexpected Error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/Error"),
|
||||||
|
* ),
|
||||||
|
* )
|
||||||
|
*/
|
||||||
|
public function store(StoreBillingSubscriptionRequest $request): \Illuminate\Http\Response
|
||||||
|
{
|
||||||
|
$billing_subscription = $this->billing_subscription_repo->save($request->all(), BillingSubscriptionFactory::create(auth()->user()->company()->id, auth()->user()->id));
|
||||||
|
|
||||||
|
event(new BillingsubscriptionWasCreated($billing_subscription, $billing_subscription->company, Ninja::eventVars()));
|
||||||
|
|
||||||
|
return $this->itemResponse($billing_subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified resource.
|
||||||
|
*
|
||||||
|
* @param ShowBillingSubscriptionRequest $request The request
|
||||||
|
* @param Invoice $billing_subscription The invoice
|
||||||
|
*
|
||||||
|
* @return Response
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @OA\Get(
|
||||||
|
* path="/api/v1/billing_subscriptions/{id}",
|
||||||
|
* operationId="showBillingSubscription",
|
||||||
|
* tags={"billing_subscriptions"},
|
||||||
|
* summary="Shows an billing_subscriptions",
|
||||||
|
* description="Displays an billing_subscriptions by id",
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Token"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/include"),
|
||||||
|
* @OA\Parameter(
|
||||||
|
* name="id",
|
||||||
|
* in="path",
|
||||||
|
* description="The BillingSubscription Hashed ID",
|
||||||
|
* example="D2J234DFA",
|
||||||
|
* required=true,
|
||||||
|
* @OA\Schema(
|
||||||
|
* type="string",
|
||||||
|
* format="string",
|
||||||
|
* ),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=200,
|
||||||
|
* description="Returns the BillingSubscription object",
|
||||||
|
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/BillingSubscription"),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=422,
|
||||||
|
* description="Validation error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
|
||||||
|
*
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response="default",
|
||||||
|
* description="Unexpected Error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/Error"),
|
||||||
|
* ),
|
||||||
|
* )
|
||||||
|
*/
|
||||||
|
public function show(ShowBillingSubscriptionRequest $request, BillingSubscription $billing_subscription): \Illuminate\Http\Response
|
||||||
|
{
|
||||||
|
return $this->itemResponse($billing_subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the form for editing the specified resource.
|
||||||
|
*
|
||||||
|
* @param EditBillingSubscriptionRequest $request The request
|
||||||
|
* @param Invoice $billing_subscription The invoice
|
||||||
|
*
|
||||||
|
* @return Response
|
||||||
|
*
|
||||||
|
* @OA\Get(
|
||||||
|
* path="/api/v1/billing_subscriptions/{id}/edit",
|
||||||
|
* operationId="editBillingSubscription",
|
||||||
|
* tags={"billing_subscriptions"},
|
||||||
|
* summary="Shows an billing_subscriptions for editting",
|
||||||
|
* description="Displays an billing_subscriptions by id",
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Token"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/include"),
|
||||||
|
* @OA\Parameter(
|
||||||
|
* name="id",
|
||||||
|
* in="path",
|
||||||
|
* description="The BillingSubscription Hashed ID",
|
||||||
|
* example="D2J234DFA",
|
||||||
|
* required=true,
|
||||||
|
* @OA\Schema(
|
||||||
|
* type="string",
|
||||||
|
* format="string",
|
||||||
|
* ),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=200,
|
||||||
|
* description="Returns the invoice object",
|
||||||
|
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/BillingSubscription"),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=422,
|
||||||
|
* description="Validation error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
|
||||||
|
*
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response="default",
|
||||||
|
* description="Unexpected Error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/Error"),
|
||||||
|
* ),
|
||||||
|
* )
|
||||||
|
*/
|
||||||
|
public function edit(EditBillingSubscriptionRequest $request, BillingSubscription $billing_subscription): \Illuminate\Http\Response
|
||||||
|
{
|
||||||
|
return $this->itemResponse($billing_subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified resource in storage.
|
||||||
|
*
|
||||||
|
* @param UpdateBillingSubscriptionRequest $request The request
|
||||||
|
* @param BillingSubscription $billing_subscription The invoice
|
||||||
|
*
|
||||||
|
* @return Response
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @OA\Put(
|
||||||
|
* path="/api/v1/billing_subscriptions/{id}",
|
||||||
|
* operationId="updateBillingSubscription",
|
||||||
|
* tags={"billing_subscriptions"},
|
||||||
|
* summary="Updates an billing_subscriptions",
|
||||||
|
* description="Handles the updating of an billing_subscriptions by id",
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Token"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/include"),
|
||||||
|
* @OA\Parameter(
|
||||||
|
* name="id",
|
||||||
|
* in="path",
|
||||||
|
* description="The BillingSubscription Hashed ID",
|
||||||
|
* example="D2J234DFA",
|
||||||
|
* required=true,
|
||||||
|
* @OA\Schema(
|
||||||
|
* type="string",
|
||||||
|
* format="string",
|
||||||
|
* ),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=200,
|
||||||
|
* description="Returns the billing_subscriptions object",
|
||||||
|
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/BillingSubscription"),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=422,
|
||||||
|
* description="Validation error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
|
||||||
|
*
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response="default",
|
||||||
|
* description="Unexpected Error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/Error"),
|
||||||
|
* ),
|
||||||
|
* )
|
||||||
|
*/
|
||||||
|
public function update(UpdateBillingSubscriptionRequest $request, BillingSubscription $billing_subscription)
|
||||||
|
{
|
||||||
|
if ($request->entityIsDeleted($billing_subscription)) {
|
||||||
|
return $request->disallowUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
$billing_subscription = $this->billing_subscription_repo->save($request->all(), $billing_subscription);
|
||||||
|
|
||||||
|
return $this->itemResponse($billing_subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified resource from storage.
|
||||||
|
*
|
||||||
|
* @param DestroyBillingSubscriptionRequest $request
|
||||||
|
* @param BillingSubscription $invoice
|
||||||
|
*
|
||||||
|
* @return Response
|
||||||
|
*
|
||||||
|
* @throws \Exception
|
||||||
|
* @OA\Delete(
|
||||||
|
* path="/api/v1/billing_subscriptions/{id}",
|
||||||
|
* operationId="deleteBillingSubscription",
|
||||||
|
* tags={"billing_subscriptions"},
|
||||||
|
* summary="Deletes a billing_subscriptions",
|
||||||
|
* description="Handles the deletion of an billing_subscriptions by id",
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Token"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/include"),
|
||||||
|
* @OA\Parameter(
|
||||||
|
* name="id",
|
||||||
|
* in="path",
|
||||||
|
* description="The BillingSubscription Hashed ID",
|
||||||
|
* example="D2J234DFA",
|
||||||
|
* required=true,
|
||||||
|
* @OA\Schema(
|
||||||
|
* type="string",
|
||||||
|
* format="string",
|
||||||
|
* ),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=200,
|
||||||
|
* description="Returns a HTTP status",
|
||||||
|
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=422,
|
||||||
|
* description="Validation error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
|
||||||
|
*
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response="default",
|
||||||
|
* description="Unexpected Error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/Error"),
|
||||||
|
* ),
|
||||||
|
* )
|
||||||
|
*/
|
||||||
|
public function destroy(DestroyBillingSubscriptionRequest $request, BillingSubscription $billing_subscription): \Illuminate\Http\Response
|
||||||
|
{
|
||||||
|
$this->billing_subscription_repo->delete($billing_subscription);
|
||||||
|
|
||||||
|
return $this->itemResponse($billing_subscription->fresh());
|
||||||
|
}
|
||||||
|
}
|
410
app/Http/Controllers/ClientSubscriptionController.php
Normal file
410
app/Http/Controllers/ClientSubscriptionController.php
Normal file
@ -0,0 +1,410 @@
|
|||||||
|
<?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\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Events\ClientSubscription\ClientSubscriptionWasCreated;
|
||||||
|
use App\Factory\ClientSubscriptionFactory;
|
||||||
|
use App\Http\Requests\ClientSubscription\CreateClientSubscriptionRequest;
|
||||||
|
use App\Http\Requests\ClientSubscription\DestroyClientSubscriptionRequest;
|
||||||
|
use App\Http\Requests\ClientSubscription\EditClientSubscriptionRequest;
|
||||||
|
use App\Http\Requests\ClientSubscription\ShowClientSubscriptionRequest;
|
||||||
|
use App\Http\Requests\ClientSubscription\StoreClientSubscriptionRequest;
|
||||||
|
use App\Http\Requests\ClientSubscription\UpdateClientSubscriptionRequest;
|
||||||
|
use App\Models\ClientSubscription;
|
||||||
|
use App\Repositories\ClientSubscriptionRepository;
|
||||||
|
use App\Transformers\ClientSubscriptionTransformer;
|
||||||
|
use App\Utils\Ninja;
|
||||||
|
|
||||||
|
class ClientSubscriptionController extends BaseController
|
||||||
|
{
|
||||||
|
protected $entity_type = ClientSubscription::class;
|
||||||
|
|
||||||
|
protected $entity_transformer = ClientSubscriptionTransformer::class;
|
||||||
|
|
||||||
|
protected $client_subscription_repo;
|
||||||
|
|
||||||
|
public function __construct(ClientSubscriptionRepository $client_subscription_repo)
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
|
||||||
|
$this->client_subscription_repo = $client_subscription_repo;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the list of ClientSubscriptions.
|
||||||
|
*
|
||||||
|
* @return Response
|
||||||
|
*
|
||||||
|
* @OA\Get(
|
||||||
|
* path="/api/v1/client_subscriptions",
|
||||||
|
* operationId="getClientSubscriptions",
|
||||||
|
* tags={"client_subscriptions"},
|
||||||
|
* summary="Gets a list of client_subscriptions",
|
||||||
|
* description="Lists client_subscriptions.",
|
||||||
|
*
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Token"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/include"),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=200,
|
||||||
|
* description="A list of client_subscriptions",
|
||||||
|
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/ClientSubscription"),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=422,
|
||||||
|
* description="Validation error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response="default",
|
||||||
|
* description="Unexpected Error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/Error"),
|
||||||
|
* ),
|
||||||
|
* )
|
||||||
|
*/
|
||||||
|
|
||||||
|
public function index(): \Illuminate\Http\Response
|
||||||
|
{
|
||||||
|
$client_subscriptions = ClientSubscription::query()->company();
|
||||||
|
|
||||||
|
return $this->listResponse($client_subscriptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the form for creating a new resource.
|
||||||
|
*
|
||||||
|
* @param CreateClientSubscriptionRequest $request The request
|
||||||
|
*
|
||||||
|
* @return Response
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @OA\Get(
|
||||||
|
* path="/api/v1/client_subscriptions/create",
|
||||||
|
* operationId="getClientSubscriptionsCreate",
|
||||||
|
* tags={"client_subscriptions"},
|
||||||
|
* summary="Gets a new blank client_subscriptions object",
|
||||||
|
* description="Returns a blank object with default values",
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Token"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/include"),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=200,
|
||||||
|
* description="A blank client_subscriptions object",
|
||||||
|
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/ClientSubscription"),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=422,
|
||||||
|
* description="Validation error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
|
||||||
|
*
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response="default",
|
||||||
|
* description="Unexpected Error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/Error"),
|
||||||
|
* ),
|
||||||
|
* )
|
||||||
|
*/
|
||||||
|
public function create(CreateClientSubscriptionRequest $request): \Illuminate\Http\Response
|
||||||
|
{
|
||||||
|
$client_subscription = ClientSubscriptionFactory::create(auth()->user()->company()->id, auth()->user()->id);
|
||||||
|
|
||||||
|
return $this->itemResponse($client_subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a newly created resource in storage.
|
||||||
|
*
|
||||||
|
* @param StoreClientSubscriptionRequest $request The request
|
||||||
|
*
|
||||||
|
* @return Response
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @OA\Post(
|
||||||
|
* path="/api/v1/client_subscriptions",
|
||||||
|
* operationId="storeClientSubscription",
|
||||||
|
* tags={"client_subscriptions"},
|
||||||
|
* summary="Adds a client_subscriptions",
|
||||||
|
* description="Adds an client_subscriptions to the system",
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Token"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/include"),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=200,
|
||||||
|
* description="Returns the saved client_subscriptions object",
|
||||||
|
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/ClientSubscription"),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=422,
|
||||||
|
* description="Validation error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
|
||||||
|
*
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response="default",
|
||||||
|
* description="Unexpected Error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/Error"),
|
||||||
|
* ),
|
||||||
|
* )
|
||||||
|
*/
|
||||||
|
public function store(StoreClientSubscriptionRequest $request): \Illuminate\Http\Response
|
||||||
|
{
|
||||||
|
$client_subscription = $this->client_subscription_repo->save($request->all(), ClientSubscriptionFactory::create(auth()->user()->company()->id, auth()->user()->id));
|
||||||
|
|
||||||
|
event(new ClientsubscriptionWasCreated($client_subscription, $client_subscription->company, Ninja::eventVars()));
|
||||||
|
|
||||||
|
return $this->itemResponse($client_subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified resource.
|
||||||
|
*
|
||||||
|
* @param ShowClientSubscriptionRequest $request The request
|
||||||
|
* @param Invoice $client_subscription The invoice
|
||||||
|
*
|
||||||
|
* @return Response
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @OA\Get(
|
||||||
|
* path="/api/v1/client_subscriptions/{id}",
|
||||||
|
* operationId="showClientSubscription",
|
||||||
|
* tags={"client_subscriptions"},
|
||||||
|
* summary="Shows an client_subscriptions",
|
||||||
|
* description="Displays an client_subscriptions by id",
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Token"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/include"),
|
||||||
|
* @OA\Parameter(
|
||||||
|
* name="id",
|
||||||
|
* in="path",
|
||||||
|
* description="The ClientSubscription Hashed ID",
|
||||||
|
* example="D2J234DFA",
|
||||||
|
* required=true,
|
||||||
|
* @OA\Schema(
|
||||||
|
* type="string",
|
||||||
|
* format="string",
|
||||||
|
* ),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=200,
|
||||||
|
* description="Returns the ClientSubscription object",
|
||||||
|
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/ClientSubscription"),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=422,
|
||||||
|
* description="Validation error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
|
||||||
|
*
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response="default",
|
||||||
|
* description="Unexpected Error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/Error"),
|
||||||
|
* ),
|
||||||
|
* )
|
||||||
|
*/
|
||||||
|
public function show(ShowClientSubscriptionRequest $request, ClientSubscription $client_subscription): \Illuminate\Http\Response
|
||||||
|
{
|
||||||
|
return $this->itemResponse($client_subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the form for editing the specified resource.
|
||||||
|
*
|
||||||
|
* @param EditClientSubscriptionRequest $request The request
|
||||||
|
* @param Invoice $client_subscription The invoice
|
||||||
|
*
|
||||||
|
* @return Response
|
||||||
|
*
|
||||||
|
* @OA\Get(
|
||||||
|
* path="/api/v1/client_subscriptions/{id}/edit",
|
||||||
|
* operationId="editClientSubscription",
|
||||||
|
* tags={"client_subscriptions"},
|
||||||
|
* summary="Shows an client_subscriptions for editting",
|
||||||
|
* description="Displays an client_subscriptions by id",
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Token"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/include"),
|
||||||
|
* @OA\Parameter(
|
||||||
|
* name="id",
|
||||||
|
* in="path",
|
||||||
|
* description="The ClientSubscription Hashed ID",
|
||||||
|
* example="D2J234DFA",
|
||||||
|
* required=true,
|
||||||
|
* @OA\Schema(
|
||||||
|
* type="string",
|
||||||
|
* format="string",
|
||||||
|
* ),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=200,
|
||||||
|
* description="Returns the invoice object",
|
||||||
|
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/ClientSubscription"),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=422,
|
||||||
|
* description="Validation error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
|
||||||
|
*
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response="default",
|
||||||
|
* description="Unexpected Error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/Error"),
|
||||||
|
* ),
|
||||||
|
* )
|
||||||
|
*/
|
||||||
|
public function edit(EditClientSubscriptionRequest $request, ClientSubscription $client_subscription): \Illuminate\Http\Response
|
||||||
|
{
|
||||||
|
return $this->itemResponse($client_subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified resource in storage.
|
||||||
|
*
|
||||||
|
* @param UpdateClientSubscriptionRequest $request The request
|
||||||
|
* @param ClientSubscription $client_subscription The invoice
|
||||||
|
*
|
||||||
|
* @return Response
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @OA\Put(
|
||||||
|
* path="/api/v1/client_subscriptions/{id}",
|
||||||
|
* operationId="updateClientSubscription",
|
||||||
|
* tags={"client_subscriptions"},
|
||||||
|
* summary="Updates an client_subscriptions",
|
||||||
|
* description="Handles the updating of an client_subscriptions by id",
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Token"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/include"),
|
||||||
|
* @OA\Parameter(
|
||||||
|
* name="id",
|
||||||
|
* in="path",
|
||||||
|
* description="The ClientSubscription Hashed ID",
|
||||||
|
* example="D2J234DFA",
|
||||||
|
* required=true,
|
||||||
|
* @OA\Schema(
|
||||||
|
* type="string",
|
||||||
|
* format="string",
|
||||||
|
* ),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=200,
|
||||||
|
* description="Returns the client_subscriptions object",
|
||||||
|
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/ClientSubscription"),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=422,
|
||||||
|
* description="Validation error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
|
||||||
|
*
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response="default",
|
||||||
|
* description="Unexpected Error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/Error"),
|
||||||
|
* ),
|
||||||
|
* )
|
||||||
|
*/
|
||||||
|
public function update(UpdateClientSubscriptionRequest $request, ClientSubscription $client_subscription)
|
||||||
|
{
|
||||||
|
if ($request->entityIsDeleted($client_subscription)) {
|
||||||
|
return $request->disallowUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
$client_subscription = $this->client_subscription_repo->save($request->all(), $client_subscription);
|
||||||
|
|
||||||
|
return $this->itemResponse($client_subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified resource from storage.
|
||||||
|
*
|
||||||
|
* @param DestroyClientSubscriptionRequest $request
|
||||||
|
* @param ClientSubscription $invoice
|
||||||
|
*
|
||||||
|
* @return Response
|
||||||
|
*
|
||||||
|
* @throws \Exception
|
||||||
|
* @OA\Delete(
|
||||||
|
* path="/api/v1/client_subscriptions/{id}",
|
||||||
|
* operationId="deleteClientSubscription",
|
||||||
|
* tags={"client_subscriptions"},
|
||||||
|
* summary="Deletes a client_subscriptions",
|
||||||
|
* description="Handles the deletion of an client_subscriptions by id",
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Token"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||||
|
* @OA\Parameter(ref="#/components/parameters/include"),
|
||||||
|
* @OA\Parameter(
|
||||||
|
* name="id",
|
||||||
|
* in="path",
|
||||||
|
* description="The ClientSubscription Hashed ID",
|
||||||
|
* example="D2J234DFA",
|
||||||
|
* required=true,
|
||||||
|
* @OA\Schema(
|
||||||
|
* type="string",
|
||||||
|
* format="string",
|
||||||
|
* ),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=200,
|
||||||
|
* description="Returns a HTTP status",
|
||||||
|
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
|
||||||
|
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response=422,
|
||||||
|
* description="Validation error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
|
||||||
|
*
|
||||||
|
* ),
|
||||||
|
* @OA\Response(
|
||||||
|
* response="default",
|
||||||
|
* description="Unexpected Error",
|
||||||
|
* @OA\JsonContent(ref="#/components/schemas/Error"),
|
||||||
|
* ),
|
||||||
|
* )
|
||||||
|
*/
|
||||||
|
public function destroy(DestroyClientSubscriptionRequest $request, ClientSubscription $client_subscription): \Illuminate\Http\Response
|
||||||
|
{
|
||||||
|
$this->client_subscription_repo->delete($client_subscription);
|
||||||
|
|
||||||
|
return $this->itemResponse($client_subscription->fresh());
|
||||||
|
}
|
||||||
|
}
|
@ -13,12 +13,18 @@ namespace App\Http\Controllers;
|
|||||||
|
|
||||||
use App\Libraries\MultiDB;
|
use App\Libraries\MultiDB;
|
||||||
use App\Libraries\OAuth\Providers\Google;
|
use App\Libraries\OAuth\Providers\Google;
|
||||||
use Illuminate\Http\Request;
|
use App\Models\CompanyUser;
|
||||||
|
use App\Transformers\CompanyUserTransformer;
|
||||||
use Google_Client;
|
use Google_Client;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
class ConnectedAccountController extends BaseController
|
class ConnectedAccountController extends BaseController
|
||||||
{
|
{
|
||||||
|
|
||||||
|
protected $entity_type = CompanyUser::class;
|
||||||
|
|
||||||
|
protected $entity_transformer = CompanyUserTransformer::class;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
parent::__construct();
|
parent::__construct();
|
||||||
@ -128,8 +134,10 @@ class ConnectedAccountController extends BaseController
|
|||||||
auth()->user()->save();
|
auth()->user()->save();
|
||||||
|
|
||||||
//$ct = CompanyUser::whereUserId(auth()->user()->id);
|
//$ct = CompanyUser::whereUserId(auth()->user()->id);
|
||||||
|
$ct = CompanyUser::whereUserId(auth()->user()->id);
|
||||||
|
|
||||||
return $this->listResponse(auth()->user());
|
return $this->listResponse($ct);
|
||||||
|
// return $this->listResponse(auth()->user());
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()
|
return response()
|
||||||
|
@ -397,6 +397,8 @@ class InvoiceController extends BaseController
|
|||||||
|
|
||||||
$invoice = $this->invoice_repo->save($request->all(), $invoice);
|
$invoice = $this->invoice_repo->save($request->all(), $invoice);
|
||||||
|
|
||||||
|
$invoice->service()->deletePdf();
|
||||||
|
|
||||||
event(new InvoiceWasUpdated($invoice, $invoice->company, Ninja::eventVars()));
|
event(new InvoiceWasUpdated($invoice, $invoice->company, Ninja::eventVars()));
|
||||||
|
|
||||||
return $this->itemResponse($invoice);
|
return $this->itemResponse($invoice);
|
||||||
@ -697,14 +699,14 @@ class InvoiceController extends BaseController
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'cancel':
|
case 'cancel':
|
||||||
$invoice = $invoice->service()->handleCancellation()->save();
|
$invoice = $invoice->service()->handleCancellation()->deletePdf()->save();
|
||||||
|
|
||||||
if (! $bulk) {
|
if (! $bulk) {
|
||||||
$this->itemResponse($invoice);
|
$this->itemResponse($invoice);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'reverse':
|
case 'reverse':
|
||||||
$invoice = $invoice->service()->handleReversal()->save();
|
$invoice = $invoice->service()->handleReversal()->deletePdf()->save();
|
||||||
|
|
||||||
if (! $bulk) {
|
if (! $bulk) {
|
||||||
$this->itemResponse($invoice);
|
$this->itemResponse($invoice);
|
||||||
@ -720,7 +722,7 @@ class InvoiceController extends BaseController
|
|||||||
}
|
}
|
||||||
|
|
||||||
//touch reminder1,2,3_sent + last_sent here if the email is a reminder.
|
//touch reminder1,2,3_sent + last_sent here if the email is a reminder.
|
||||||
$invoice->service()->touchReminder($this->reminder_template)->save();
|
$invoice->service()->touchReminder($this->reminder_template)->deletePdf()->save();
|
||||||
|
|
||||||
$invoice->invitations->load('contact.client.country', 'invoice.client.country', 'invoice.company')->each(function ($invitation) use ($invoice) {
|
$invoice->invitations->load('contact.client.country', 'invoice.client.country', 'invoice.company')->each(function ($invitation) use ($invoice) {
|
||||||
EmailEntity::dispatch($invitation, $invoice->company, $this->reminder_template);
|
EmailEntity::dispatch($invitation, $invoice->company, $this->reminder_template);
|
||||||
|
35
app/Http/Controllers/OpenAPI/BillingSubscription.php
Normal file
35
app/Http/Controllers/OpenAPI/BillingSubscription.php
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @OA\Schema(
|
||||||
|
* schema="BillingSubscription",
|
||||||
|
* type="object",
|
||||||
|
* @OA\Property(property="id", type="string", example="Opnel5aKBz", description="______"),
|
||||||
|
* @OA\Property(property="user_id", type="string", example="Opnel5aKBz", description="______"),
|
||||||
|
* @OA\Property(property="product_id", type="string", example="Opnel5aKBz", description="______"),
|
||||||
|
* @OA\Property(property="company_id", type="string", example="Opnel5aKBz", description="______"),
|
||||||
|
* @OA\Property(property="recurring_invoice_id", type="string", example="Opnel5aKBz", description="______"),
|
||||||
|
* @OA\Property(property="is_recurring", type="boolean", example="true", description="______"),
|
||||||
|
* @OA\Property(property="frequency_id", type="string", example="1", description="integer const representation of the frequency"),
|
||||||
|
* @OA\Property(property="auto_bill", type="string", example="always", description="enum setting"),
|
||||||
|
* @OA\Property(property="promo_code", type="string", example="PROMOCODE4U", description="______"),
|
||||||
|
* @OA\Property(property="promo_discount", type="number", example=10, description="______"),
|
||||||
|
* @OA\Property(property="is_amount_discount", type="boolean", example="true", description="______"),
|
||||||
|
* @OA\Property(property="allow_cancellation", type="boolean", example="true", description="______"),
|
||||||
|
* @OA\Property(property="per_seat_enabled", type="boolean", example="true", description="______"),
|
||||||
|
* @OA\Property(property="currency_id", type="integer", example="1", description="______"),
|
||||||
|
* @OA\Property(property="min_seats_limit", type="integer", example="1", description="______"),
|
||||||
|
* @OA\Property(property="max_seats_limit", type="integer", example="100", description="______"),
|
||||||
|
* @OA\Property(property="trial_enabled", type="boolean", example="true", description="______"),
|
||||||
|
* @OA\Property(property="trial_duration", type="integer", example="2", description="______"),
|
||||||
|
* @OA\Property(property="allow_query_overrides", type="boolean", example="true", description="______"),
|
||||||
|
* @OA\Property(property="allow_plan_changes", type="boolean", example="true", description="______"),
|
||||||
|
* @OA\Property(property="plan_map", type="string", example="1", description="map describing the available upgrade/downgrade plans for this subscription"),
|
||||||
|
* @OA\Property(property="refund_period", type="integer", example="2", description="______"),
|
||||||
|
* @OA\Property(property="webhook_configuration", type="string", example="2", description="______"),
|
||||||
|
* @OA\Property(property="is_deleted", type="boolean", example="true", description="______"),
|
||||||
|
* @OA\Property(property="archived_at", type="number", format="integer", example="1434342123", description="Timestamp"),
|
||||||
|
* @OA\Property(property="created_at", type="number", format="integer", example="134341234234", description="Timestamp"),
|
||||||
|
* @OA\Property(property="updated_at", type="number", format="integer", example="134341234234", description="Timestamp"),
|
||||||
|
* )
|
||||||
|
*/
|
||||||
|
|
19
app/Http/Controllers/OpenAPI/ClientSubscription.php
Normal file
19
app/Http/Controllers/OpenAPI/ClientSubscription.php
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @OA\Schema(
|
||||||
|
* schema="ClientSubscription",
|
||||||
|
* type="object",
|
||||||
|
* @OA\Property(property="id", type="string", example="Opnel5aKBz", description="______"),
|
||||||
|
* @OA\Property(property="subscription_id", type="string", example="Opnel5aKBz", description="______"),
|
||||||
|
* @OA\Property(property="recurring_invoice_id", type="string", example="Opnel5aKBz", description="______"),
|
||||||
|
* @OA\Property(property="company_id", type="string", example="Opnel5aKBz", description="______"),
|
||||||
|
* @OA\Property(property="client_id", type="string", example="Opnel5aKBz", description="______"),
|
||||||
|
* @OA\Property(property="trial_started", type="string", example="10-10-2021", description="______"),
|
||||||
|
* @OA\Property(property="trial_ends", type="string", example="12-10-2021", description="______"),
|
||||||
|
* @OA\Property(property="is_deleted", type="boolean", example="true", description="______"),
|
||||||
|
* @OA\Property(property="archived_at", type="number", format="integer", example="1434342123", description="Timestamp"),
|
||||||
|
* @OA\Property(property="created_at", type="number", format="integer", example="134341234234", description="Timestamp"),
|
||||||
|
* @OA\Property(property="updated_at", type="number", format="integer", example="134341234234", description="Timestamp"),
|
||||||
|
* )
|
||||||
|
*/
|
||||||
|
|
@ -439,7 +439,7 @@ class RecurringInvoiceController extends BaseController
|
|||||||
/**
|
/**
|
||||||
* @OA\Get(
|
* @OA\Get(
|
||||||
* path="/api/v1/recurring_invoice/{invitation_key}/download",
|
* path="/api/v1/recurring_invoice/{invitation_key}/download",
|
||||||
* operationId="downloadInvoice",
|
* operationId="downloadRecurringInvoice",
|
||||||
* tags={"invoices"},
|
* tags={"invoices"},
|
||||||
* summary="Download a specific invoice by invitation key",
|
* summary="Download a specific invoice by invitation key",
|
||||||
* description="Downloads a specific invoice",
|
* description="Downloads a specific invoice",
|
||||||
|
@ -155,6 +155,7 @@ class SetupController extends Controller
|
|||||||
|
|
||||||
return redirect('/');
|
return redirect('/');
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
|
|
||||||
nlog($e->getMessage());
|
nlog($e->getMessage());
|
||||||
|
|
||||||
return redirect()
|
return redirect()
|
||||||
|
@ -0,0 +1,40 @@
|
|||||||
|
<?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\Http\Requests\BillingSubscription;
|
||||||
|
|
||||||
|
use App\Http\Requests\Request;
|
||||||
|
use App\Models\BillingSubscription;
|
||||||
|
|
||||||
|
class CreateBillingSubscriptionRequest extends Request
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return auth()->user()->can('create', BillingSubscription::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
<?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\Http\Requests\BillingSubscription;
|
||||||
|
|
||||||
|
use App\Http\Requests\Request;
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class DestroyBillingSubscriptionRequest extends Request
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize()
|
||||||
|
{
|
||||||
|
return auth()->user()->can('edit', $this->billing_subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
<?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\Http\Requests\BillingSubscription;
|
||||||
|
|
||||||
|
use App\Http\Requests\Request;
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class EditBillingSubscriptionRequest extends Request
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize()
|
||||||
|
{
|
||||||
|
return auth()->user()->can('edit', $this->billing_subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
<?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\Http\Requests\BillingSubscription;
|
||||||
|
|
||||||
|
use App\Http\Requests\Request;
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class ShowBillingSubscriptionRequest extends Request
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize() : bool
|
||||||
|
{
|
||||||
|
return auth()->user()->can('view', $this->billing_subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,60 @@
|
|||||||
|
<?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\Http\Requests\BillingSubscription;
|
||||||
|
|
||||||
|
use App\Http\Requests\Request;
|
||||||
|
use App\Models\BillingSubscription;
|
||||||
|
|
||||||
|
class StoreBillingSubscriptionRequest extends Request
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize()
|
||||||
|
{
|
||||||
|
return auth()->user()->can('create', BillingSubscription::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'user_id' => ['sometimes'],
|
||||||
|
'product_id' => ['sometimes'],
|
||||||
|
'assigned_user_id' => ['sometimes'],
|
||||||
|
'company_id' => ['sometimes'],
|
||||||
|
'is_recurring' => ['sometimes'],
|
||||||
|
'frequency_id' => ['sometimes'],
|
||||||
|
'auto_bill' => ['sometimes'],
|
||||||
|
'promo_code' => ['sometimes'],
|
||||||
|
'promo_discount' => ['sometimes'],
|
||||||
|
'is_amount_discount' => ['sometimes'],
|
||||||
|
'allow_cancellation' => ['sometimes'],
|
||||||
|
'per_set_enabled' => ['sometimes'],
|
||||||
|
'min_seats_limit' => ['sometimes'],
|
||||||
|
'max_seats_limit' => ['sometimes'],
|
||||||
|
'trial_enabled' => ['sometimes'],
|
||||||
|
'trial_duration' => ['sometimes'],
|
||||||
|
'allow_query_overrides' => ['sometimes'],
|
||||||
|
'allow_plan_changes' => ['sometimes'],
|
||||||
|
'plan_map' => ['sometimes'],
|
||||||
|
'refund_period' => ['sometimes'],
|
||||||
|
'webhook_configuration' => ['sometimes'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
<?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\Http\Requests\BillingSubscription;
|
||||||
|
|
||||||
|
use App\Http\Requests\Request;
|
||||||
|
use App\Utils\Traits\ChecksEntityStatus;
|
||||||
|
|
||||||
|
class UpdateBillingSubscriptionRequest extends Request
|
||||||
|
{
|
||||||
|
use ChecksEntityStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize()
|
||||||
|
{
|
||||||
|
return auth()->user()->can('edit', $this->billing_subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
<?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\Http\Requests\ClientSubscription;
|
||||||
|
|
||||||
|
use App\Http\Requests\Request;
|
||||||
|
use App\Models\ClientSubscription;
|
||||||
|
|
||||||
|
class CreateClientSubscriptionRequest extends Request
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return auth()->user()->can('create', ClientSubscription::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
<?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\Http\Requests\ClientSubscription;
|
||||||
|
|
||||||
|
use App\Http\Requests\Request;
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class DestroyClientSubscriptionRequest extends Request
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize()
|
||||||
|
{
|
||||||
|
return auth()->user()->can('edit', $this->client_subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
<?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\Http\Requests\ClientSubscription;
|
||||||
|
|
||||||
|
use App\Http\Requests\Request;
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class EditClientSubscriptionRequest extends Request
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize()
|
||||||
|
{
|
||||||
|
return auth()->user()->can('edit', $this->client_subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
<?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\Http\Requests\ClientSubscription;
|
||||||
|
|
||||||
|
use App\Http\Requests\Request;
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class ShowClientSubscriptionRequest extends Request
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize() : bool
|
||||||
|
{
|
||||||
|
return auth()->user()->can('view', $this->client_subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
<?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\Http\Requests\ClientSubscription;
|
||||||
|
|
||||||
|
use App\Http\Requests\Request;
|
||||||
|
use App\Models\ClientSubscription;
|
||||||
|
|
||||||
|
class StoreClientSubscriptionRequest extends Request
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize()
|
||||||
|
{
|
||||||
|
return auth()->user()->can('create', ClientSubscription::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
<?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\Http\Requests\ClientSubscription;
|
||||||
|
|
||||||
|
use App\Http\Requests\Request;
|
||||||
|
use App\Utils\Traits\ChecksEntityStatus;
|
||||||
|
|
||||||
|
class UpdateClientSubscriptionRequest extends Request
|
||||||
|
{
|
||||||
|
use ChecksEntityStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize()
|
||||||
|
{
|
||||||
|
return auth()->user()->can('edit', $this->client_subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -70,6 +70,10 @@ class Request extends FormRequest
|
|||||||
|
|
||||||
public function decodePrimaryKeys($input)
|
public function decodePrimaryKeys($input)
|
||||||
{
|
{
|
||||||
|
if (array_key_exists('subscription_id', $input) && is_string($input['subscription_id'])) {
|
||||||
|
$input['subscription_id'] = $this->decodePrimaryKey($input['subscription_id']);
|
||||||
|
}
|
||||||
|
|
||||||
if (array_key_exists('assigned_user_id', $input) && is_string($input['assigned_user_id'])) {
|
if (array_key_exists('assigned_user_id', $input) && is_string($input['assigned_user_id'])) {
|
||||||
$input['assigned_user_id'] = $this->decodePrimaryKey($input['assigned_user_id']);
|
$input['assigned_user_id'] = $this->decodePrimaryKey($input['assigned_user_id']);
|
||||||
}
|
}
|
||||||
|
72
app/Jobs/Cron/BillingSubscriptionCron.php
Normal file
72
app/Jobs/Cron/BillingSubscriptionCron.php
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
<?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\Jobs\Cron;
|
||||||
|
|
||||||
|
use App\Libraries\MultiDB;
|
||||||
|
use App\Models\ClientSubscription;
|
||||||
|
use Illuminate\Foundation\Bus\Dispatchable;
|
||||||
|
use Illuminate\Support\Carbon;
|
||||||
|
|
||||||
|
class BillingSubscriptionCron
|
||||||
|
{
|
||||||
|
use Dispatchable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new job instance.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the job.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function handle() : void
|
||||||
|
{
|
||||||
|
|
||||||
|
if (! config('ninja.db.multi_db_enabled')) {
|
||||||
|
$this->loopSubscriptions();
|
||||||
|
} else {
|
||||||
|
//multiDB environment, need to
|
||||||
|
foreach (MultiDB::$dbs as $db) {
|
||||||
|
|
||||||
|
MultiDB::setDB($db);
|
||||||
|
$this->loopSubscriptions();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function loopSubscriptions()
|
||||||
|
{
|
||||||
|
$client_subs = ClientSubscription::whereNull('deleted_at')
|
||||||
|
->cursor()
|
||||||
|
->each(function ($cs){
|
||||||
|
$this->processSubscription($cs);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Our daily cron should check
|
||||||
|
|
||||||
|
1. Is the subscription still in trial phase?
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
71
app/Models/BillingSubscription.php
Normal file
71
app/Models/BillingSubscription.php
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
<?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\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
|
|
||||||
|
class BillingSubscription extends BaseModel
|
||||||
|
{
|
||||||
|
use HasFactory, SoftDeletes;
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'user_id',
|
||||||
|
'product_id',
|
||||||
|
'company_id',
|
||||||
|
'product_id',
|
||||||
|
'is_recurring',
|
||||||
|
'frequency_id',
|
||||||
|
'auto_bill',
|
||||||
|
'promo_code',
|
||||||
|
'promo_discount',
|
||||||
|
'is_amount_discount',
|
||||||
|
'allow_cancellation',
|
||||||
|
'per_set_enabled',
|
||||||
|
'min_seats_limit',
|
||||||
|
'max_seats_limit',
|
||||||
|
'trial_enabled',
|
||||||
|
'trial_duration',
|
||||||
|
'allow_query_overrides',
|
||||||
|
'allow_plan_changes',
|
||||||
|
'plan_map',
|
||||||
|
'refund_period',
|
||||||
|
'webhook_configuration',
|
||||||
|
'currency_id',
|
||||||
|
];
|
||||||
|
|
||||||
|
protected $casts = [
|
||||||
|
'is_deleted' => 'boolean',
|
||||||
|
'plan_map' => 'object',
|
||||||
|
'webhook_configuration' => 'object',
|
||||||
|
'updated_at' => 'timestamp',
|
||||||
|
'created_at' => 'timestamp',
|
||||||
|
'deleted_at' => 'timestamp',
|
||||||
|
];
|
||||||
|
|
||||||
|
public function company(): \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Company::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(User::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function product(): \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Product::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
55
app/Models/ClientSubscription.php
Normal file
55
app/Models/ClientSubscription.php
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
<?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\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
|
||||||
|
class ClientSubscription extends BaseModel
|
||||||
|
{
|
||||||
|
use HasFactory;
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
// 'subscription_id',
|
||||||
|
// 'recurring_invoice_id',
|
||||||
|
// 'client_id',
|
||||||
|
// 'trial_started',
|
||||||
|
// 'trial_ends',
|
||||||
|
// 'is_deleted',
|
||||||
|
];
|
||||||
|
|
||||||
|
protected $casts = [
|
||||||
|
'is_deleted' => 'boolean',
|
||||||
|
'updated_at' => 'timestamp',
|
||||||
|
'created_at' => 'timestamp',
|
||||||
|
'deleted_at' => 'timestamp',
|
||||||
|
];
|
||||||
|
|
||||||
|
public function company(): \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Company::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function recurring_invoice(): \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(RecurringInvoice::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function client(): \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Client::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function subscription(): \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(BillingSubscription::class);
|
||||||
|
}
|
||||||
|
}
|
@ -159,6 +159,16 @@ class Company extends BaseModel
|
|||||||
return $this->hasMany(ExpenseCategory::class)->withTrashed();
|
return $this->hasMany(ExpenseCategory::class)->withTrashed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function client_subscriptions()
|
||||||
|
{
|
||||||
|
return $this->hasMany(ClientSubscription::class)->withTrashed();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function billing_subscriptions()
|
||||||
|
{
|
||||||
|
return $this->hasMany(BillingSubscription::class)->withTrashed();
|
||||||
|
}
|
||||||
|
|
||||||
public function task_statuses()
|
public function task_statuses()
|
||||||
{
|
{
|
||||||
return $this->hasMany(TaskStatus::class)->withTrashed();
|
return $this->hasMany(TaskStatus::class)->withTrashed();
|
||||||
|
@ -77,6 +77,7 @@ class Credit extends BaseModel
|
|||||||
'design_id',
|
'design_id',
|
||||||
'assigned_user_id',
|
'assigned_user_id',
|
||||||
'exchange_rate',
|
'exchange_rate',
|
||||||
|
'subscription_id',
|
||||||
];
|
];
|
||||||
|
|
||||||
protected $casts = [
|
protected $casts = [
|
||||||
|
@ -91,6 +91,7 @@ class Invoice extends BaseModel
|
|||||||
'design_id',
|
'design_id',
|
||||||
'assigned_user_id',
|
'assigned_user_id',
|
||||||
'exchange_rate',
|
'exchange_rate',
|
||||||
|
'subscription_id',
|
||||||
];
|
];
|
||||||
|
|
||||||
protected $casts = [
|
protected $casts = [
|
||||||
|
@ -78,6 +78,7 @@ class Quote extends BaseModel
|
|||||||
'design_id',
|
'design_id',
|
||||||
'assigned_user_id',
|
'assigned_user_id',
|
||||||
'exchange_rate',
|
'exchange_rate',
|
||||||
|
'subscription_id',
|
||||||
];
|
];
|
||||||
|
|
||||||
protected $casts = [
|
protected $casts = [
|
||||||
|
72
app/Observers/BillingSubscriptionObserver.php
Normal file
72
app/Observers/BillingSubscriptionObserver.php
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
<?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\Observers;
|
||||||
|
|
||||||
|
use App\Models\BillingSubscription;
|
||||||
|
|
||||||
|
class BillingSubscriptionObserver
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Handle the billing_subscription "created" event.
|
||||||
|
*
|
||||||
|
* @param BillingSubscription $billing_subscription
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function created(BillingSubscription $billing_subscription)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the billing_subscription "updated" event.
|
||||||
|
*
|
||||||
|
* @param BillingSubscription $billing_subscription
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function updated(BillingSubscription $billing_subscription)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the billing_subscription "deleted" event.
|
||||||
|
*
|
||||||
|
* @param BillingSubscription $billing_subscription
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function deleted(BillingSubscription $billing_subscription)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the billing_subscription "restored" event.
|
||||||
|
*
|
||||||
|
* @param BillingSubscription $billing_subscription
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function restored(BillingSubscription $billing_subscription)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the billing_subscription "force deleted" event.
|
||||||
|
*
|
||||||
|
* @param BillingSubscription $billing_subscription
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function forceDeleted(BillingSubscription $billing_subscription)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
72
app/Observers/ClientSubscriptionObserver.php
Normal file
72
app/Observers/ClientSubscriptionObserver.php
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
<?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\Observers;
|
||||||
|
|
||||||
|
use App\Models\ClientSubscription;
|
||||||
|
|
||||||
|
class ClientSubscriptionObserver
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Handle the client_subscription "created" event.
|
||||||
|
*
|
||||||
|
* @param ClientSubscription $client_subscription
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function created(ClientSubscription $client_subscription)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the client_subscription "updated" event.
|
||||||
|
*
|
||||||
|
* @param ClientSubscription $client_subscription
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function updated(ClientSubscription $client_subscription)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the client_subscription "deleted" event.
|
||||||
|
*
|
||||||
|
* @param ClientSubscription $client_subscription
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function deleted(ClientSubscription $client_subscription)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the client_subscription "restored" event.
|
||||||
|
*
|
||||||
|
* @param ClientSubscription $client_subscription
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function restored(ClientSubscription $client_subscription)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the client_subscription "force deleted" event.
|
||||||
|
*
|
||||||
|
* @param ClientSubscription $client_subscription
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function forceDeleted(ClientSubscription $client_subscription)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
31
app/Policies/BillingSubscriptionPolicy.php
Normal file
31
app/Policies/BillingSubscriptionPolicy.php
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?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\Policies;
|
||||||
|
|
||||||
|
use App\Models\User;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class BillingSubscriptionPolicy.
|
||||||
|
*/
|
||||||
|
class BillingSubscriptionPolicy extends EntityPolicy
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Checks if the user has create permissions.
|
||||||
|
*
|
||||||
|
* @param User $user
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function create(User $user) : bool
|
||||||
|
{
|
||||||
|
return $user->isAdmin() || $user->hasPermission('create_billing_subscription') || $user->hasPermission('create_all');
|
||||||
|
}
|
||||||
|
}
|
31
app/Policies/ClientSubscriptionPolicy.php
Normal file
31
app/Policies/ClientSubscriptionPolicy.php
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?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\Policies;
|
||||||
|
|
||||||
|
use App\Models\User;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class ClientSubscriptionPolicy.
|
||||||
|
*/
|
||||||
|
class ClientSubscriptionPolicy extends EntityPolicy
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Checks if the user has create permissions.
|
||||||
|
*
|
||||||
|
* @param User $user
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function create(User $user) : bool
|
||||||
|
{
|
||||||
|
return $user->isAdmin() || $user->hasPermission('create_client_subscription') || $user->hasPermission('create_all');
|
||||||
|
}
|
||||||
|
}
|
@ -12,7 +12,9 @@
|
|||||||
namespace App\Providers;
|
namespace App\Providers;
|
||||||
|
|
||||||
use App\Models\Account;
|
use App\Models\Account;
|
||||||
|
use App\Models\BillingSubscription;
|
||||||
use App\Models\Client;
|
use App\Models\Client;
|
||||||
|
use App\Models\ClientSubscription;
|
||||||
use App\Models\Company;
|
use App\Models\Company;
|
||||||
use App\Models\CompanyGateway;
|
use App\Models\CompanyGateway;
|
||||||
use App\Models\CompanyToken;
|
use App\Models\CompanyToken;
|
||||||
@ -26,7 +28,9 @@ use App\Models\Quote;
|
|||||||
use App\Models\Task;
|
use App\Models\Task;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
use App\Observers\AccountObserver;
|
use App\Observers\AccountObserver;
|
||||||
|
use App\Observers\BillingSubscriptionObserver;
|
||||||
use App\Observers\ClientObserver;
|
use App\Observers\ClientObserver;
|
||||||
|
use App\Observers\ClientSubscriptionObserver;
|
||||||
use App\Observers\CompanyGatewayObserver;
|
use App\Observers\CompanyGatewayObserver;
|
||||||
use App\Observers\CompanyObserver;
|
use App\Observers\CompanyObserver;
|
||||||
use App\Observers\CompanyTokenObserver;
|
use App\Observers\CompanyTokenObserver;
|
||||||
@ -75,9 +79,10 @@ class AppServiceProvider extends ServiceProvider
|
|||||||
|
|
||||||
Schema::defaultStringLength(191);
|
Schema::defaultStringLength(191);
|
||||||
|
|
||||||
User::observe(UserObserver::class);
|
|
||||||
Account::observe(AccountObserver::class);
|
Account::observe(AccountObserver::class);
|
||||||
|
BillingSubscription::observe(BillingSubscriptionObserver::class);
|
||||||
Client::observe(ClientObserver::class);
|
Client::observe(ClientObserver::class);
|
||||||
|
ClientSubscription::observe(ClientSubscriptionObserver::class);
|
||||||
Company::observe(CompanyObserver::class);
|
Company::observe(CompanyObserver::class);
|
||||||
CompanyGateway::observe(CompanyGatewayObserver::class);
|
CompanyGateway::observe(CompanyGatewayObserver::class);
|
||||||
CompanyToken::observe(CompanyTokenObserver::class);
|
CompanyToken::observe(CompanyTokenObserver::class);
|
||||||
@ -89,6 +94,7 @@ class AppServiceProvider extends ServiceProvider
|
|||||||
Proposal::observe(ProposalObserver::class);
|
Proposal::observe(ProposalObserver::class);
|
||||||
Quote::observe(QuoteObserver::class);
|
Quote::observe(QuoteObserver::class);
|
||||||
Task::observe(TaskObserver::class);
|
Task::observe(TaskObserver::class);
|
||||||
|
User::observe(UserObserver::class);
|
||||||
|
|
||||||
// Queue::before(function (JobProcessing $event) {
|
// Queue::before(function (JobProcessing $event) {
|
||||||
// // \Log::info('Event Job '.$event->connectionName);
|
// // \Log::info('Event Job '.$event->connectionName);
|
||||||
|
@ -12,7 +12,9 @@
|
|||||||
namespace App\Providers;
|
namespace App\Providers;
|
||||||
|
|
||||||
use App\Models\Activity;
|
use App\Models\Activity;
|
||||||
|
use App\Models\BillingSubscription;
|
||||||
use App\Models\Client;
|
use App\Models\Client;
|
||||||
|
use App\Models\ClientSubscription;
|
||||||
use App\Models\Company;
|
use App\Models\Company;
|
||||||
use App\Models\CompanyGateway;
|
use App\Models\CompanyGateway;
|
||||||
use App\Models\CompanyToken;
|
use App\Models\CompanyToken;
|
||||||
@ -37,7 +39,9 @@ use App\Models\User;
|
|||||||
use App\Models\Vendor;
|
use App\Models\Vendor;
|
||||||
use App\Models\Webhook;
|
use App\Models\Webhook;
|
||||||
use App\Policies\ActivityPolicy;
|
use App\Policies\ActivityPolicy;
|
||||||
|
use App\Policies\BillingSubscriptionPolicy;
|
||||||
use App\Policies\ClientPolicy;
|
use App\Policies\ClientPolicy;
|
||||||
|
use App\Policies\ClientSubscriptionPolicy;
|
||||||
use App\Policies\CompanyGatewayPolicy;
|
use App\Policies\CompanyGatewayPolicy;
|
||||||
use App\Policies\CompanyPolicy;
|
use App\Policies\CompanyPolicy;
|
||||||
use App\Policies\CompanyTokenPolicy;
|
use App\Policies\CompanyTokenPolicy;
|
||||||
@ -73,7 +77,9 @@ class AuthServiceProvider extends ServiceProvider
|
|||||||
*/
|
*/
|
||||||
protected $policies = [
|
protected $policies = [
|
||||||
Activity::class => ActivityPolicy::class,
|
Activity::class => ActivityPolicy::class,
|
||||||
|
BillingSubscription::class => BillingSubscriptionPolicy::class,
|
||||||
Client::class => ClientPolicy::class,
|
Client::class => ClientPolicy::class,
|
||||||
|
ClientSubscription::class => ClientSubscriptionPolicy::class,
|
||||||
Company::class => CompanyPolicy::class,
|
Company::class => CompanyPolicy::class,
|
||||||
CompanyToken::class => CompanyTokenPolicy::class,
|
CompanyToken::class => CompanyTokenPolicy::class,
|
||||||
CompanyGateway::class => CompanyGatewayPolicy::class,
|
CompanyGateway::class => CompanyGatewayPolicy::class,
|
||||||
|
28
app/Repositories/BillingSubscriptionRepository.php
Normal file
28
app/Repositories/BillingSubscriptionRepository.php
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<?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\Repositories;
|
||||||
|
|
||||||
|
|
||||||
|
use App\Models\BillingSubscription;
|
||||||
|
|
||||||
|
class BillingSubscriptionRepository extends BaseRepository
|
||||||
|
{
|
||||||
|
public function save($data, BillingSubscription $billing_subscription): ?BillingSubscription
|
||||||
|
{
|
||||||
|
$billing_subscription
|
||||||
|
->fill($data)
|
||||||
|
->save();
|
||||||
|
|
||||||
|
return $billing_subscription;
|
||||||
|
}
|
||||||
|
}
|
28
app/Repositories/ClientSubscriptionRepository.php
Normal file
28
app/Repositories/ClientSubscriptionRepository.php
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<?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\Repositories;
|
||||||
|
|
||||||
|
|
||||||
|
use App\Models\ClientSubscription;
|
||||||
|
|
||||||
|
class ClientSubscriptionRepository extends BaseRepository
|
||||||
|
{
|
||||||
|
public function save($data, ClientSubscription $client_subscription): ?ClientSubscription
|
||||||
|
{
|
||||||
|
$client_subscription
|
||||||
|
->fill($data)
|
||||||
|
->save();
|
||||||
|
|
||||||
|
return $client_subscription;
|
||||||
|
}
|
||||||
|
}
|
@ -22,6 +22,7 @@ use App\Models\Task;
|
|||||||
use App\Services\Client\ClientService;
|
use App\Services\Client\ClientService;
|
||||||
use App\Utils\Traits\MakesHash;
|
use App\Utils\Traits\MakesHash;
|
||||||
use Illuminate\Support\Carbon;
|
use Illuminate\Support\Carbon;
|
||||||
|
use Illuminate\Support\Facades\Storage;
|
||||||
|
|
||||||
class InvoiceService
|
class InvoiceService
|
||||||
{
|
{
|
||||||
@ -273,7 +274,8 @@ class InvoiceService
|
|||||||
|
|
||||||
public function deletePdf()
|
public function deletePdf()
|
||||||
{
|
{
|
||||||
UnlinkFile::dispatchNow(config('filesystems.default'), $this->invoice->client->invoice_filepath() . $this->invoice->number.'.pdf');
|
//UnlinkFile::dispatchNow(config('filesystems.default'), $this->invoice->client->invoice_filepath() . $this->invoice->number.'.pdf');
|
||||||
|
Storage::disk(config('filesystems.default'))->delete($this->invoice->client->invoice_filepath() . $this->invoice->number.'.pdf');
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
@ -74,6 +74,7 @@ class MarkPaid extends AbstractService
|
|||||||
->updatePaidToDate($payment->amount)
|
->updatePaidToDate($payment->amount)
|
||||||
->setStatus(Invoice::STATUS_PAID)
|
->setStatus(Invoice::STATUS_PAID)
|
||||||
->applyNumber()
|
->applyNumber()
|
||||||
|
->deletePdf()
|
||||||
->save();
|
->save();
|
||||||
|
|
||||||
if ($this->invoice->client->getSetting('client_manual_payment_notification'))
|
if ($this->invoice->client->getSetting('client_manual_payment_notification'))
|
||||||
|
@ -47,6 +47,7 @@ class MarkSent extends AbstractService
|
|||||||
->applyNumber()
|
->applyNumber()
|
||||||
->setDueDate()
|
->setDueDate()
|
||||||
->updateBalance($this->invoice->amount)
|
->updateBalance($this->invoice->amount)
|
||||||
|
->deletePdf()
|
||||||
->save();
|
->save();
|
||||||
|
|
||||||
$this->client->service()->updateBalance($this->invoice->balance)->save();
|
$this->client->service()->updateBalance($this->invoice->balance)->save();
|
||||||
|
73
app/Transformers/BillingSubscriptionTransformer.php
Normal file
73
app/Transformers/BillingSubscriptionTransformer.php
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<?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\Transformers;
|
||||||
|
|
||||||
|
|
||||||
|
use App\Models\BillingSubscription;
|
||||||
|
use App\Utils\Traits\MakesHash;
|
||||||
|
|
||||||
|
class BillingSubscriptionTransformer extends EntityTransformer
|
||||||
|
{
|
||||||
|
use MakesHash;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $defaultIncludes = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $availableIncludes = [
|
||||||
|
'product',
|
||||||
|
];
|
||||||
|
|
||||||
|
public function transform(BillingSubscription $billing_subscription): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'id' => $this->encodePrimaryKey($billing_subscription->id),
|
||||||
|
'user_id' => $this->encodePrimaryKey($billing_subscription->user_id),
|
||||||
|
'product_id' => $this->encodePrimaryKey($billing_subscription->product_id),
|
||||||
|
'assigned_user_id' => $this->encodePrimaryKey($billing_subscription->assigned_user_id),
|
||||||
|
'company_id' => $this->encodePrimaryKey($billing_subscription->company_id),
|
||||||
|
'is_recurring' => (bool)$billing_subscription->is_recurring,
|
||||||
|
'frequency_id' => (string)$billing_subscription->frequency_id,
|
||||||
|
'auto_bill' => (string)$billing_subscription->auto_bill,
|
||||||
|
'promo_code' => (string)$billing_subscription->promo_code,
|
||||||
|
'promo_discount' => (float)$billing_subscription->promo_discount,
|
||||||
|
'is_amount_discount' => (bool)$billing_subscription->is_amount_discount,
|
||||||
|
'allow_cancellation' => (bool)$billing_subscription->allow_cancellation,
|
||||||
|
'per_seat_enabled' => (bool)$billing_subscription->per_set_enabled,
|
||||||
|
'min_seats_limit' => (int)$billing_subscription->min_seats_limit,
|
||||||
|
'max_seats_limit' => (int)$billing_subscription->max_seats_limit,
|
||||||
|
'trial_enabled' => (bool)$billing_subscription->trial_enabled,
|
||||||
|
'trial_duration' => (int)$billing_subscription->trial_duration,
|
||||||
|
'allow_query_overrides' => (bool)$billing_subscription->allow_query_overrides,
|
||||||
|
'allow_plan_changes' => (bool)$billing_subscription->allow_plan_changes,
|
||||||
|
'plan_map' => (string)$billing_subscription->plan_map,
|
||||||
|
'refund_period' => (int)$billing_subscription->refund_period,
|
||||||
|
'webhook_configuration' => (string)$billing_subscription->webhook_configuration,
|
||||||
|
'is_deleted' => (bool)$billing_subscription->is_deleted,
|
||||||
|
'created_at' => (int)$billing_subscription->created_at,
|
||||||
|
'updated_at' => (int)$billing_subscription->updated_at,
|
||||||
|
'archived_at' => (int)$billing_subscription->deleted_at,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function includeProduct(BillingSubscription $billing_subscription): \League\Fractal\Resource\Item
|
||||||
|
{
|
||||||
|
$transformer = new ProductTransformer($this->serializer);
|
||||||
|
|
||||||
|
return $this->includeItem($billing_subscription->product, $transformer, Product::class);
|
||||||
|
}
|
||||||
|
}
|
78
app/Transformers/ClientSubscriptionTransformer.php
Normal file
78
app/Transformers/ClientSubscriptionTransformer.php
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
<?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\Transformers;
|
||||||
|
|
||||||
|
|
||||||
|
use App\Models\BillingSubscription;
|
||||||
|
use App\Models\Client;
|
||||||
|
use App\Models\ClientSubscription;
|
||||||
|
use App\Models\RecurringInvoice;
|
||||||
|
use App\Utils\Traits\MakesHash;
|
||||||
|
|
||||||
|
class ClientSubscriptionTransformer extends EntityTransformer
|
||||||
|
{
|
||||||
|
use MakesHash;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $defaultIncludes = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $availableIncludes = [
|
||||||
|
'client',
|
||||||
|
'recurring_invoice',
|
||||||
|
'subscription',
|
||||||
|
];
|
||||||
|
|
||||||
|
public function transform(ClientSubscription $client_subscription): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'id' => $this->encodePrimaryKey($client_subscription->id),
|
||||||
|
'subscription_id' => $this->encodePrimaryKey($client_subscription->subscription_id),
|
||||||
|
'company_id' => $this->encodePrimaryKey($client_subscription->company_id),
|
||||||
|
'recurring_invoice_id' => $this->encodePrimaryKey($client_subscription->recurring_invoice_id),
|
||||||
|
'client_id' => $this->encodePrimaryKey($client_subscription->client_id),
|
||||||
|
'trial_started' => (string)$client_subscription->trial_started ?: '',
|
||||||
|
'trial_ends' => (string)$client_subscription->trial_ends ?: '',
|
||||||
|
'is_deleted' => (bool)$client_subscription->is_deleted,
|
||||||
|
'created_at' => (int)$client_subscription->created_at,
|
||||||
|
'updated_at' => (int)$client_subscription->updated_at,
|
||||||
|
'archived_at' => (int)$client_subscription->deleted_at,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function includeClient(ClientSubscription $client_subscription): \League\Fractal\Resource\Item
|
||||||
|
{
|
||||||
|
$transformer = new ClientTransformer($this->serializer);
|
||||||
|
|
||||||
|
return $this->includeItem($client_subscription->client, $transformer, Client::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function includeRecurringInvoice(ClientSubscription $client_subscription): \League\Fractal\Resource\Item
|
||||||
|
{
|
||||||
|
$transformer = new RecurringInvoiceTransformer($this->serializer);
|
||||||
|
|
||||||
|
return $this->includeItem($client_subscription->recurring_invoice, $transformer, RecurringInvoice::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function includeSubscription(ClientSubscription $client_subscription): \League\Fractal\Resource\Item
|
||||||
|
{
|
||||||
|
$transformer = new BillingSubscriptionTransformer($this->serializer);
|
||||||
|
|
||||||
|
return $this->includeItem($client_subscription->subscription, $transformer, BillingSubscription::class);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -13,7 +13,9 @@ namespace App\Transformers;
|
|||||||
|
|
||||||
use App\Models\Account;
|
use App\Models\Account;
|
||||||
use App\Models\Activity;
|
use App\Models\Activity;
|
||||||
|
use App\Models\BillingSubscription;
|
||||||
use App\Models\Client;
|
use App\Models\Client;
|
||||||
|
use App\Models\ClientSubscription;
|
||||||
use App\Models\Company;
|
use App\Models\Company;
|
||||||
use App\Models\CompanyGateway;
|
use App\Models\CompanyGateway;
|
||||||
use App\Models\CompanyLedger;
|
use App\Models\CompanyLedger;
|
||||||
@ -90,6 +92,7 @@ class CompanyTransformer extends EntityTransformer
|
|||||||
'system_logs',
|
'system_logs',
|
||||||
'expense_categories',
|
'expense_categories',
|
||||||
'task_statuses',
|
'task_statuses',
|
||||||
|
'client_subscriptions',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -358,4 +361,18 @@ class CompanyTransformer extends EntityTransformer
|
|||||||
|
|
||||||
return $this->includeCollection($company->system_logs, $transformer, SystemLog::class);
|
return $this->includeCollection($company->system_logs, $transformer, SystemLog::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function includeClientSubscriptions(Company $company)
|
||||||
|
{
|
||||||
|
$transformer = new ClientSubscriptionTransformer($this->serializer);
|
||||||
|
|
||||||
|
return $this->includeCollection($company->client_subscriptions, $transformer, ClientSubscription::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function includeBillingSubscriptions(Company $company)
|
||||||
|
{
|
||||||
|
$transformer = new BillingSubscriptionTransformer($this->serializer);
|
||||||
|
|
||||||
|
return $this->includeCollection($company->billing_subscriptions, $transformer, BillingSubscription::class);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -137,6 +137,7 @@ class CreditTransformer extends EntityTransformer
|
|||||||
'entity_type' => 'credit',
|
'entity_type' => 'credit',
|
||||||
'exchange_rate' => (float) $credit->exchange_rate,
|
'exchange_rate' => (float) $credit->exchange_rate,
|
||||||
'paid_to_date' => (float) $credit->paid_to_date,
|
'paid_to_date' => (float) $credit->paid_to_date,
|
||||||
|
'subscription_id' => $this->encodePrimaryKey($credit->subscription_id),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -141,6 +141,7 @@ class InvoiceTransformer extends EntityTransformer
|
|||||||
'reminder3_sent' => $invoice->reminder3_sent ?: '',
|
'reminder3_sent' => $invoice->reminder3_sent ?: '',
|
||||||
'reminder_last_sent' => $invoice->reminder_last_sent ?: '',
|
'reminder_last_sent' => $invoice->reminder_last_sent ?: '',
|
||||||
'paid_to_date' => (float) $invoice->paid_to_date,
|
'paid_to_date' => (float) $invoice->paid_to_date,
|
||||||
|
'subscription_id' => $this->encodePrimaryKey($invoice->subscription_id),
|
||||||
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -139,6 +139,8 @@ class QuoteTransformer extends EntityTransformer
|
|||||||
'exchange_rate' => (float) $quote->exchange_rate,
|
'exchange_rate' => (float) $quote->exchange_rate,
|
||||||
'paid_to_date' => (float) $quote->paid_to_date,
|
'paid_to_date' => (float) $quote->paid_to_date,
|
||||||
'project_id' => $this->encodePrimaryKey($quote->project_id),
|
'project_id' => $this->encodePrimaryKey($quote->project_id),
|
||||||
|
'subscription_id' => $this->encodePrimaryKey($quote->subscription_id),
|
||||||
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ class Helpers
|
|||||||
$elements['signature'] = '';
|
$elements['signature'] = '';
|
||||||
$elements['settings'] = new stdClass;
|
$elements['settings'] = new stdClass;
|
||||||
$elements['whitelabel'] = true;
|
$elements['whitelabel'] = true;
|
||||||
|
$elements['company'] = '';
|
||||||
return $elements;
|
return $elements;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,6 +35,7 @@ class Helpers
|
|||||||
$elements['signature'] = $_settings->email_signature;
|
$elements['signature'] = $_settings->email_signature;
|
||||||
$elements['settings'] = $_settings;
|
$elements['settings'] = $_settings;
|
||||||
$elements['whitelabel'] = $client->user->account->isPaid() ? true : false;
|
$elements['whitelabel'] = $client->user->account->isPaid() ? true : false;
|
||||||
|
$elements['company'] = $client->company;
|
||||||
|
|
||||||
return $elements;
|
return $elements;
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@ return [
|
|||||||
'require_https' => env('REQUIRE_HTTPS', true),
|
'require_https' => env('REQUIRE_HTTPS', true),
|
||||||
'app_url' => rtrim(env('APP_URL', ''), '/'),
|
'app_url' => rtrim(env('APP_URL', ''), '/'),
|
||||||
'app_domain' => env('APP_DOMAIN', ''),
|
'app_domain' => env('APP_DOMAIN', ''),
|
||||||
'app_version' => '5.1.17',
|
'app_version' => '5.1.18',
|
||||||
'minimum_client_version' => '5.0.16',
|
'minimum_client_version' => '5.0.16',
|
||||||
'terms_version' => '1.0.1',
|
'terms_version' => '1.0.1',
|
||||||
'api_secret' => env('API_SECRET', false),
|
'api_secret' => env('API_SECRET', false),
|
||||||
|
@ -13,7 +13,7 @@ return [
|
|||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
'default' => env('QUEUE_CONNECTION', 'database'),
|
'default' => env('QUEUE_CONNECTION', 'sync'),
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
38
database/factories/BillingSubscriptionFactory.php
Normal file
38
database/factories/BillingSubscriptionFactory.php
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
<?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 Database\Factories;
|
||||||
|
|
||||||
|
use App\Models\BillingSubscription;
|
||||||
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||||
|
|
||||||
|
class BillingSubscriptionFactory extends Factory
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The name of the factory's corresponding model.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $model = BillingSubscription::class;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define the model's default state.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function definition()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,76 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class CreateBillingSubscriptionsTable extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::create('billing_subscriptions', function (Blueprint $table) {
|
||||||
|
$table->increments('id');
|
||||||
|
$table->unsignedInteger('user_id');
|
||||||
|
$table->unsignedInteger('assigned_user_id');
|
||||||
|
$table->unsignedInteger('company_id');
|
||||||
|
$table->unsignedInteger('product_id');
|
||||||
|
$table->boolean('is_recurring')->default(false);
|
||||||
|
$table->unsignedInteger('frequency_id');
|
||||||
|
$table->string('auto_bill')->default('');
|
||||||
|
$table->string('promo_code')->default('');
|
||||||
|
$table->float('promo_discount')->default(0);
|
||||||
|
$table->boolean('is_amount_discount')->default(false);
|
||||||
|
$table->boolean('allow_cancellation')->default(true);
|
||||||
|
$table->boolean('per_seat_enabled')->default(false);
|
||||||
|
$table->unsignedInteger('min_seats_limit');
|
||||||
|
$table->unsignedInteger('max_seats_limit');
|
||||||
|
$table->boolean('trial_enabled')->default(false);
|
||||||
|
$table->unsignedInteger('trial_duration');
|
||||||
|
$table->boolean('allow_query_overrides')->default(false);
|
||||||
|
$table->boolean('allow_plan_changes')->default(false);
|
||||||
|
$table->mediumText('plan_map');
|
||||||
|
$table->unsignedInteger('refund_period')->nullable();
|
||||||
|
$table->mediumText('webhook_configuration');
|
||||||
|
$table->softDeletes('deleted_at', 6);
|
||||||
|
$table->boolean('is_deleted')->default(false);
|
||||||
|
$table->timestamps();
|
||||||
|
|
||||||
|
$table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
|
||||||
|
$table->index(['company_id', 'deleted_at']);
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::create('client_subscriptions', function (Blueprint $table) {
|
||||||
|
$table->increments('id');
|
||||||
|
$table->unsignedInteger('company_id');
|
||||||
|
$table->unsignedInteger('subscription_id');
|
||||||
|
$table->unsignedInteger('recurring_invoice_id');
|
||||||
|
$table->unsignedInteger('client_id');
|
||||||
|
$table->unsignedInteger('trial_started')->nullable();
|
||||||
|
$table->unsignedInteger('trial_ends')->nullable();
|
||||||
|
$table->boolean('is_deleted')->default(false);
|
||||||
|
$table->softDeletes('deleted_at', 6);
|
||||||
|
$table->timestamps();
|
||||||
|
$table->foreign('subscription_id')->references('id')->on('billing_subscriptions');
|
||||||
|
$table->foreign('recurring_invoice_id')->references('id')->on('recurring_invoices');
|
||||||
|
$table->foreign('client_id')->references('id')->on('clients');
|
||||||
|
$table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
|
||||||
|
$table->index(['company_id', 'deleted_at']);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('billing_subscriptions');
|
||||||
|
Schema::dropIfExists('client_subscriptions');
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class AddCurrencyIdToBillingSubscriptionsTable extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::table('billing_subscriptions', function (Blueprint $table) {
|
||||||
|
$table->unsignedInteger('currency_id')->nullable();
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::table('invoices', function (Blueprint $table) {
|
||||||
|
$table->unsignedInteger('subscription_id')->nullable();
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::table('quotes', function (Blueprint $table) {
|
||||||
|
$table->unsignedInteger('subscription_id')->nullable();
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::table('credits', function (Blueprint $table) {
|
||||||
|
$table->unsignedInteger('subscription_id')->nullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
@component('email.template.master', ['design' => 'light', 'whitelabel' => false])
|
@component('email.template.master', ['design' => 'light', 'whitelabel' => false, 'company' => $company])
|
||||||
|
|
||||||
@slot('header')
|
@slot('header')
|
||||||
@include('email.components.header', ['logo' => $logo])
|
@include('email.components.header', ['logo' => $logo])
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
@component('email.template.master', ['design' => 'dark', 'settings' => $settings, 'whitelabel' => $whitelabel])
|
@component('email.template.master', ['design' => 'dark', 'settings' => $settings, 'whitelabel' => $whitelabel])
|
||||||
|
|
||||||
@slot('header')
|
@slot('header')
|
||||||
@include('email.components.header', ['logo' => (strlen($settings->company_logo) > 1) ? url('') . $settings->company_logo : 'https://www.invoiceninja.com/wp-content/uploads/2015/10/logo-white-horizontal-1.png'])
|
@include('email.components.header', ['logo' => $company->present()->logo($settings)])
|
||||||
@endslot
|
@endslot
|
||||||
|
|
||||||
{!! $body !!}
|
{!! $body !!}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
@component('email.template.master', ['design' => 'light', 'settings' => $settings, 'whitelabel' => $whitelabel])
|
@component('email.template.master', ['design' => 'light', 'settings' => $settings, 'whitelabel' => $whitelabel])
|
||||||
|
|
||||||
@slot('header')
|
@slot('header')
|
||||||
@include('email.components.header', ['logo' => (strlen($settings->company_logo) > 1) ? url('') . $settings->company_logo : 'https://www.invoiceninja.com/wp-content/uploads/2015/10/logo-white-horizontal-1.png'])
|
@include('email.components.header', ['logo' => $company->present()->logo($settings)])
|
||||||
@endslot
|
@endslot
|
||||||
|
|
||||||
{!! $body !!}
|
{!! $body !!}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<div class="flex flex-col w-64">
|
<div class="flex flex-col w-64">
|
||||||
<div class="flex items-center h-16 flex-shrink-0 px-4 bg-primary-darken justify-center">
|
<div class="flex items-center h-16 flex-shrink-0 px-4 bg-primary-darken justify-center">
|
||||||
<a href="{{ route('client.dashboard') }}">
|
<a href="{{ route('client.dashboard') }}">
|
||||||
<img class="h-8 w-auto" src="{!! $settings->company_logo ? url('') . $settings->company_logo : asset('images/invoiceninja-white-logo.png') !!}" alt="{{ config('app.name') }}" />
|
<img class="h-8 w-auto" src="{!! auth('contact')->user()->company->present()->logo($settings) !!}" alt="{{ config('app.name') }}" />
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="h-0 flex-1 flex flex-col overflow-y-auto">
|
<div class="h-0 flex-1 flex flex-col overflow-y-auto">
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex-shrink-0 flex items-center px-4">
|
<div class="flex-shrink-0 flex items-center px-4">
|
||||||
<img class="h-6 w-auto" src="{!! $settings->company_logo ? url('') . $settings->company_logo : asset('images/invoiceninja-white-logo.png') !!}" alt="{{ config('app.name') }}" />
|
<img class="h-6 w-auto" src="{!! auth('contact')->user()->company->present()->logo($settings) !!}" alt="{{ config('app.name') }}" />
|
||||||
</div>
|
</div>
|
||||||
<div class="mt-5 flex-1 h-0 overflow-y-auto">
|
<div class="mt-5 flex-1 h-0 overflow-y-auto">
|
||||||
<nav class="flex-1 py-4 bg-primary">
|
<nav class="flex-1 py-4 bg-primary">
|
||||||
|
@ -173,7 +173,8 @@ Route::group(['middleware' => ['api_db', 'token_auth', 'locale'], 'prefix' => 'a
|
|||||||
// Route::post('hooks', 'SubscriptionController@subscribe')->name('hooks.subscribe');
|
// Route::post('hooks', 'SubscriptionController@subscribe')->name('hooks.subscribe');
|
||||||
// Route::delete('hooks/{subscription_id}', 'SubscriptionController@unsubscribe')->name('hooks.unsubscribe');
|
// Route::delete('hooks/{subscription_id}', 'SubscriptionController@unsubscribe')->name('hooks.unsubscribe');
|
||||||
|
|
||||||
|
Route::resource('billing_subscriptions', 'BillingSubscriptionController');
|
||||||
|
Route::resource('cliente_subscriptions', 'ClientSubscriptionController');
|
||||||
});
|
});
|
||||||
|
|
||||||
Route::match(['get', 'post'], 'payment_webhook/{company_key}/{company_gateway_id}', 'PaymentWebhookController')
|
Route::match(['get', 'post'], 'payment_webhook/{company_key}/{company_gateway_id}', 'PaymentWebhookController')
|
||||||
|
134
tests/Feature/BillingSubscriptionApiTest.php
Normal file
134
tests/Feature/BillingSubscriptionApiTest.php
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
<?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 Tests\Feature;
|
||||||
|
|
||||||
|
use App\Models\BillingSubscription;
|
||||||
|
use App\Models\Product;
|
||||||
|
use App\Utils\Traits\MakesHash;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||||
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||||
|
use Illuminate\Foundation\Testing\WithFaker;
|
||||||
|
use Illuminate\Support\Facades\Session;
|
||||||
|
use Tests\MockAccountData;
|
||||||
|
use Tests\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
* @covers App\Http\Controllers\BillingSubscriptionController
|
||||||
|
*/
|
||||||
|
class BillingSubscriptionApiTest extends TestCase
|
||||||
|
{
|
||||||
|
use MakesHash;
|
||||||
|
use DatabaseTransactions;
|
||||||
|
use MockAccountData;
|
||||||
|
|
||||||
|
public function setUp(): void
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
$this->makeTestData();
|
||||||
|
|
||||||
|
Session::start();
|
||||||
|
|
||||||
|
$this->faker = \Faker\Factory::create();
|
||||||
|
|
||||||
|
Model::reguard();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testExpenseGet()
|
||||||
|
{
|
||||||
|
$product = Product::factory()->create([
|
||||||
|
'company_id' => $this->company->id,
|
||||||
|
'user_id' => $this->user->id,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$billing_subscription = BillingSubscription::factory()->create([
|
||||||
|
'product_id' => $product->id,
|
||||||
|
'company_id' => $this->company->id,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$response = $this->withHeaders([
|
||||||
|
'X-API-SECRET' => config('ninja.api_secret'),
|
||||||
|
'X-API-TOKEN' => $this->token,
|
||||||
|
])->get('/api/v1/billing_subscriptions/' . $this->encodePrimaryKey($billing_subscription->id));
|
||||||
|
|
||||||
|
$response->assertStatus(200);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testBillingSubscriptionsPost()
|
||||||
|
{
|
||||||
|
$product = Product::factory()->create([
|
||||||
|
'company_id' => $this->company->id,
|
||||||
|
'user_id' => $this->user->id,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$response = $this->withHeaders([
|
||||||
|
'X-API-SECRET' => config('ninja.api_secret'),
|
||||||
|
'X-API-TOKEN' => $this->token,
|
||||||
|
])->post('/api/v1/billing_subscriptions', ['product_id' => $product->id, 'allow_cancellation' => true]);
|
||||||
|
|
||||||
|
$response->assertStatus(200);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testBillingSubscriptionPut()
|
||||||
|
{
|
||||||
|
$product = Product::factory()->create([
|
||||||
|
'company_id' => $this->company->id,
|
||||||
|
'user_id' => $this->user->id,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$response1 = $this
|
||||||
|
->withHeaders(['X-API-SECRET' => config('ninja.api_secret'),'X-API-TOKEN' => $this->token])
|
||||||
|
->post('/api/v1/billing_subscriptions', ['product_id' => $product->id])
|
||||||
|
->assertStatus(200)
|
||||||
|
->json();
|
||||||
|
|
||||||
|
$response2 = $this
|
||||||
|
->withHeaders(['X-API-SECRET' => config('ninja.api_secret'),'X-API-TOKEN' => $this->token])
|
||||||
|
->put('/api/v1/billing_subscriptions/' . $response1['data']['id'], ['allow_cancellation' => true])
|
||||||
|
->assertStatus(200)
|
||||||
|
->json();
|
||||||
|
|
||||||
|
$this->assertNotEquals($response1['data']['allow_cancellation'], $response2['data']['allow_cancellation']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
TypeError : Argument 1 passed to App\Transformers\BillingSubscriptionTransformer::transform() must be an instance of App\Models\BillingSubscription, bool given, called in /var/www/html/vendor/league/fractal/src/Scope.php on line 407
|
||||||
|
/var/www/html/app/Transformers/BillingSubscriptionTransformer.php:35
|
||||||
|
/var/www/html/vendor/league/fractal/src/Scope.php:407
|
||||||
|
/var/www/html/vendor/league/fractal/src/Scope.php:349
|
||||||
|
/var/www/html/vendor/league/fractal/src/Scope.php:235
|
||||||
|
/var/www/html/app/Http/Controllers/BaseController.php:395
|
||||||
|
/var/www/html/app/Http/Controllers/BillingSubscriptionController.php:408
|
||||||
|
*/
|
||||||
|
public function testBillingSubscriptionDeleted()
|
||||||
|
{
|
||||||
|
|
||||||
|
$product = Product::factory()->create([
|
||||||
|
'company_id' => $this->company->id,
|
||||||
|
'user_id' => $this->user->id,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$billing_subscription = BillingSubscription::factory()->create([
|
||||||
|
'product_id' => $product->id,
|
||||||
|
'company_id' => $this->company->id,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$response = $this
|
||||||
|
->withHeaders(['X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token])
|
||||||
|
->delete('/api/v1/billing_subscriptions/' . $this->encodePrimaryKey($billing_subscription->id))
|
||||||
|
->assertStatus(200)
|
||||||
|
->json();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user