feat: alinhar modalidades à Apresentação e CTA WhatsApp de orientação #8

Open
manoel-freitas wants to merge 4 commits from feat/man-140-modalidade-copy-whatsapp-orientacao into main
8 changed files with 161 additions and 98 deletions

View File

@@ -37,7 +37,7 @@ No lançamento, o site público premium e o CMS interno formam a superfície ent
## Operating Context
- Atuação em São Paulo, capital.
- Serviços: casamentos, eventos corporativos e celebrações.
- Serviços: casamentos, eventos corporativos e celebrações. No site, casamento aparece como três **modalidades** (Essenza, Conduzione, Grand Jour); preço e limites comerciais ficam na proposta, não na página.
- Operação realizada por assessora principal e equipe pequena.
- Jornada de lançamento: descoberta no site, briefing por e-mail e contato comercial fora da plataforma.
- Jornada futura prevista: qualificação do lead, pipeline comercial, conversão em evento, checklist, fornecedores, orçamento, pagamentos manuais e documentos.

27
SPEC.md
View File

@@ -1288,6 +1288,12 @@ Conceito de posicionamento (cuidado, especialização, múltiplos serviços sob
| Finance | Orçamento e pagamentos manuais |
| Identity | Usuários, acesso e auditoria |
Vocabulário público vs persistência (Marketing):
- **Modalidade** é o nome público de cada oferta de acompanhamento de casamento. O visitante vê o nome próprio (Essenza, Conduzione, Grand Jour) e a tag de momento (Completa, Parcial, Final). Persistida em `wedding_packages`.
- **Vertente** é o contexto da marca (Casamentos vs Corporate). A tabela `services` descreve vertentes do catálogo, não as três modalidades.
- **Pacote**, no sentido de SKU com preço e limites operacionais, não é superfície pública. Preço, equipe no dia, teto de fornecedores, quilometragem e ferramentas de terceiros (incluindo gestão de convidados) ficam na proposta, não no registro público da modalidade.
### 8.2 Tabelas obrigatórias
#### `users`
@@ -1348,6 +1354,27 @@ Singleton:
- timestamps;
- soft delete opcional somente se recuperação for necessária.
#### `wedding_packages`
Modalidades públicas de casamento (não confundir com `services`):
- `id`;
- `name`;
- `slug` unique;
- `level` (rótulo de momento, ex. `01 / COMPLETA`);
- `tag` nullable (ex. Assessoria completa);
- `subtitle` nullable;
- `summary`;
- `scope_items` jsonb (bullets de conceito nos cards);
- `cta_label`;
- `compare_heading` nullable;
- `compare_summary` nullable;
- campos editoriais da página `/pacotes/{slug}` (eyebrow, título, hero, benefícios, incluso em alto nível, audiência, CTA final, meta) — todos opcionais salvo o que a publicação exigir;
- `sort_order` integer indexed;
- `published_at` timestamp nullable indexed;
- timestamps;
- **sem** colunas de preço, centavos, equipe, limites de fornecedores/convidados/km ou ferramentas de terceiros.
#### `portfolio_cases`
- `id`;

View File

@@ -8,7 +8,7 @@ use App\Models\SiteSetting;
final class PackageContactLink
{
private const ORIENTATION_MESSAGE = 'Olá, ainda não sei qual modalidade de acompanhamento combina com o meu casamento e gostaria de orientação da Amare.';
public const ORIENTATION_MESSAGE = 'Olá, ainda não sei qual modalidade de assessoria faz sentido para o meu casamento e gostaria de orientação.';
/**
* Resolve the contextual contact link for a wedding package modality.
@@ -25,7 +25,7 @@ final class PackageContactLink
}
/**
* Resolve the orientation CTA for visitors who have not chosen a modality yet.
* WhatsApp (or briefing fallback) when the visitor does not know which modality to choose.
*
* @return array{href: string, isWhatsapp: bool}
*/

View File

@@ -9,11 +9,10 @@ use Illuminate\Database\Seeder;
use Illuminate\Support\Carbon;
/**
* Wedding package modalities shown on the home page (03 Amare Casamentos)
* and the services page. Copy is approved from the structural model preview
* (preview(2).html) and remains editable via the Filament resource. Detail
* copy follows the complete-assessoria preview
* (amare-assessoria-completa.html) adapted to each modality.
* Wedding package modalities shown on the home page, services page and
* `/pacotes/{slug}`. Public copy follows "Apresentação dos serviços Amare"
* (conceito e momento). Commercial limits, price and third-party tools stay
* off this seeder and off the public site.
*/
class WeddingPackagesSeeder extends Seeder
{
@@ -27,141 +26,147 @@ class WeddingPackagesSeeder extends Seeder
'slug' => 'essenza',
'level' => '01 / COMPLETA',
'tag' => 'Assessoria completa',
'subtitle' => 'Do planejamento ao grande dia.',
'summary' => 'Para casais que desejam contar com a Amare desde o início ou ainda estão estruturando etapas importantes.',
'subtitle' => 'Do primeiro planejamento ao grande dia.',
'summary' => 'Ideal para casais que desejam contar com a Amare desde o início da organização ou que ainda estão estruturando etapas importantes do casamento.',
'scope_items' => [
'Estruturação do planejamento',
'Cronogramas, prazos e prioridades',
'Orientação e gestão de fornecedores',
'Alinhamento entre os envolvidos',
'Coordenação da execução',
'Estruturação e acompanhamento do planejamento',
'Organização de cronogramas, prazos e prioridades',
'Orientação na contratação e gestão de fornecedores',
'Acompanhamento das etapas do projeto',
'Organização e conferência de contratos e informações',
'Alinhamento entre casal, fornecedores e demais envolvidos',
'Construção do cronograma do grande dia',
'Coordenação e acompanhamento da execução do evento',
],
'cta_label' => 'Quero conhecer a Essenza',
'compare_heading' => 'Começar com a Amare',
'compare_summary' => 'Acompanhamento mais amplo ao longo do planejamento.',
'compare_summary' => 'Acompanhamento do primeiro planejamento ao grande dia.',
'sort_order' => 1,
'eyebrow' => 'Assessoria',
'title_line' => 'Assessoria',
'title_emphasis' => 'Completa',
'hero_lead' => 'Do planejamento ao grande dia, com calma, precisão e cuidado.',
'hero_lead' => 'A assessoria completa acompanha o projeto de forma estratégica e próxima, desde a construção do planejamento até a execução do evento.',
'benefits' => [
['icon_key' => 'calendar', 'label' => 'Organização integral'],
['icon_key' => 'checklist', 'label' => 'Planejamento personalizado'],
['icon_key' => 'users', 'label' => 'Fornecedores selecionados'],
['icon_key' => 'heart', 'label' => 'Experiência leve e inesquecível'],
['icon_key' => 'calendar', 'label' => 'Planejamento organizado'],
['icon_key' => 'checklist', 'label' => 'Decisões mais seguras'],
['icon_key' => 'users', 'label' => 'Fornecedores alinhados'],
['icon_key' => 'heart', 'label' => 'Grande dia com leveza'],
],
'included_items' => [
['icon_key' => 'heart', 'title' => 'Escuta e briefing', 'description' => 'Cada casal é único; começamos por ouvir.'],
['icon_key' => 'checklist', 'title' => 'Planejamento completo', 'description' => 'Cada etapa mapeada com clareza.'],
['icon_key' => 'map', 'title' => 'Gestão de fornecedores', 'description' => 'Contatos e prazos sob cuidado.'],
['icon_key' => 'calendar', 'title' => 'Acompanhamento contínuo', 'description' => 'Perto do casal em cada decisão.'],
['icon_key' => 'spark', 'title' => 'Produção e logística', 'description' => 'Dia a dia do evento organizado nos detalhes.'],
['icon_key' => 'users', 'title' => 'Dia do evento', 'description' => 'Coordenação total para o casal viver o momento.'],
['icon_key' => 'checklist', 'title' => 'Estruturação do planejamento', 'description' => 'Organização do projeto desde o início, no ritmo do casal.'],
['icon_key' => 'calendar', 'title' => 'Cronogramas e prioridades', 'description' => 'Prazos e etapas visíveis para decidir com calma.'],
['icon_key' => 'map', 'title' => 'Contratação e gestão de fornecedores', 'description' => 'Orientação e acompanhamento de quem entra no projeto.'],
['icon_key' => 'users', 'title' => 'Alinhamento entre envolvidos', 'description' => 'Casal, fornecedores e demais partes na mesma conversa.'],
['icon_key' => 'spark', 'title' => 'Contratos e informações', 'description' => 'Conferência do que foi combinado antes do grande dia.'],
['icon_key' => 'heart', 'title' => 'Coordenação da execução', 'description' => 'Acompanhamento do evento para o casal viver o momento.'],
],
'audience_heading' => 'Para quem é este pacote',
'audience_intro' => 'Para quem quer uma assessoria completa, do início ao fim.',
'audience_heading' => 'Para quem é esta modalidade',
'audience_intro' => 'Para quem deseja ter ao lado uma profissional conduzindo o processo como um todo, com organização, estratégia e tranquilidade.',
'audience_points' => [
'Casamentos',
'Aniversários',
'Eventos sociais e celebrações',
'Eventos corporativos',
'Casais no início da organização',
'Quem ainda está estruturando etapas importantes',
'Quem quer acompanhamento do planejamento à execução',
],
'final_cta_heading' => 'Pronta para começar?',
'final_cta_body' => 'Conte seu evento para a Amare e receba uma proposta.',
'final_cta_heading' => 'Vamos nos conhecer?',
'final_cta_body' => 'Antes de definir qualquer caminho, queremos conhecer vocês. Basta entrar em contato para uma conversa.',
],
[
'name' => 'Conduzione',
'slug' => 'conduzione',
'level' => '02 / PARCIAL',
'tag' => 'Assessoria parcial',
'subtitle' => 'Para quem já começou e quer seguir acompanhado.',
'summary' => 'Para casais que já tomaram decisões e contrataram parte dos fornecedores, mas precisam estruturar o que falta.',
'subtitle' => 'Para quem já começou, mas quer seguir acompanhado.',
'summary' => 'Indicada para casais que já iniciaram o planejamento e possuem parte dos fornecedores ou decisões definidas, mas desejam organizar o que falta e conduzir as próximas etapas.',
'scope_items' => [
'Diagnóstico do planejamento existente',
'Organização das pendências',
'Gestão dos fornecedores contratados',
'Orientação para próximas decisões',
'Coordenação da execução',
'Diagnóstico do planejamento já realizado',
'Organização das etapas pendentes',
'Gestão e acompanhamento dos fornecedores contratados',
'Orientação sobre as próximas decisões',
'Acompanhamento de prazos e informações',
'Comunicação e alinhamento com fornecedores',
'Organização do cronograma do evento',
'Coordenação da execução no grande dia',
],
'cta_label' => 'Quero conhecer a Conduzione',
'compare_heading' => 'Trazer a Amare para o caminho',
'compare_summary' => 'O planejamento existe, mas ainda há decisões e gestão pela frente.',
'compare_summary' => 'O planejamento existe; a Amare organiza o que falta e conduz as próximas etapas.',
'sort_order' => 2,
'eyebrow' => 'Assessoria',
'title_line' => 'Assessoria',
'title_emphasis' => 'Parcial',
'hero_lead' => 'Para retomar o planejamento, organizar o que falta e seguir com acompanhamento profissional.',
'hero_lead' => 'A Amare entra no momento em que vocês estão, compreende o que já foi construído e assume a gestão das etapas necessárias dentro do planejamento.',
'benefits' => [
['icon_key' => 'checklist', 'label' => 'Diagnóstico completo'],
['icon_key' => 'calendar', 'label' => 'Organização integral'],
['icon_key' => 'users', 'label' => 'Fornecedores selecionados'],
['icon_key' => 'heart', 'label' => 'Experiência leve e inesquecível'],
['icon_key' => 'checklist', 'label' => 'Diagnóstico do que já existe'],
['icon_key' => 'calendar', 'label' => 'Pendências organizadas'],
['icon_key' => 'users', 'label' => 'Fornecedores acompanhados'],
['icon_key' => 'heart', 'label' => 'Próximas decisões com clareza'],
],
'included_items' => [
['icon_key' => 'checklist', 'title' => 'Diagnóstico do planejamento', 'description' => 'Um olhar profissional sobre o que já existe.'],
['icon_key' => 'calendar', 'title' => 'Organização das pendências', 'description' => 'Prioridades claras, etapa a etapa.'],
['icon_key' => 'map', 'title' => 'Gestão de fornecedores', 'description' => 'Contatos e prazos sob cuidado.'],
['icon_key' => 'spark', 'title' => 'Gestão dos próximos passos', 'description' => 'Um plano para chegar tranquilo ao grande dia.'],
['icon_key' => 'users', 'title' => 'Acompanhamento contínuo', 'description' => 'Perto do casal em cada decisão.'],
['icon_key' => 'heart', 'title' => 'Dia do evento', 'description' => 'Coordenação total para o casal viver o momento.'],
['icon_key' => 'checklist', 'title' => 'Diagnóstico do planejamento', 'description' => 'Um olhar profissional sobre o que o casal já construiu.'],
['icon_key' => 'calendar', 'title' => 'Etapas pendentes', 'description' => 'O que falta ganha ordem, prazo e prioridade.'],
['icon_key' => 'map', 'title' => 'Fornecedores já contratados', 'description' => 'Gestão e comunicação com quem já está no projeto.'],
['icon_key' => 'spark', 'title' => 'Próximas decisões', 'description' => 'Orientação para seguir sem retrabalho.'],
['icon_key' => 'users', 'title' => 'Cronograma do evento', 'description' => 'A operação do grande dia começa a ficar visível.'],
['icon_key' => 'heart', 'title' => 'Coordenação no grande dia', 'description' => 'Execução acompanhada para o casal viver o momento.'],
],
'audience_heading' => 'Para quem é este pacote',
'audience_intro' => 'Para quem já começou a planejar e quer retomar as rédeas com acompanhamento profissional.',
'audience_heading' => 'Para quem é esta modalidade',
'audience_intro' => 'Para quem já deu os primeiros passos, mas deseja seguir com mais segurança, organização e tranquilidade.',
'audience_points' => [
'Casamentos em andamento',
'Casais com pouco tempo disponível',
'Quem precisa priorizar pendências',
'Quem busca fornecedores confiáveis',
'Casais que já iniciaram o planejamento',
'Quem já tem parte dos fornecedores ou decisões definidas',
'Quem quer condução profissional nas etapas que faltam',
],
'final_cta_heading' => 'Pronta para retomar?',
'final_cta_body' => 'Conte onde seu planejamento está e receba uma proposta.',
'final_cta_heading' => 'Vamos organizar o que falta?',
'final_cta_body' => 'Conte onde o planejamento está. A Amare entra nesse momento e conduz as próximas etapas.',
],
[
'name' => 'Grand Jour',
'slug' => 'grand-jour',
'level' => '03 / FINAL',
'tag' => 'Assessoria final',
'subtitle' => 'O planejamento está pronto. Agora é hora de viver.',
'summary' => 'Para casais na reta final que precisam de uma equipe para assumir alinhamentos, cronograma e operação.',
'subtitle' => 'Para quem já planejou e precisa de alguém para assumir a operação.',
'summary' => 'Indicada para casais que estão na reta final dos preparativos e já possuem a maior parte do casamento definida.',
'scope_items' => [
'Imersão no planejamento existente',
'Conferência das informações',
'Alinhamento dos fornecedores',
'Conferência das informações e contratos dos fornecedores',
'Alinhamento e comunicação com os profissionais envolvidos',
'Organização do cronograma final',
'Gestão da operação do evento',
'Orientação sobre os últimos detalhes',
'Coordenação dos fornecedores no evento',
'Acompanhamento da montagem e dos momentos do casamento',
'Gestão da operação durante o grande dia',
],
'cta_label' => 'Quero conhecer a Grand Jour',
'compare_heading' => 'Entregar a operação para a Amare',
'compare_summary' => 'O projeto está pronto e o foco passa a ser alinhamento e execução.',
'compare_summary' => 'O projeto está pronto; o foco passa a ser alinhamento e execução.',
'sort_order' => 3,
'eyebrow' => 'Assessoria',
'title_line' => 'Assessoria',
'title_emphasis' => 'Final',
'hero_lead' => 'Para assumir os alinhamentos e a operação quando o grande dia está próximo.',
'hero_lead' => 'A Amare assume a condução operacional, mergulha no planejamento construído pelo casal e transforma as informações em uma execução organizada e alinhada.',
'benefits' => [
['icon_key' => 'checklist', 'label' => 'Imersão no que já existe'],
['icon_key' => 'users', 'label' => 'Alinhamento de fornecedores'],
['icon_key' => 'checklist', 'label' => 'Imersão no planejamento'],
['icon_key' => 'users', 'label' => 'Fornecedores alinhados'],
['icon_key' => 'calendar', 'label' => 'Cronograma final'],
['icon_key' => 'heart', 'label' => 'Operação com leveza'],
['icon_key' => 'heart', 'label' => 'Operação no grande dia'],
],
'included_items' => [
['icon_key' => 'checklist', 'title' => 'Imersão no planejamento', 'description' => 'Entendemos cada decisão já tomada.'],
['icon_key' => 'map', 'title' => 'Alinhamento de fornecedores', 'description' => 'Contatos e prazos sob cuidado.'],
['icon_key' => 'calendar', 'title' => 'Cronograma final', 'description' => 'Cada etapa posicionada na reta final.'],
['icon_key' => 'spark', 'title' => 'Ensaios e detalhes', 'description' => 'Produção e logística nos detalhes.'],
['icon_key' => 'users', 'title' => 'Operação do evento', 'description' => 'Gestão da equipe e do dia a dia.'],
['icon_key' => 'heart', 'title' => 'Dia do evento', 'description' => 'Coordenação total para o casal viver o momento.'],
['icon_key' => 'checklist', 'title' => 'Imersão no planejamento', 'description' => 'A Amare mergulha no que o casal já decidiu.'],
['icon_key' => 'map', 'title' => 'Contratos e informações', 'description' => 'Conferência do combinado com cada profissional.'],
['icon_key' => 'users', 'title' => 'Alinhamento dos envolvidos', 'description' => 'Comunicação centralizada na reta final.'],
['icon_key' => 'calendar', 'title' => 'Cronograma final', 'description' => 'A operação do grande dia ganha ordem.'],
['icon_key' => 'spark', 'title' => 'Últimos detalhes', 'description' => 'Orientação para fechar o que ainda falta.'],
['icon_key' => 'heart', 'title' => 'Gestão da operação', 'description' => 'Montagem, momentos e condução no dia do casamento.'],
],
'audience_heading' => 'Para quem é este pacote',
'audience_intro' => 'Para casais já planejados que querem chegar ao grande dia com equipe e operação no lugar.',
'audience_heading' => 'Para quem é esta modalidade',
'audience_intro' => 'Porque, na reta final, vocês não precisam de mais tarefas. Precisam de alguém que assuma a condução.',
'audience_points' => [
'Casamentos já planejados',
'Casais na reta final',
'Quem precisa de operação no dia',
'Quem quer viver o momento com leveza',
'Casais na reta final dos preparativos',
'Quem já definiu a maior parte do casamento',
'Quem quer entregar a operação do grande dia',
],
'final_cta_heading' => 'Pronta para o grande dia?',
'final_cta_body' => 'Conte a data do seu evento e receba uma proposta.',
'final_cta_heading' => 'Vamos assumir a operação?',
'final_cta_body' => 'Conte a data e o que já está definido. A Amare entra para conduzir o grande dia.',
],
];

View File

@@ -14,11 +14,6 @@
'note' => 'Nomenclaturas exibidas conforme materiais/reunião; confirmar versão final antes da publicação.',
])
@php
$orientationLink = \App\Support\PackageContactLink::forOrientation($settings);
$bandHref = $bandCtaHref ?? $orientationLink['href'];
$bandIsWhatsapp = $bandCtaHref === null && $orientationLink['isWhatsapp'];
@endphp
<section
aria-labelledby="packages-heading"
class="home-chapter border-b border-amare-border bg-amare-bg"
@@ -74,12 +69,16 @@
</div>
@endif
@php($orientationLink = \App\Support\PackageContactLink::forOrientation($settings))
@php($bandHref = filled($bandCtaHref) ? $bandCtaHref : $orientationLink['href'])
@php($bandIsWhatsapp = ! filled($bandCtaHref) && $orientationLink['isWhatsapp'])
<div class="mt-6 flex flex-col justify-between gap-8 bg-amare-accent-deep p-8 text-amare-accent-text md:flex-row md:items-center md:p-12" data-reveal data-reveal-from="up">
<div class="max-w-xl space-y-3">
<h3 class="text-[clamp(1.5625rem,2.7vw,2.125rem)] font-medium leading-tight">Ainda não sabe qual modalidade é ideal?</h3>
<p class="text-amare-accent-text/80">{{ $bandBody }}</p>
</div>
<a
data-testid="package-guidance-cta"
href="{{ $bandHref }}"
@if ($bandIsWhatsapp) target="_blank" rel="noopener noreferrer" @endif
class="inline-flex min-h-[48px] items-center justify-center self-start border border-amare-accent-text px-6 text-xs font-bold uppercase tracking-[0.09em] text-amare-accent-text transition-colors hover:bg-amare-accent-text hover:text-amare-accent-deep md:self-auto"

View File

@@ -38,6 +38,33 @@ class WeddingPackageTest extends TestCase
['Essenza', 'Conduzione', 'Grand Jour'],
WeddingPackage::query()->published()->orderBy('sort_order')->pluck('name')->all(),
);
$essenza = WeddingPackage::query()->where('name', 'Essenza')->first();
$this->assertNotNull($essenza);
$this->assertSame('Assessoria completa', $essenza->tag);
$this->assertSame('Do primeiro planejamento ao grande dia.', $essenza->subtitle);
$this->assertStringContainsString('desde o início da organização', (string) $essenza->summary);
$this->assertContains('Estruturação e acompanhamento do planejamento', $essenza->scope_items);
$this->assertSame(
['Casais no início da organização', 'Quem ainda está estruturando etapas importantes', 'Quem quer acompanhamento do planejamento à execução'],
$essenza->audience_points,
);
$publicCopy = WeddingPackage::query()->published()->get()->map(fn (WeddingPackage $package): string => json_encode([
$package->summary,
$package->subtitle,
$package->hero_lead,
$package->scope_items,
$package->included_items,
$package->audience_intro,
$package->final_cta_body,
], JSON_THROW_ON_ERROR))->implode(' ');
$this->assertStringNotContainsString('R$', $publicCopy);
$this->assertStringNotContainsString('3.500', $publicCopy);
$this->assertStringNotContainsString('Assessoria VIP', $publicCopy);
$this->assertStringNotContainsString('90 km', $publicCopy);
$this->assertStringNotContainsString('3,49%', $publicCopy);
}
public function test_factory_generates_a_slug_and_autofills_blank_slug_from_name(): void

View File

@@ -8,6 +8,7 @@ use App\Models\PortfolioCase;
use App\Models\SiteSetting;
use App\Models\Testimonial;
use App\Models\WeddingPackage;
use App\Support\PackageContactLink;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
@@ -214,8 +215,9 @@ class HomePageContentTest extends TestCase
)
->assertSee('target="_blank"', false)
->assertDontSee(route('briefing', ['servico_interesse' => 'Grand Jour']), false)
->assertSee('data-testid="package-guidance-cta"', false)
->assertSee(
'https://wa.me/5511988887777?text='.rawurlencode('Olá, ainda não sei qual modalidade de acompanhamento combina com o meu casamento e gostaria de orientação da Amare.'),
'https://wa.me/5511988887777?text='.rawurlencode(PackageContactLink::ORIENTATION_MESSAGE),
false,
);
}
@@ -229,10 +231,7 @@ class HomePageContentTest extends TestCase
$response
->assertOk()
->assertSee('href="'.route('briefing').'"', false)
->assertDontSee(
'Olá, ainda não sei qual modalidade de acompanhamento combina com o meu casamento e gostaria de orientação da Amare.',
false,
);
->assertDontSee(PackageContactLink::ORIENTATION_MESSAGE, false);
}
public function test_corporate_steps_and_placeholder_render_from_settings(): void

View File

@@ -6,6 +6,7 @@ namespace Tests\Feature\PublicSite;
use App\Models\SiteSetting;
use App\Models\WeddingPackage;
use App\Support\PackageContactLink;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
@@ -31,7 +32,12 @@ class ServicesPageCtaTest extends TestCase
false,
)
->assertSee('target="_blank"', false)
->assertDontSee(route('briefing', ['servico_interesse' => 'Grand Jour']), false);
->assertDontSee(route('briefing', ['servico_interesse' => 'Grand Jour']), false)
->assertSee('data-testid="package-guidance-cta"', false)
->assertSee(
'https://wa.me/5511988887777?text='.rawurlencode(PackageContactLink::ORIENTATION_MESSAGE),
false,
);
}
public function test_package_cta_falls_back_to_briefing_without_whatsapp_number(): void
@@ -60,7 +66,7 @@ class ServicesPageCtaTest extends TestCase
$response
->assertOk()
->assertSee(
'https://wa.me/5511988887777?text='.rawurlencode('Olá, ainda não sei qual modalidade de acompanhamento combina com o meu casamento e gostaria de orientação da Amare.'),
'https://wa.me/5511988887777?text='.rawurlencode(PackageContactLink::ORIENTATION_MESSAGE),
false,
);
}