first commit
Some checks failed
Build / run (push) Has been cancelled

This commit is contained in:
maher
2025-10-29 11:42:25 +01:00
commit 703f50a09d
4595 changed files with 385164 additions and 0 deletions

View 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;
}
}

View 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);
}
}

View 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));
}
}

View 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;
}
}