diff --git a/.env.example b/.env.example
index b5b14d3..4f53a21 100644
--- a/.env.example
+++ b/.env.example
@@ -1,4 +1,5 @@
APP_NAME="Roxane - Le Retzien Libre"
+FRONT_NAME="Le Retzien Libre"
APP_ENV=local
APP_KEY=
APP_DEBUG=true
diff --git a/PROJECT_STRUCTURE.md b/PROJECT_STRUCTURE.md
index 5e1e535..28bc874 100644
--- a/PROJECT_STRUCTURE.md
+++ b/PROJECT_STRUCTURE.md
@@ -165,9 +165,24 @@ resources/js/components/
## Notifications
-| Classe | Canal | Description |
-| ------------------------- | ----- | --------------------------------------------- |
-| SubscriptionExpiredPhase1 | Email | Notification d'expiration d'adhesion (queued) |
+Toutes les notifications sont queueable (`ShouldQueue`). Le template Blade `notifications/mail-template.blade.php` est partagé et accepte une variable `$appName` pour différencier les emails membres des emails admin.
+
+| Classe | Canal | Destinataire | Déclencheur |
+| ----------------------------------- | ----- | ------------ | ------------------------------------------------ |
+| ContactNewRequestNotification | Email | Admin | Soumission formulaire de contact |
+| MemberNewRequestAdminNotification | Email | Admin | Soumission formulaire d'adhésion |
+| MemberNewRequestMemberNotification | Email | Membre | Soumission formulaire d'adhésion (confirmation) |
+| MembershipValidatedNotification | Email | Membre | Validation admin d'une adhésion (action Filament)|
+| MemberDeactivatedMemberNotification | Email | Membre | Désactivation d'un membre |
+| MemberDeactivatedAdminNotification | Email | Admin | Désactivation d'un membre |
+| AdminInvitationNotification | Email | Admin | Création d'un compte administrateur |
+| AdminPasswordResetNotification | Email | Admin | Réinitialisation de mot de passe admin |
+| ServiceActivationRequestNotification| Email | Admin | Demande d'activation de service (dashboard) |
+| SubscriptionExpiredPhase1 | Email | Membre | Job planifié d'expiration d'adhésion |
+
+### Config app_name dans les emails
+- Emails membres : `config('app.front_name')` (variable `FRONT_NAME` dans `.env`)
+- Emails admin : `config('app.name')` (variable `APP_NAME` dans `.env`)
---
@@ -179,15 +194,16 @@ Langues : **fr**, **en** — fichiers dans `lang/{locale}/` : contacts, members,
## TODOs identifies dans le code
-| Fichier | TODO |
-|---------------------------|----------------------------------------------------------------------------|
-| ContactService | Envoyer un email a l'administrateur |
-| MemberService | Envoyer des emails au membre + admin a la desactivation |
-| SubscriptionExpiredPhase1 | Creer un template generique + UI backend pour le contenu |
-| User.php | Restreindre l'acces admin en prod aux emails @retzien.fr |
-| SyncDolibarrMembers | Exporter la methode toDate() dans un service/helper |
-| SyncISPConfigMailMembers | Gerer plusieurs emails par membre |
-| SyncISPConfigMailMembers | Ajouter le suivi ispconfig_client_id |
-| Global | Refactoriser pour rendre générique le projet Roxane (ERP pour association) |
-| Traduction | Crawler le prrojet pour retrouver toutes les clés manquantes |
-| Global | PHPstan niveau 8 |
+| Fichier | TODO |
+|--------------------------------|--------------------------------------------------------------------------------|
+| Notifications (x9) | Propager `appName` dans `->view()` pour toutes les notifications restantes |
+| SubscriptionExpiredPhase1 | UI backend pour éditer le contenu du template de notification |
+| User.php | Restreindre l'acces admin en prod aux emails @retzien.fr |
+| SyncDolibarrMembers | Exporter la methode toDate() dans un service/helper |
+| SyncISPConfigMailMembers | Gerer plusieurs emails par membre |
+| SyncISPConfigMailMembers | Ajouter le suivi ispconfig_client_id |
+| MembershipValidatedNotification| Ajouter lien HelloAsso vers le paiement quand disponible |
+| Global | Refactoriser pour rendre générique le projet Roxane (ERP pour association) |
+| Traduction | Crawler le projet pour retrouver toutes les clés manquantes |
+| Global | PHPstan niveau 8 |
+| dev-routes.php | Supprimer la route de test mail (/test/mail) avant mise en production |
diff --git a/README.md b/README.md
index ef148ec..e7a38e0 100644
--- a/README.md
+++ b/README.md
@@ -12,17 +12,24 @@ The project is developed in the context of **Le Retzien Libre**, a non-profit as
**Back office (administrators)**
- Member management (status, nature, groups)
-- Subscription and package management
+- Subscription and package management with validation workflow (pending → active)
- Manual and automated synchronization with third-party services
- Role and permission management (Spatie Permissions + Filament Shield)
- Two-factor authentication for admin accounts
**Front office (members)**
-- Registration and membership form
+- Registration and membership form with real-time field validation
- Personal dashboard with access to associated services
- Profile and password management
- Two-factor authentication
+**Email notifications**
+- Admin notified on new contact request and new membership request (with direct link to the membership record)
+- Member receives a confirmation email on registration and a validation email when approved
+- Member notified on account deactivation and subscription expiry
+- Queued notifications (`ShouldQueue`) — requires a running queue worker
+- Separate application name for member emails (`FRONT_NAME`) vs admin emails (`APP_NAME`)
+
**Integrations**
- Dolibarr ERP (member and subscription import via REST API)
- ISPConfig (mail and web hosting account management via SOAP)
@@ -65,7 +72,7 @@ The project is developed in the context of **Le Retzien Libre**, a non-profit as
### 1. Clone the repository
```bash
-git clone https://github.com/your-org/roxane.git
+git clone https://github.com/SabrinaNebulae/roxane.git
cd roxane
```
@@ -87,6 +94,8 @@ Edit `.env` and configure:
- Database connection (`DB_*`)
- Redis connection (`REDIS_*`)
- Mail configuration (`MAIL_*`)
+- Application names: `APP_NAME` (admin panel), `FRONT_NAME` (member-facing emails)
+- Admin email: `ADMIN_EMAIL` (recipient for all admin notifications)
- Third-party service credentials (Dolibarr, ISPConfig, Nextcloud)
### 4. Database setup
@@ -186,19 +195,20 @@ php artisan test --compact
## Known TODOs
-| Area | Description |
-|---------------------------|---------------------------------------------------------------------|
-| ContactService | Send email notification to administrator on new contact request |
-| MemberService | Send emails to member and admin on deactivation |
-| SubscriptionExpiredPhase1 | Generic template + backend UI for notification content management |
-| User.php | Restrict admin access in production to @retzien.fr emails |
-| SyncDolibarrMembers | Extract `toDate()` method into a shared service or helper |
-| SyncISPConfigMailMembers | Handle multiple email addresses per member |
-| SyncISPConfigMailMembers | Track `ispconfig_client_id` |
-| Global | Make Roxane fully generic for any association ERP use case |
-| Translations | Audit project for missing translation keys |
-| Global | Raise PHPStan to level 8 |
-| V2 | Keycloak SSO integration (OIDC) for front office authentication |
+| Area | Description |
+|-----------------------------|----------------------------------------------------------------------------------|
+| Notifications | Propagate `appName` view variable to all remaining notifications |
+| SubscriptionExpiredPhase1 | Backend UI for editing notification template content |
+| MembershipValidatedNotif. | Add HelloAsso payment link once integration is available |
+| User.php | Restrict admin access in production to @retzien.fr emails |
+| SyncDolibarrMembers | Extract `toDate()` method into a shared service or helper |
+| SyncISPConfigMailMembers | Handle multiple email addresses per member |
+| SyncISPConfigMailMembers | Track `ispconfig_client_id` |
+| Global | Make Roxane fully generic for any association ERP use case |
+| Translations | Audit project for missing translation keys |
+| Global | Raise PHPStan to level 8 |
+| dev-routes.php | Remove `/test/mail` debug route before production deployment |
+| V2 | Keycloak SSO integration (OIDC) for front office authentication |
---
diff --git a/app/Filament/Resources/Memberships/Schemas/MembershipForm.php b/app/Filament/Resources/Memberships/Schemas/MembershipForm.php
index cf9aa96..0c22cf6 100644
--- a/app/Filament/Resources/Memberships/Schemas/MembershipForm.php
+++ b/app/Filament/Resources/Memberships/Schemas/MembershipForm.php
@@ -57,7 +57,8 @@ class MembershipForm
TextEntry::make('member.full_name')
->label(Membership::getAttributeLabel('member_id')),
TextEntry::make('author.name')
- ->label(Membership::getAttributeLabel('admin_id')),
+ ->label(Membership::getAttributeLabel('admin_id'))
+ ->default(__('memberships.sections.author_not_set')),
TextEntry::make('created_at')
->label(Membership::getAttributeLabel('created_at')),
])
diff --git a/app/Http/Requests/Forms/MembershipRequest.php b/app/Http/Requests/Forms/MembershipRequest.php
index 2329833..f328d3f 100644
--- a/app/Http/Requests/Forms/MembershipRequest.php
+++ b/app/Http/Requests/Forms/MembershipRequest.php
@@ -12,6 +12,17 @@ class MembershipRequest extends FormRequest
return true;
}
+ /**
+ * @return array
'
.'Montant : {amount} €'
.'