Files
amare/openspec/changes/package-detail-pages/tasks.md

5.1 KiB

1. Data model and domain catalog

  • 1.1 Migration additive em wedding_packages: slug unique (backfill a partir de name), campos de detalhe (eyebrow, title_line, title_emphasis, hero_lead, hero_image_, benefits jsonb, included_items jsonb, audience_, final_cta_, meta_), atualizar model $fillable/casts e factory. Evidência: database/migrations/2026_08_12_120000_extend_wedding_packages_for_detail_pages.php (roda limpo), app/Models/WeddingPackage.php (fillable+casts+booted slug), database/factories/WeddingPackageFactory.php (slug + campos de detalhe).
  • 1.2 PackageIconCatalog (chaves fechadas + labels pt-BR) e validação de icon_key em benefits/included_items. Evidência: app/Domain/Marketing/PackageIconCatalog.php (6 chaves: calendar/checklist/users/map/heart/spark), Select icon_key em WeddingPackageForm usa PackageIconCatalog::labels().
  • 1.3 Feature/unit: factory published com slug; scope published inalterado; icon_key inválido rejeitado na validação admin/request path usado pelo Filament. Evidência: WeddingPackageTest (4 testes: scope published + seeder, factory slug autofill, icon catalog aceita/rejeita paw).

2. Application + public route

  • 2.1 Query FindPublishedWeddingPackageBySlug + teste 200/null para draft. Evidência: app/Application/Queries/Marketing/FindPublishedWeddingPackageBySlug.php; FindPublishedWeddingPackageBySlugTest (retorna published, null para draft/inexistente).
  • 2.2 PackageController@show, rota nomeada packages.show /pacotes/{slug}, PageMeta (meta_title/description fallback name/summary|hero_lead, OG hero). Evidência: app/Http/Controllers/PublicSite/PackageController.php, routes/web.php (packages.show), PageMeta::forPackage (title=meta_title??title_line??name, description=meta_description??summary, ogImageUrl=hero_image_path).
  • 2.3 Estender GetSitemapEntries com pacotes publicados; teste sitemap inclui/exclui draft. Evidência: GetSitemapEntries appends pacotes published; SitemapTest::test_sitemap_includes_only_published_packages (inclui essenza, exclui rascunho-pacote).

3. Blade detail (Heritage Editorial)

  • 3.1 View pages/packages/show + componentes package-hero, package-benefits, package-included, package-audience; layout layouts.public; tokens DESIGN.md (sem hex do mock). Evidência: resources/views/pages/packages/show.blade.php + resources/views/components/public/package-{hero,benefits,included,audience}.blade.php + resources/views/components/package/icon.blade.php (SVG de catálogo); classes amare-* e text-hero-spread (tokens), sem hex do mock.
  • 3.2 CTA final reutiliza builder WhatsApp/briefing dos cards; teste feature assert wa.me / briefing?servico_interesse. Evidência: app/Support/PackageContactLink::for() (helper compartilhado), package-final-cta.blade.php usa builder; PackageDetailTest (tests 4-5: wa.me com número, briefing fallback).
  • 3.3 Feature: render de seções a partir do CMS; 404 draft; guest sem auth. Evidência: PackageDetailTest (5 testes: render de seções CMS assertSee, 404 draft, 404 slug inexistente, CTA wa.me/briefing).
  • 4.1 WeddingPackageResource: seções Hero, Benefícios, Inclusos, Audiência, CTA final, SEO; FileUpload imagens; Select icon_key do catálogo. Evidência: app/Filament/Resources/WeddingPackages/Schemas/WeddingPackageForm.php (sections Identificação/Hero/Diferenciais/Inclusos/Audiência/CTA final/SEO; PublicImageUploadRules::fileUpload/altTextField; Select icon_key options PackageIconCatalog::labels()); WeddingPackagesTable ganhou coluna slug.
  • 4.2 Seeder/update Essenza (copy mock), Conduzione e Grand Jour (estrutura paralela) com slugs essenza, conduzione, grand-jour. Evidência: database/seeders/WeddingPackagesSeeder.php (3 pacotes com slug + campos de detalhe completos); WeddingPackageTest::test_content_seeder_creates_official_wedding_modalities verde.
  • 4.3 Home + /servicos cards: link secundário para packages.show; CTA primário WA intacto; testes de regressão de CTA. Evidência: home/packages.blade.php + home/wedding-packages.blade.php + services/index.blade.php (link 'Conhecer esta modalidade' + CTA primário refatorado via PackageContactLink); HomePageContentTest (22 testes: 143 assertions, incl. href packages.show).

5. Verification gate

  • 5.1 composer pint:check + composer phpstan no escopo alterado. Evidência: vendor/bin/pint --test passou (fix ordered_imports em routes/web.php); composer phpstan (level 5, --memory-limit=1G --debug) = No errors.
  • 5.2 composer test:unit + composer test:feature verdes (incl. novos testes de pacote). Evidência: test:unit 42 passed (186 assertions); test:feature 193 passed (1182 assertions); PackageDetailTest (5), FindPublishedWeddingPackageBySlugTest, SitemapTest (3) verdes.
  • 5.3 openspec validate package-detail-pages e marcar tasks só com evidência. Evidência: openspec validate package-detail-pages = "Change 'package-detail-pages' is valid"; tasks 1.1-5.3 marcadas acima com referências.