feat(Reminder process): add 4 reminder phases for membership (Retzien)
All checks were successful
Deploy Roxane to Preprod / deploy (push) Successful in 1m21s
All checks were successful
Deploy Roxane to Preprod / deploy (push) Successful in 1m21s
This commit is contained in:
@@ -29,7 +29,7 @@ return new class extends Migration
|
||||
'valid',
|
||||
'pending',
|
||||
'cancelled',
|
||||
'excluded'
|
||||
'excluded',
|
||||
])->default('draft');
|
||||
|
||||
// Nature
|
||||
|
||||
@@ -15,7 +15,7 @@ return new class extends Migration
|
||||
$table->id();
|
||||
$table->foreignId('service_id')->constrained('services')->onDelete('cascade');
|
||||
$table->foreignId('membership_id')->constrained('memberships')->onDelete('cascade');
|
||||
//$table->json('data')->nullable();
|
||||
// $table->json('data')->nullable();
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('member_renewal_reminders', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->foreignId('member_id')->constrained('members')->onDelete('cascade');
|
||||
$table->year('renewal_year');
|
||||
|
||||
$table->boolean('reminder_1_sent')->default(false);
|
||||
$table->boolean('reminder_2_sent')->default(false);
|
||||
$table->boolean('reminder_3_sent')->default(false);
|
||||
$table->boolean('deactivation_sent')->default(false);
|
||||
|
||||
$table->timestamp('reminder_1_sent_at')->nullable();
|
||||
$table->timestamp('reminder_2_sent_at')->nullable();
|
||||
$table->timestamp('reminder_3_sent_at')->nullable();
|
||||
$table->timestamp('deactivated_at')->nullable();
|
||||
|
||||
$table->timestamps();
|
||||
|
||||
$table->unique(['member_id', 'renewal_year']);
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('member_renewal_reminders');
|
||||
}
|
||||
};
|
||||
@@ -37,4 +37,4 @@ class MemberTypeSeeder extends Seeder
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,13 +172,67 @@ class NotificationTemplateSeeder extends Seeder
|
||||
NotificationTemplate::updateOrCreate(
|
||||
['identifier' => 'member_renewal_reminder'],
|
||||
[
|
||||
'name' => 'Relance adhésion — générique',
|
||||
'subject' => 'Rappel concernant votre adhésion — {app_name}',
|
||||
'name' => 'Relance renouvellement — 1ère relance (début décembre)',
|
||||
'subject' => 'Renouvellement de votre adhésion pour l\'année à venir — {app_name}',
|
||||
'body' => '<p>Bonjour {member_name},</p>'
|
||||
.'<p>Nous vous contactons au sujet de votre adhésion au sein de notre association.</p>'
|
||||
.'<p>Si votre adhésion est arrivée à expiration ou si vous n\'avez pas encore finalisé votre inscription, '
|
||||
.'nous vous invitons à régulariser votre situation afin de continuer à bénéficier de l\'ensemble de nos services.</p>'
|
||||
.'<p>Pour toute question ou besoin d\'assistance, n\'hésitez pas à nous contacter.</p>'
|
||||
.'<p>L\'année touche à sa fin et nous vous invitons à renouveler votre adhésion pour l\'année prochaine.</p>'
|
||||
.'<p>Cela vous permettra de continuer à bénéficier de l\'ensemble de nos services sans interruption.</p>'
|
||||
.'<p>Nous restons à votre disposition pour toute question.</p>'
|
||||
.'<p>Cordialement,<br>L\'équipe {app_name}</p>',
|
||||
'variables' => [
|
||||
'member_name' => 'Nom complet du membre',
|
||||
'app_name' => 'Nom de l\'application',
|
||||
],
|
||||
'is_active' => true,
|
||||
]
|
||||
);
|
||||
|
||||
NotificationTemplate::updateOrCreate(
|
||||
['identifier' => 'member_renewal_reminder_2'],
|
||||
[
|
||||
'name' => 'Relance renouvellement — 2ème relance (mi-décembre)',
|
||||
'subject' => 'Pensez à renouveler votre adhésion — {app_name}',
|
||||
'body' => '<p>Bonjour {member_name},</p>'
|
||||
.'<p>Nous vous avons récemment contacté concernant le renouvellement de votre adhésion pour l\'année prochaine.</p>'
|
||||
.'<p>Si vous n\'avez pas encore renouvelé, nous vous encourageons à le faire rapidement pour garantir la continuité de vos services.</p>'
|
||||
.'<p>N\'hésitez pas à nous contacter si vous avez des questions.</p>'
|
||||
.'<p>Cordialement,<br>L\'équipe {app_name}</p>',
|
||||
'variables' => [
|
||||
'member_name' => 'Nom complet du membre',
|
||||
'app_name' => 'Nom de l\'application',
|
||||
],
|
||||
'is_active' => true,
|
||||
]
|
||||
);
|
||||
|
||||
NotificationTemplate::updateOrCreate(
|
||||
['identifier' => 'member_renewal_reminder_3'],
|
||||
[
|
||||
'name' => 'Relance renouvellement — 3ème relance (début janvier)',
|
||||
'subject' => 'Dernière relance : renouvellement de votre adhésion — {app_name}',
|
||||
'body' => '<p>Bonjour {member_name},</p>'
|
||||
.'<p>Nous vous contactons une dernière fois concernant le renouvellement de votre adhésion.</p>'
|
||||
.'<p><strong>Sans action de votre part d\'ici la fin janvier, votre compte et vos services seront automatiquement désactivés.</strong></p>'
|
||||
.'<p>Pour éviter toute interruption, nous vous invitons à renouveler dès maintenant.</p>'
|
||||
.'<p>Pour toute question, n\'hésitez pas à nous contacter.</p>'
|
||||
.'<p>Cordialement,<br>L\'équipe {app_name}</p>',
|
||||
'variables' => [
|
||||
'member_name' => 'Nom complet du membre',
|
||||
'app_name' => 'Nom de l\'application',
|
||||
],
|
||||
'is_active' => true,
|
||||
]
|
||||
);
|
||||
|
||||
NotificationTemplate::updateOrCreate(
|
||||
['identifier' => 'member_account_deactivated'],
|
||||
[
|
||||
'name' => 'Compte désactivé pour non-renouvellement',
|
||||
'subject' => 'Votre compte {app_name} a été désactivé',
|
||||
'body' => '<p>Bonjour {member_name},</p>'
|
||||
.'<p>Faute de renouvellement de votre adhésion, votre compte et vos services ont été désactivés.</p>'
|
||||
.'<p>Si vous souhaitez réactiver votre compte, n\'hésitez pas à nous contacter.</p>'
|
||||
.'<p>Nous vous remercions pour la confiance que vous nous avez accordée.</p>'
|
||||
.'<p>Cordialement,<br>L\'équipe {app_name}</p>',
|
||||
'variables' => [
|
||||
'member_name' => 'Nom complet du membre',
|
||||
|
||||
@@ -42,4 +42,4 @@ class PackageSeeder extends Seeder
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user