feat(wip member dashboard)
All checks were successful
Deploy Roxane to Preprod / deploy (push) Successful in 26h10m31s
All checks were successful
Deploy Roxane to Preprod / deploy (push) Successful in 26h10m31s
This commit is contained in:
47
app/Http/Controllers/DashboardController.php
Normal file
47
app/Http/Controllers/DashboardController.php
Normal file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Resources\MemberResource;
|
||||
use App\Notifications\ServiceActivationRequestNotification;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Notification;
|
||||
use Inertia\Inertia;
|
||||
use Inertia\Response;
|
||||
|
||||
class DashboardController extends Controller
|
||||
{
|
||||
public function index(Request $request): Response
|
||||
{
|
||||
$member = $request->user()
|
||||
->members()
|
||||
->with([
|
||||
'lastActiveMembership.package',
|
||||
'lastActiveMembership.services',
|
||||
])
|
||||
->first();
|
||||
|
||||
return Inertia::render('dashboard', [
|
||||
'member' => $member ? new MemberResource($member) : null,
|
||||
]);
|
||||
}
|
||||
|
||||
public function requestServiceActivation(Request $request): RedirectResponse
|
||||
{
|
||||
$request->validate([
|
||||
'service_identifier' => ['required', 'string'],
|
||||
]);
|
||||
|
||||
$member = $request->user()->members()->first();
|
||||
|
||||
if ($member === null) {
|
||||
return back()->with('flash', ['error' => 'Aucun compte membre associé.']);
|
||||
}
|
||||
|
||||
Notification::route('mail', config('app.admin_email'))
|
||||
->notify(new ServiceActivationRequestNotification($member, $request->string('service_identifier')));
|
||||
|
||||
return back()->with('flash', ['success' => "Votre demande d'activation a bien été envoyée."]);
|
||||
}
|
||||
}
|
||||
23
app/Http/Resources/MemberResource.php
Normal file
23
app/Http/Resources/MemberResource.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Resources;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class MemberResource extends JsonResource
|
||||
{
|
||||
/**
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
public function toArray(Request $request): array
|
||||
{
|
||||
return [
|
||||
'firstname' => $this->firstname,
|
||||
'lastname' => $this->lastname,
|
||||
'email' => $this->email,
|
||||
'retzien_email' => $this->retzien_email,
|
||||
'membership' => new MembershipResource($this->whenLoaded('lastActiveMembership')),
|
||||
];
|
||||
}
|
||||
}
|
||||
25
app/Http/Resources/MembershipResource.php
Normal file
25
app/Http/Resources/MembershipResource.php
Normal file
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Resources;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class MembershipResource extends JsonResource
|
||||
{
|
||||
/**
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
public function toArray(Request $request): array
|
||||
{
|
||||
return [
|
||||
'status' => $this->status,
|
||||
'payment_status' => $this->payment_status,
|
||||
'start_date' => $this->start_date,
|
||||
'end_date' => $this->end_date,
|
||||
'amount' => $this->amount,
|
||||
'package' => new PackageResource($this->whenLoaded('package')),
|
||||
'services' => ServiceResource::collection($this->whenLoaded('services')),
|
||||
];
|
||||
}
|
||||
}
|
||||
22
app/Http/Resources/PackageResource.php
Normal file
22
app/Http/Resources/PackageResource.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Resources;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class PackageResource extends JsonResource
|
||||
{
|
||||
/**
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
public function toArray(Request $request): array
|
||||
{
|
||||
return [
|
||||
'identifier' => $this->identifier,
|
||||
'name' => $this->name,
|
||||
'description' => $this->description,
|
||||
'price' => $this->price,
|
||||
];
|
||||
}
|
||||
}
|
||||
24
app/Http/Resources/ServiceResource.php
Normal file
24
app/Http/Resources/ServiceResource.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Resources;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class ServiceResource extends JsonResource
|
||||
{
|
||||
/**
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
public function toArray(Request $request): array
|
||||
{
|
||||
return [
|
||||
'identifier' => $this->identifier,
|
||||
'name' => $this->name,
|
||||
'description' => $this->description,
|
||||
'url' => $this->url,
|
||||
'icon' => $this->icon,
|
||||
'is_active' => (bool) $this->whenPivotLoaded('services_memberships', fn () => $this->pivot->is_active),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
|
||||
@@ -152,6 +153,11 @@ class Member extends Model
|
||||
return $this->hasMany(NextCloudMember::class, 'member_id');
|
||||
}
|
||||
|
||||
public function lastActiveMembership(): HasOne
|
||||
{
|
||||
return $this->hasOne(Membership::class)->where('status', 'active')->latest();
|
||||
}
|
||||
|
||||
public function lastMembership(): ?Membership
|
||||
{
|
||||
return $this->memberships()->where('status', 'active')->first();
|
||||
|
||||
@@ -5,8 +5,6 @@ namespace App\Models;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||
|
||||
/**
|
||||
* @property int $id
|
||||
@@ -32,6 +30,7 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||
* @property-read \App\Models\Package $package
|
||||
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Service> $services
|
||||
* @property-read int|null $services_count
|
||||
*
|
||||
* @method static \Illuminate\Database\Eloquent\Builder<static>|Membership newModelQuery()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder<static>|Membership newQuery()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder<static>|Membership query()
|
||||
@@ -53,6 +52,7 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||
* @method static \Illuminate\Database\Eloquent\Builder<static>|Membership whereStatus($value)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder<static>|Membership whereUpdatedAt($value)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder<static>|Membership whereValidationDate($value)
|
||||
*
|
||||
* @mixin \Eloquent
|
||||
*/
|
||||
class Membership extends Model
|
||||
@@ -71,10 +71,9 @@ class Membership extends Model
|
||||
'note_public',
|
||||
'note_private',
|
||||
'dolibarr_id',
|
||||
'dolibarr_user_id'
|
||||
'dolibarr_user_id',
|
||||
];
|
||||
|
||||
|
||||
public static function getAttributeLabel(string $attribute): string
|
||||
{
|
||||
return __("memberships.fields.$attribute");
|
||||
@@ -97,7 +96,7 @@ class Membership extends Model
|
||||
|
||||
public function services(): BelongsToMany
|
||||
{
|
||||
return $this->belongsToMany(Service::class, 'services_memberships', 'membership_id', 'service_id');
|
||||
return $this->belongsToMany(Service::class, 'services_memberships', 'membership_id', 'service_id')
|
||||
->withPivot('is_active');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
54
app/Notifications/ServiceActivationRequestNotification.php
Normal file
54
app/Notifications/ServiceActivationRequestNotification.php
Normal file
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
namespace App\Notifications;
|
||||
|
||||
use App\Models\Member;
|
||||
use App\Models\NotificationTemplate;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Notifications\Messages\MailMessage;
|
||||
use Illuminate\Notifications\Notification;
|
||||
|
||||
class ServiceActivationRequestNotification extends Notification implements ShouldQueue
|
||||
{
|
||||
use Queueable;
|
||||
|
||||
public function __construct(
|
||||
public readonly Member $member,
|
||||
public readonly string $serviceIdentifier,
|
||||
) {}
|
||||
|
||||
/**
|
||||
* @return array<int, string>
|
||||
*/
|
||||
public function via(object $notifiable): array
|
||||
{
|
||||
return ['mail'];
|
||||
}
|
||||
|
||||
public function toMail(object $notifiable): MailMessage
|
||||
{
|
||||
$template = NotificationTemplate::findByIdentifier('service_activation_request');
|
||||
|
||||
$vars = [
|
||||
'member_name' => $this->member->full_name,
|
||||
'member_email' => $this->member->email ?? '',
|
||||
'service_identifier' => $this->serviceIdentifier,
|
||||
'app_name' => config('app.name'),
|
||||
];
|
||||
|
||||
return (new MailMessage)
|
||||
->subject($template->renderSubject($vars))
|
||||
->view('notifications.mail-template', [
|
||||
'body' => $template->renderBody($vars),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
public function toArray(object $notifiable): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user