feat(portal): lead module, WHMCS sync report/contacts/mapping, service lifecycle email templates

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
baodev0
2026-10-21 16:55:19 +07:00
co-authored by Claude Sonnet 5.5
parent 3c7710f1de
commit a443ec3bf6
66 changed files with 2032 additions and 124 deletions
+17
View File
@@ -8,6 +8,7 @@ use App\Services\Email\EmailTemplateService;
use App\Support\EmailScenarioRegistry;
use App\Support\MailPlaceholders;
use Database\Seeders\EmailTemplates\TemplateVariables;
use Database\Seeders\EmailTemplates\ServiceLifecycleTemplates;
use Database\Seeders\TemplateSeeder;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Tests\TestCase;
@@ -39,6 +40,22 @@ class TemplateSeederTest extends TestCase
}
}
public function test_service_lifecycle_templates_are_seeded_once_as_marketing(): void
{
$items = ServiceLifecycleTemplates::all();
$this->assertCount(27, $items);
$this->seed(TemplateSeeder::class);
$this->seed(TemplateSeeder::class);
foreach ($items as $item) {
$this->assertSame(1, Template::where('name', $item['name'])->count(), $item['name']);
$template = Template::where('name', $item['name'])->first();
$this->assertTrue($template->isMarketing(), $item['name']);
$this->assertStringContainsString('class="Footer"', $template->message, $item['name']);
}
}
public function test_every_placeholder_has_a_variable_definition(): void
{
foreach ([...TemplateSeeder::templates(), ...TemplateSeeder::legacyTemplates()] as $item) {