feat: reestruturar jornada pública de casamentos

This commit is contained in:
2026-08-11 15:42:43 -03:00
parent 70cc65227a
commit 68632c32df
61 changed files with 1006 additions and 78 deletions

View File

@@ -0,0 +1,8 @@
## ADDED Requirements
### Requirement: Production never promotes visual fixture cases as Amare proof
The content seeder SHALL restrict visual fixture portfolio cases to non-production environments. Production public output SHALL only render cases that were explicitly loaded and published as authorized content.
#### Scenario: Production seed does not create fixture cases
- **WHEN** the content seeder runs with the production environment
- **THEN** no fixture portfolio case or fixture portfolio image is published

View File

@@ -0,0 +1,16 @@
## ADDED Requirements
### Requirement: Partners have a separate, non-persistent contact journey
The system SHALL expose `/contato` as a supplier and partnership form. It MUST collect name, optional professional/company name, e-mail, service/activity, coverage area, message, optional portfolio/social link and optional telephone. It SHALL send a dedicated internal e-mail and MUST NOT persist a Lead or partner record.
#### Scenario: Valid partner inquiry is delivered separately
- **WHEN** a visitor submits valid partner data on `/contato`
- **THEN** the configured internal recipient receives the dedicated partner inquiry e-mail
- **AND** no briefing confirmation or Lead is created
### Requirement: Partner inquiry is protected and transparent
The partner form SHALL enforce CSRF, server-side limits, honeypot, rate limiting and duplicate-click protection. It MUST show a purpose-specific privacy notice linking to the privacy policy.
#### Scenario: Honeypot blocks automated partner form submissions
- **WHEN** the partner honeypot is filled
- **THEN** the system reports generic success without sending an e-mail

View File

@@ -0,0 +1,38 @@
## ADDED Requirements
### Requirement: Home presents the weddings and corporate editorial journey
The home SHALL expose anchored chapters for presentation, Amare, service directions, weddings, Corporate, portfolio/acervo, testimonials and final contact paths. It MUST retain the photographic hero, tonal fields, fine rules, EB Garamond and progressive/reduced-motion behavior. Corporate SHALL present only institutional copy and a briefing CTA until authorized copy and proof exist.
#### Scenario: Canonical anchor journey is reachable
- **WHEN** a visitor loads the home or follows a `/#chapter` link from another public page
- **THEN** the relevant chapter exists with a stable id and is reachable without JavaScript
#### Scenario: Corporate does not imply unauthorized proof
- **WHEN** a visitor loads the Corporate chapter before client proof is published
- **THEN** no Corporate service list, image, metric or case is rendered
### Requirement: Production portfolio remains truthful when no cases are published
The public portfolio chapter SHALL render a visible acervo-em-preparação note when no real published cases are available. Production seeders MUST NOT publish development fixture cases.
#### Scenario: Empty production acervo is explicit
- **GIVEN** production has no published portfolio cases
- **WHEN** a visitor loads the home
- **THEN** the portfolio chapter displays the acervo preparation note and no case card
## MODIFIED Requirements
### Requirement: Contact page presents contact data as briefing placeholder
The `contact` route SHALL render the partner and supplier inquiry page using `site_settings` contact data. The detailed event proposal form SHALL be served by the `briefing` route at `/briefing`; public proposal CTAs MUST target that route. Neither public form MUST create a Lead in the launch scope.
#### Scenario: Contact page shows partner journey
- **WHEN** a visitor loads `/contato`
- **THEN** partner-specific copy, fields and privacy notice MUST be displayed
- **AND** the detailed event briefing MUST NOT be rendered
#### Scenario: Briefing route remains reachable for prospects
- **WHEN** a visitor loads `/briefing`
- **THEN** the detailed event proposal form MUST be displayed
- **AND** no Lead record MUST be created

View File

@@ -0,0 +1,9 @@
## ADDED Requirements
### Requirement: Services explain published wedding modalities
The public services experience SHALL present published wedding modalities as the available Casamentos scope, including level, summary and ordered scope items. It MUST not treat unpublished modalities as public services.
#### Scenario: Draft modality remains private
- **GIVEN** a wedding modality with `published_at` null
- **WHEN** a visitor loads `/servicos`
- **THEN** that modality MUST NOT be rendered

View File

@@ -0,0 +1,8 @@
## ADDED Requirements
### Requirement: Official WhatsApp number is a typed site setting
The typed site settings singleton SHALL include an optional `whatsapp_number`. The admin form MUST validate and label it as the official number used by public modality CTAs; it MUST NOT create an external WhatsApp integration.
#### Scenario: Admin stores official WhatsApp number
- **WHEN** an admin saves a valid number in site settings
- **THEN** public wedding modality CTAs can derive the contextual deeplink

View File

@@ -0,0 +1,9 @@
## ADDED Requirements
### Requirement: Partner inquiries use a dedicated transactional message
The system SHALL send supplier and partnership submissions in a dedicated `PartnerInquiry` mailable to the configured internal site recipient. It MUST NOT send the visitor briefing confirmation for this form.
#### Scenario: Partner email does not cross into briefing mail
- **WHEN** a valid partner inquiry is submitted
- **THEN** the recipient receives the partner field set
- **AND** the visitor does not receive `ContactBriefingConfirmation`

View File

@@ -0,0 +1,26 @@
## ADDED Requirements
### Requirement: Wedding modalities are managed as publishable ordered content
The system SHALL let an admin manage `WeddingPackage` records with name, level, summary, ordered scope items, CTA label, sort order and `published_at`. Only published records SHALL appear in public wedding sections, in ascending `sort_order`.
#### Scenario: Published modalities follow CMS order
- **GIVEN** published and draft wedding modalities with different sort orders
- **WHEN** a visitor loads the home or services page
- **THEN** only published modalities appear in ascending `sort_order`
#### Scenario: Official initial modalities are available
- **WHEN** the content seeder runs
- **THEN** Essenza, Conduzione and Grand Jour are created as the official initial modalities
### Requirement: Wedding modality CTA has a contextual channel and conversion fallback
The system SHALL build a WhatsApp deeplink containing the selected modality when `whatsapp_number` is valid. When it is missing or invalid, the CTA SHALL point to `/briefing` with the modality prefilled as `servico_interesse`.
#### Scenario: Valid WhatsApp setting creates contextual link
- **GIVEN** a valid official WhatsApp number
- **WHEN** a visitor activates a wedding modality CTA
- **THEN** the link targets `wa.me` with a URL-encoded message naming that modality
#### Scenario: Missing WhatsApp setting preserves briefing conversion
- **GIVEN** no valid official WhatsApp number
- **WHEN** a visitor activates a wedding modality CTA
- **THEN** the visitor reaches `/briefing` with `servico_interesse` prefilled