31
common/Billing/Invoices/CreateInvoice.php
Executable file
31
common/Billing/Invoices/CreateInvoice.php
Executable file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace Common\Billing\Invoices;
|
||||
|
||||
use Common\Billing\Notifications\NewInvoiceAvailable;
|
||||
use Common\Billing\Subscription;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class CreateInvoice
|
||||
{
|
||||
public function execute(array $data): Invoice
|
||||
{
|
||||
$invoice = new Invoice([
|
||||
'subscription_id' => $data['subscription_id'],
|
||||
'paid' => $data['paid'],
|
||||
'uuid' => $data['uuid'] ?? Str::random(10),
|
||||
'notes' => Arr::get($data, 'notes'),
|
||||
]);
|
||||
|
||||
$invoice->save();
|
||||
|
||||
if ($data['paid']) {
|
||||
Subscription::find($data['subscription_id'])->user->notify(
|
||||
new NewInvoiceAvailable($invoice),
|
||||
);
|
||||
}
|
||||
|
||||
return $invoice;
|
||||
}
|
||||
}
|
||||
30
common/Billing/Invoices/Invoice.php
Executable file
30
common/Billing/Invoices/Invoice.php
Executable file
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace Common\Billing\Invoices;
|
||||
|
||||
use Common\Billing\Subscription;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
|
||||
class Invoice extends Model
|
||||
{
|
||||
protected $guarded = ['id'];
|
||||
|
||||
protected $casts = [
|
||||
'id' => 'integer',
|
||||
'subscription_id' => 'integer',
|
||||
'paid' => 'boolean',
|
||||
];
|
||||
|
||||
const MODEL_TYPE = 'invoice';
|
||||
|
||||
public static function getModelTypeAttribute(): string
|
||||
{
|
||||
return self::MODEL_TYPE;
|
||||
}
|
||||
|
||||
public function subscription(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Subscription::class);
|
||||
}
|
||||
}
|
||||
64
common/Billing/Invoices/InvoiceController.php
Executable file
64
common/Billing/Invoices/InvoiceController.php
Executable file
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
namespace Common\Billing\Invoices;
|
||||
|
||||
use Common\Billing\Subscription;
|
||||
use Common\Core\AppUrl;
|
||||
use Common\Core\BaseController;
|
||||
use Common\Settings\Settings;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Response;
|
||||
|
||||
class InvoiceController extends BaseController
|
||||
{
|
||||
public function __construct(
|
||||
protected Request $request,
|
||||
protected Invoice $invoice,
|
||||
) {
|
||||
}
|
||||
|
||||
public function index(): Response|JsonResponse
|
||||
{
|
||||
$userId = $this->request->get('userId');
|
||||
$this->authorize('index', [Invoice::class, $userId]);
|
||||
|
||||
if ($userId) {
|
||||
$subscription = Subscription::where(
|
||||
'user_id',
|
||||
$userId,
|
||||
)->firstOrFail();
|
||||
$invoices = $subscription->invoices()->with(
|
||||
'subscription.product',
|
||||
'subscription.price',
|
||||
)->get();
|
||||
} else {
|
||||
$invoices = $this->invoice
|
||||
->with('subscription.product', 'subscription.price')
|
||||
->limit(50)
|
||||
->get();
|
||||
}
|
||||
|
||||
return $this->success(['invoices' => $invoices]);
|
||||
}
|
||||
|
||||
public function show(string $uuid)
|
||||
{
|
||||
$invoice = $this->invoice
|
||||
->where('uuid', $uuid)
|
||||
->with(
|
||||
'subscription.product',
|
||||
'subscription.user',
|
||||
'subscription.price',
|
||||
)
|
||||
->firstOrFail();
|
||||
|
||||
$this->authorize('show', $invoice);
|
||||
|
||||
return view('common::billing/invoice')
|
||||
->with('invoice', $invoice)
|
||||
->with('htmlBaseUri', app(AppUrl::class)->htmlBaseUri)
|
||||
->with('user', $invoice->subscription->user)
|
||||
->with('settings', app(Settings::class));
|
||||
}
|
||||
}
|
||||
21
common/Billing/Invoices/InvoicePolicy.php
Executable file
21
common/Billing/Invoices/InvoicePolicy.php
Executable file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace Common\Billing\Invoices;
|
||||
|
||||
use App\Models\User;
|
||||
use Common\Core\Policies\BasePolicy;
|
||||
|
||||
class InvoicePolicy extends BasePolicy
|
||||
{
|
||||
public function index(User $user, $userId = null): bool
|
||||
{
|
||||
return $user->hasPermission('invoices.view') ||
|
||||
$user->id === (int) $userId;
|
||||
}
|
||||
|
||||
public function show(User $user, Invoice $invoice): bool
|
||||
{
|
||||
return $user->hasPermission('invoices.view') ||
|
||||
$invoice->subscription->user_id == $user->id;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user