mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-09 03:14:30 -04:00
Merge pull request #5058 from beganovich/0803-billing-subscription
0803 billing subscription
This commit is contained in:
commit
009c1e243e
@ -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');
|
||||||
|
}
|
||||||
|
}
|
17
app/Factory/BillingSubscriptionFactory.php
Normal file
17
app/Factory/BillingSubscriptionFactory.php
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
namespace App\Factory;
|
||||||
|
|
||||||
|
|
||||||
|
use App\Models\BillingSubscription;
|
||||||
|
|
||||||
|
class BillingSubscriptionFactory
|
||||||
|
{
|
||||||
|
public static function create(int $company_id, int $user_id): BillingSubscription
|
||||||
|
{
|
||||||
|
$billing_subscription = new BillingSubscription();
|
||||||
|
|
||||||
|
return $billing_subscription;
|
||||||
|
}
|
||||||
|
}
|
93
app/Http/Controllers/BillingSubscriptionController.php
Normal file
93
app/Http/Controllers/BillingSubscriptionController.php
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
<?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;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index(): \Illuminate\Http\Response
|
||||||
|
{
|
||||||
|
$billing_subscriptions = BillingSubscription::query()->company();
|
||||||
|
|
||||||
|
return $this->listResponse($billing_subscriptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function create(CreateBillingSubscriptionRequest $request): \Illuminate\Http\Response
|
||||||
|
{
|
||||||
|
$billing_subscription = BillingSubscriptionFactory::create(auth()->user()->company()->id, auth()->user()->id);
|
||||||
|
|
||||||
|
return $this->itemResponse($billing_subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function show(ShowBillingSubscriptionRequest $request, BillingSubscription $billing_subscription): \Illuminate\Http\Response
|
||||||
|
{
|
||||||
|
return $this->itemResponse($billing_subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function edit(EditBillingSubscriptionRequest $request, BillingSubscription $billing_subscription): \Illuminate\Http\Response
|
||||||
|
{
|
||||||
|
return $this->itemResponse($billing_subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function destroy(DestroyBillingSubscriptionRequest $request, BillingSubscription $billing_subscription): \Illuminate\Http\Response
|
||||||
|
{
|
||||||
|
$this->billing_subscription_repo->delete($billing_subscription);
|
||||||
|
|
||||||
|
return $this->listResponse($billing_subscription->fresh());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests\BillingSubscription;
|
||||||
|
|
||||||
|
use App\Http\Requests\Request;
|
||||||
|
|
||||||
|
class CreateBillingSubscriptionRequest extends Request
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
// return auth()->user()->can('create', BillingSubscription::class); // TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
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 true; // TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
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 true;
|
||||||
|
|
||||||
|
// return auth()->user()->can('view', $this->billing_subscription); // TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
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 true;
|
||||||
|
// return auth()->user()->can('view', $this->billing_subscription); // TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,50 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests\BillingSubscription;
|
||||||
|
|
||||||
|
use App\Http\Requests\Request;
|
||||||
|
|
||||||
|
class StoreBillingSubscriptionRequest extends Request
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize()
|
||||||
|
{
|
||||||
|
return true; // TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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,33 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
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 true; // TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
61
app/Models/BillingSubscription.php
Normal file
61
app/Models/BillingSubscription.php
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
<?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',
|
||||||
|
];
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
11
app/Models/ClientSubscription.php
Normal file
11
app/Models/ClientSubscription.php
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class ClientSubscription extends Model
|
||||||
|
{
|
||||||
|
use HasFactory;
|
||||||
|
}
|
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;
|
||||||
|
}
|
||||||
|
}
|
70
app/Transformers/BillingSubscriptionTransformer.php
Normal file
70
app/Transformers/BillingSubscriptionTransformer.php
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
<?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 = [
|
||||||
|
'products',
|
||||||
|
];
|
||||||
|
|
||||||
|
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' => (string)$billing_subscription->promo_discount,
|
||||||
|
'is_amount_discount' => (bool)$billing_subscription->is_amount_discount,
|
||||||
|
'allow_cancellation' => (bool)$billing_subscription->allow_cancellation,
|
||||||
|
'per_set_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' => (string)$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' => (string)$billing_subscription->refund_period,
|
||||||
|
'webhook_configuration' => (string)$billing_subscription->webhook_configuration,
|
||||||
|
'is_deleted' => (bool)$billing_subscription->is_deleted,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function includeProducts(BillingSubscription $billing_subscription): \League\Fractal\Resource\Item
|
||||||
|
{
|
||||||
|
$transformer = new ProductTransformer($this->serializer);
|
||||||
|
|
||||||
|
return $this->includeItem($billing_subscription->product, $transformer, Product::class);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,71 @@
|
|||||||
|
<?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_set_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('product_id')->references('id')->on('products');
|
||||||
|
$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('subscription_id');
|
||||||
|
$table->unsignedInteger('recurring_invoice_id');
|
||||||
|
$table->unsignedInteger('client_id');
|
||||||
|
$table->unsignedInteger('trial_started')->nullable();
|
||||||
|
$table->unsignedInteger('trial_ends')->nullable();
|
||||||
|
$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');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('billing_subscriptions');
|
||||||
|
Schema::dropIfExists('client_subscriptions');
|
||||||
|
}
|
||||||
|
}
|
@ -68,7 +68,7 @@ Route::group(['middleware' => ['api_db', 'token_auth', 'locale'], 'prefix' => 'a
|
|||||||
Route::post('emails', 'EmailController@send')->name('email.send')->middleware('user_verified');
|
Route::post('emails', 'EmailController@send')->name('email.send')->middleware('user_verified');
|
||||||
|
|
||||||
Route::resource('expenses', 'ExpenseController'); // name = (expenses. index / create / show / update / destroy / edit
|
Route::resource('expenses', 'ExpenseController'); // name = (expenses. index / create / show / update / destroy / edit
|
||||||
Route::put('expenses/{expense}/upload', 'ExpenseController@upload');
|
Route::put('expenses/{expense}/upload', 'ExpenseController@upload');
|
||||||
Route::post('expenses/bulk', 'ExpenseController@bulk')->name('expenses.bulk');
|
Route::post('expenses/bulk', 'ExpenseController@bulk')->name('expenses.bulk');
|
||||||
|
|
||||||
Route::resource('expense_categories', 'ExpenseCategoryController'); // name = (expense_categories. index / create / show / update / destroy / edit
|
Route::resource('expense_categories', 'ExpenseCategoryController'); // name = (expense_categories. index / create / show / update / destroy / edit
|
||||||
@ -98,7 +98,7 @@ Route::group(['middleware' => ['api_db', 'token_auth', 'locale'], 'prefix' => 'a
|
|||||||
Route::resource('payments', 'PaymentController'); // name = (payments. index / create / show / update / destroy / edit
|
Route::resource('payments', 'PaymentController'); // name = (payments. index / create / show / update / destroy / edit
|
||||||
Route::post('payments/refund', 'PaymentController@refund')->name('payments.refund');
|
Route::post('payments/refund', 'PaymentController@refund')->name('payments.refund');
|
||||||
Route::post('payments/bulk', 'PaymentController@bulk')->name('payments.bulk');
|
Route::post('payments/bulk', 'PaymentController@bulk')->name('payments.bulk');
|
||||||
Route::put('payments/{payment}/upload', 'PaymentController@upload');
|
Route::put('payments/{payment}/upload', 'PaymentController@upload');
|
||||||
|
|
||||||
Route::resource('payment_terms', 'PaymentTermController'); // name = (payments. index / create / show / update / destroy / edit
|
Route::resource('payment_terms', 'PaymentTermController'); // name = (payments. index / create / show / update / destroy / edit
|
||||||
Route::post('payment_terms/bulk', 'PaymentTermController@bulk')->name('payment_terms.bulk');
|
Route::post('payment_terms/bulk', 'PaymentTermController@bulk')->name('payment_terms.bulk');
|
||||||
@ -107,20 +107,20 @@ Route::group(['middleware' => ['api_db', 'token_auth', 'locale'], 'prefix' => 'a
|
|||||||
|
|
||||||
Route::resource('products', 'ProductController'); // name = (products. index / create / show / update / destroy / edit
|
Route::resource('products', 'ProductController'); // name = (products. index / create / show / update / destroy / edit
|
||||||
Route::post('products/bulk', 'ProductController@bulk')->name('products.bulk');
|
Route::post('products/bulk', 'ProductController@bulk')->name('products.bulk');
|
||||||
Route::put('products/{product}/upload', 'ProductController@upload');
|
Route::put('products/{product}/upload', 'ProductController@upload');
|
||||||
|
|
||||||
Route::resource('projects', 'ProjectController'); // name = (projects. index / create / show / update / destroy / edit
|
Route::resource('projects', 'ProjectController'); // name = (projects. index / create / show / update / destroy / edit
|
||||||
Route::post('projects/bulk', 'ProjectController@bulk')->name('projects.bulk');
|
Route::post('projects/bulk', 'ProjectController@bulk')->name('projects.bulk');
|
||||||
Route::put('projects/{project}/upload', 'ProjectController@upload')->name('projects.upload');
|
Route::put('projects/{project}/upload', 'ProjectController@upload')->name('projects.upload');
|
||||||
|
|
||||||
Route::resource('quotes', 'QuoteController'); // name = (quotes. index / create / show / update / destroy / edit
|
Route::resource('quotes', 'QuoteController'); // name = (quotes. index / create / show / update / destroy / edit
|
||||||
Route::get('quotes/{quote}/{action}', 'QuoteController@action')->name('quotes.action');
|
Route::get('quotes/{quote}/{action}', 'QuoteController@action')->name('quotes.action');
|
||||||
Route::post('quotes/bulk', 'QuoteController@bulk')->name('quotes.bulk');
|
Route::post('quotes/bulk', 'QuoteController@bulk')->name('quotes.bulk');
|
||||||
Route::put('quotes/{quote}/upload', 'QuoteController@upload');
|
Route::put('quotes/{quote}/upload', 'QuoteController@upload');
|
||||||
|
|
||||||
Route::resource('recurring_invoices', 'RecurringInvoiceController'); // name = (recurring_invoices. index / create / show / update / destroy / edit
|
Route::resource('recurring_invoices', 'RecurringInvoiceController'); // name = (recurring_invoices. index / create / show / update / destroy / edit
|
||||||
Route::post('recurring_invoices/bulk', 'RecurringInvoiceController@bulk')->name('recurring_invoices.bulk');
|
Route::post('recurring_invoices/bulk', 'RecurringInvoiceController@bulk')->name('recurring_invoices.bulk');
|
||||||
Route::put('recurring_invoices/{recurring_invoice}/upload', 'RecurringInvoiceController@upload');
|
Route::put('recurring_invoices/{recurring_invoice}/upload', 'RecurringInvoiceController@upload');
|
||||||
Route::resource('recurring_quotes', 'RecurringQuoteController'); // name = (recurring_invoices. index / create / show / update / destroy / edit
|
Route::resource('recurring_quotes', 'RecurringQuoteController'); // name = (recurring_invoices. index / create / show / update / destroy / edit
|
||||||
|
|
||||||
Route::post('recurring_quotes/bulk', 'RecurringQuoteController@bulk')->name('recurring_quotes.bulk');
|
Route::post('recurring_quotes/bulk', 'RecurringQuoteController@bulk')->name('recurring_quotes.bulk');
|
||||||
@ -137,7 +137,7 @@ Route::group(['middleware' => ['api_db', 'token_auth', 'locale'], 'prefix' => 'a
|
|||||||
|
|
||||||
Route::resource('tasks', 'TaskController'); // name = (tasks. index / create / show / update / destroy / edit
|
Route::resource('tasks', 'TaskController'); // name = (tasks. index / create / show / update / destroy / edit
|
||||||
Route::post('tasks/bulk', 'TaskController@bulk')->name('tasks.bulk');
|
Route::post('tasks/bulk', 'TaskController@bulk')->name('tasks.bulk');
|
||||||
Route::put('tasks/{task}/upload', 'TaskController@upload');
|
Route::put('tasks/{task}/upload', 'TaskController@upload');
|
||||||
|
|
||||||
Route::resource('task_statuses', 'TaskStatusController'); // name = (task_statuses. index / create / show / update / destroy / edit
|
Route::resource('task_statuses', 'TaskStatusController'); // name = (task_statuses. index / create / show / update / destroy / edit
|
||||||
Route::post('task_statuses/bulk', 'TaskStatusController@bulk')->name('task_statuses.bulk');
|
Route::post('task_statuses/bulk', 'TaskStatusController@bulk')->name('task_statuses.bulk');
|
||||||
@ -155,7 +155,7 @@ Route::group(['middleware' => ['api_db', 'token_auth', 'locale'], 'prefix' => 'a
|
|||||||
|
|
||||||
Route::resource('vendors', 'VendorController'); // name = (vendors. index / create / show / update / destroy / edit
|
Route::resource('vendors', 'VendorController'); // name = (vendors. index / create / show / update / destroy / edit
|
||||||
Route::post('vendors/bulk', 'VendorController@bulk')->name('vendors.bulk');
|
Route::post('vendors/bulk', 'VendorController@bulk')->name('vendors.bulk');
|
||||||
Route::put('vendors/{vendor}/upload', 'VendorController@upload');
|
Route::put('vendors/{vendor}/upload', 'VendorController@upload');
|
||||||
|
|
||||||
Route::get('users', 'UserController@index');
|
Route::get('users', 'UserController@index');
|
||||||
Route::put('users/{user}', 'UserController@update')->middleware('password_protected');
|
Route::put('users/{user}', 'UserController@update')->middleware('password_protected');
|
||||||
@ -173,7 +173,7 @@ 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::match(['get', 'post'], 'payment_webhook/{company_key}/{company_gateway_id}', 'PaymentWebhookController')
|
Route::match(['get', 'post'], 'payment_webhook/{company_key}/{company_gateway_id}', 'PaymentWebhookController')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user