299 lines
13 KiB
Markdown
299 lines
13 KiB
Markdown
# BRAND MIGRATION — TASKS.md
|
||
|
||
## Phase 1: Asset Extraction
|
||
|
||
### BRAND-FE-001
|
||
**ID**: BRAND-FE-001
|
||
**Title**: Extract legacy CSS and brand colors
|
||
**Goal**: Get exact hex values from mercadodevida.es stylesheet
|
||
**Why**: Do not approximate brand colors
|
||
**Dependencies**: None
|
||
**Applications**: Frontend, Admin
|
||
**Modules**: Design tokens
|
||
**Database impact**: None
|
||
**API contracts**: None
|
||
**Permissions**: N/A
|
||
**Implementation**: Inspect legacy site CSS via DevTools or curl; compare with current tokens; update @theme if needed
|
||
**Tests**: Visual comparison of legacy vs new site colors
|
||
**Expected blast radius**: Low — purely visual
|
||
**Definition of Done**: Extracted colors documented in BRAND_INVENTORY.md; any divergence from current tokens identified
|
||
|
||
### BRAND-FE-002
|
||
**ID**: BRAND-FE-002
|
||
**Title**: Download official logo
|
||
**Goal**: Get highest quality logo from legacy site
|
||
**Why**: No AI reconstruction or approximation allowed
|
||
**Dependencies**: BRAND-FE-001
|
||
**Applications**: Frontend, Admin
|
||
**Modules**: Public assets
|
||
**Database impact**: None
|
||
**API contracts**: None
|
||
**Permissions**: N/A
|
||
**Implementation**: Find logo image URL from legacy HTML; download SVG/PNG; save to /public/images/; generate favicon variants
|
||
**Tests**: Logo renders at correct size in Header and Footer; favicon loads
|
||
**Expected blast radius**: Low
|
||
**Definition of Done**: Logo file exists in /public/images/; renders in Header, Footer, and Admin sidebar
|
||
|
||
## Phase 2: Business Configuration
|
||
|
||
### BRAND-FE-003
|
||
**ID**: BRAND-FE-003
|
||
**Title**: Create businessConfig constant
|
||
**Goal**: Single source of truth for company information
|
||
**Why**: No duplicate address/phone/email strings
|
||
**Dependencies**: BRAND-FE-001
|
||
**Applications**: Frontend (all pages)
|
||
**Modules**: frontend/src/lib/businessConfig.ts
|
||
**Database impact**: None
|
||
**API contracts**: None
|
||
**Permissions**: N/A
|
||
**Implementation**: Create businessConfig.ts with all known company info; use `as const` for type safety; mark social URLs as null pending extraction
|
||
**Tests**: businessConfig type check; usage in Footer, Header, Contact, About, Checkout confirmation
|
||
**Expected blast radius**: Frontend text content
|
||
**Definition of Done**: All company info references businessConfig; no hardcoded strings in components
|
||
|
||
## Phase 3: Storefront Brand Application
|
||
|
||
### BRAND-FE-004
|
||
**ID**: BRAND-FE-004
|
||
**Title**: Update Header with logo + business config
|
||
**Goal**: Header reflects official brand identity
|
||
**Why**: Primary brand touchpoint
|
||
**Dependencies**: BRAND-FE-002, BRAND-FE-003
|
||
**Applications**: Frontend
|
||
**Modules**: Header component
|
||
**Database impact**: None
|
||
**API contracts**: None
|
||
**Permissions**: N/A
|
||
**Implementation**: Replace inline SVG logo with actual logo file; use businessConfig for nav text; verify no hardcoded strings remain
|
||
**Tests**: Logo renders; nav links correct; business name in correct places
|
||
**Expected blast radius**: Low
|
||
**Definition of Done**: Header matches brand; logo correct size and quality
|
||
|
||
### BRAND-FE-005
|
||
**ID**: BRAND-FE-005
|
||
**Title**: Update Footer with full business info + social
|
||
**Goal**: Footer contains all business contact information
|
||
**Why**: Trust and legal requirement (company info on all pages)
|
||
**Dependencies**: BRAND-FE-002, BRAND-FE-003
|
||
**Applications**: Frontend
|
||
**Modules**: Footer component
|
||
**Database impact**: None
|
||
**API contracts**: None
|
||
**Permissions**: N/A
|
||
**Implementation**: Use businessConfig for all footer data; add social links; add company registration info; verify copyright year is dynamic
|
||
**Tests**: All footer fields populated from businessConfig; no placeholder text
|
||
**Expected blast radius**: Low
|
||
**Definition of Done**: Footer contains address, phone, email, WhatsApp, hours, social, legal links, dynamic copyright
|
||
|
||
### BRAND-FE-006
|
||
**ID**: BRAND-FE-006
|
||
**Title**: Migrate About page content
|
||
**Goal**: Faithful migration of /quienes-somos content
|
||
**Why**: Preserve founder story and brand voice
|
||
**Dependencies**: BRAND-FE-003
|
||
**Applications**: Frontend
|
||
**Modules**: /about page
|
||
**Database impact**: None
|
||
**API contracts**: None
|
||
**Permissions**: N/A
|
||
**Implementation**: Replace current /about content with migrated content from BRAND_INVENTORY.md; use ContentPage component; add legal flag comment
|
||
**Tests**: Page renders migrated content correctly; text fidelity verified
|
||
**Expected blast radius**: Low
|
||
**Definition of Done**: About page matches legacy /quienes-somos; founders' story preserved; noted as needing legal review if claims made
|
||
|
||
### BRAND-FE-007
|
||
**ID**: BRAND-FE-007
|
||
**Title**: Update Contact page
|
||
**Goal**: Contact information from businessConfig + contact form
|
||
**Why**: Customer trust; functional contact channel
|
||
**Dependencies**: BRAND-FE-003
|
||
**Applications**: Frontend
|
||
**Modules**: /contact page
|
||
**Database impact**: None
|
||
**API contracts**: None
|
||
**Permissions**: N/A
|
||
**Implementation**: Use businessConfig for all contact info; add functional contact form (mailto or API endpoint); include map/location if feasible; hours from businessConfig
|
||
**Tests**: All contact methods displayed; form submits successfully
|
||
**Expected blast radius**: Low
|
||
**Definition of Done**: Phone, email, WhatsApp, address, hours all correct and functional
|
||
|
||
### BRAND-FE-008
|
||
**ID**: BRAND-FE-008
|
||
**Title**: Migrate/create legal pages (Terms, Privacy, Cookies)
|
||
**Goal**: Legal pages exist with migrated or new content
|
||
**Why**: Legal compliance; customer trust
|
||
**Dependencies**: None (can run parallel)
|
||
**Applications**: Frontend
|
||
**Modules**: /terms, /privacy, /cookies pages
|
||
**Database impact**: None
|
||
**API contracts**: None
|
||
**Permissions**: N/A
|
||
**Implementation**: For Terms: migrate from legacy (see BRAND_INVENTORY.md); for Privacy/Cookies: create RGPD-compliant templates; add ⚠️LEGAL_REVIEW flag to all; use ContentPage component
|
||
**Tests**: All three pages accessible at correct routes; content renders; links in footer correct
|
||
**Expected blast radius**: Low
|
||
**Definition of Done**: Pages exist and are accessible; flagged as needing legal review; legal links work
|
||
|
||
### BRAND-FE-009
|
||
**ID**: BRAND-FE-009
|
||
**Title**: Migrate/create Shipping page
|
||
**Goal**: Shipping policy accessible
|
||
**Why**: Customer information requirement
|
||
**Dependencies**: BRAND-FE-003
|
||
**Applications**: Frontend
|
||
**Modules**: /shipping page
|
||
**Database impact**: None
|
||
**API contracts**: None
|
||
**Permissions**: N/A
|
||
**Implementation**: Review existing /shipping page; enhance with additional shipping methods, costs, estimated delivery times, geographical coverage (Spain peninsular); use businessConfig for company info
|
||
**Tests**: Shipping page complete with all delivery options; pricing included if applicable
|
||
**Expected blast radius**: Low
|
||
**Definition of Done**: Shipping page reflects current shipping policy; clear geographic scope stated
|
||
|
||
## Phase 4: SEO Redirects
|
||
|
||
### BRAND-FE-010
|
||
**ID**: BRAND-FE-010
|
||
**Title**: Implement legacy URL redirects in next.config.ts
|
||
**Goal**: Preserve SEO equity; no broken links for indexed URLs
|
||
**Why**: Indexed legacy URLs must not 404
|
||
**Dependencies**: Complete LEGACY_REDIRECT_MAP.md
|
||
**Applications**: Frontend (Next.js config)
|
||
**Modules**: next.config.ts
|
||
**Database impact**: None
|
||
**API contracts**: None
|
||
**Permissions**: N/A
|
||
**Implementation**: Add `redirects()` async function in next.config.ts; implement all confirmed 308 redirects from LEGACY_REDIRECT_MAP.md; handle OpenCart route patterns with 410
|
||
**Tests**: curl each legacy URL → correct redirect or target page
|
||
**Expected blast radius**: Low — purely routing
|
||
**Definition of Done**: All legacy static page URLs redirect correctly; OpenCart query-string routes return 404
|
||
|
||
### BRAND-FE-011
|
||
**ID**: BRAND-FE-011
|
||
**Title**: Product slug redirects
|
||
**Goal**: Redirect legacy product URLs to new product pages
|
||
**Why**: Preserve SEO on indexed product pages
|
||
**Dependencies**: BRAND-FE-010 (part of same config update)
|
||
**Applications**: Frontend
|
||
**Modules**: next.config.ts
|
||
**Database impact**: None
|
||
**API contracts**: None
|
||
**Permissions**: N/A
|
||
**Implementation**: Evaluate Option A vs B from LEGACY_REDIRECT_MAP.md; implement accordingly
|
||
**Tests**: At least 5 legacy product URLs from sitemap → correct redirect
|
||
**Expected blast radius**: Low
|
||
**Definition of Done**: Legacy product slugs handled (either redirect to matching slug or to /products)
|
||
|
||
## Phase 5: Admin
|
||
|
||
### BRAND-ADM-001
|
||
**ID**: BRAND-ADM-001
|
||
**Title**: Admin sidebar logo
|
||
**Goal**: Admin sidebar uses real logo instead of inline SVG
|
||
**Why**: Brand consistency
|
||
**Dependencies**: BRAND-FE-002
|
||
**Applications**: Admin
|
||
**Modules**: DashboardLayout sidebar
|
||
**Database impact**: None
|
||
**API contracts**: None
|
||
**Permissions**: N/A
|
||
**Implementation**: Copy logo to apps/admin/public/; update sidebar to use <img> instead of inline SVG
|
||
**Tests**: Logo visible in admin sidebar
|
||
**Expected blast radius**: Low
|
||
**Definition of Done**: Admin sidebar shows actual logo; correct size
|
||
|
||
## SEO
|
||
|
||
### BRAND-SEO-001
|
||
**ID**: BRAND-SEO-001
|
||
**Title**: Sitemap update after migration
|
||
**Goal**: New sitemap reflects migrated routes
|
||
**Why**: Search engine indexing
|
||
**Dependencies**: BRAND-FE-006, BRAND-FE-007, BRAND-FE-008, BRAND-FE-009, BRAND-FE-010
|
||
**Applications**: Frontend
|
||
**Modules**: sitemap.ts
|
||
**Database impact**: None
|
||
**API contracts**: None
|
||
**Permissions**: N/A
|
||
**Implementation**: Update frontend/src/app/sitemap.ts to include /about, /contact, /shipping, /terms, /privacy, /cookies; verify /products and /categories still included
|
||
**Tests**: sitemap.xml accessible; contains all expected routes
|
||
**Expected blast radius**: Low
|
||
**Definition of Done**: Sitemap valid XML; includes all public routes
|
||
|
||
### BRAND-SEO-002
|
||
**ID**: BRAND-SEO-002
|
||
**Title**: robots.txt update
|
||
**Goal**: Allow crawlers for new routes; block legacy OpenCart routes
|
||
**Why**: SEO and security
|
||
**Dependencies**: BRAND-FE-010
|
||
**Applications**: Frontend
|
||
**Modules**: robots.ts
|
||
**Database impact**: None
|
||
**API contracts**: None
|
||
**Permissions**: N/A
|
||
**Implementation**: Update robots.ts to reflect new site structure; add Sitemap directive pointing to new sitemap
|
||
**Tests**: /robots.txt accessible; correct directives present
|
||
**Expected blast radius**: Low
|
||
**Definition of Done**: robots.txt allows crawling of all public pages; blocks admin and legacy internals
|
||
|
||
## QA
|
||
|
||
### BRAND-QA-001
|
||
**ID**: BRAND-QA-001
|
||
**Title**: Visual regression and route tests
|
||
**Goal**: Brand elements render correctly; redirects work
|
||
**Why**: Quality assurance
|
||
**Dependencies**: All FE/ADM tasks
|
||
**Applications**: QA
|
||
**Modules**: E2E or visual tests
|
||
**Tests**:
|
||
- Logo renders on Header, Footer, Admin sidebar
|
||
- Footer contains all business contact info from businessConfig
|
||
- About page renders migrated content
|
||
- Legacy redirects: /quienes-somos → /about (308), /contacto → /contact (308)
|
||
- Sitemap contains all public routes
|
||
- No hardcoded company info outside businessConfig
|
||
**Expected blast radius**: N/A
|
||
**Definition of Done**: All tests pass; visual QA sign-off
|
||
|
||
---
|
||
|
||
## Task Summary Table
|
||
|
||
| Task | Layer | Feature | Depends On | Risk | Parallel |
|
||
|------|-------|---------|-----------|------|---------|
|
||
| BRAND-FE-001 | FE | Extract legacy CSS | — | Low | * |
|
||
| BRAND-FE-002 | FE | Download logo | BRAND-FE-001 | Low | * |
|
||
| BRAND-FE-003 | FE | businessConfig | BRAND-FE-001 | Low | * |
|
||
| BRAND-FE-004 | FE | Header update | BRAND-FE-002, BRAND-FE-003 | Low | * |
|
||
| BRAND-FE-005 | FE | Footer update | BRAND-FE-002, BRAND-FE-003 | Low | * |
|
||
| BRAND-FE-006 | FE | About page | BRAND-FE-003 | Low | * |
|
||
| BRAND-FE-007 | FE | Contact page | BRAND-FE-003 | Low | * |
|
||
| BRAND-FE-008 | FE | Legal pages | — | Medium | * |
|
||
| BRAND-FE-009 | FE | Shipping page | BRAND-FE-003 | Low | * |
|
||
| BRAND-FE-010 | FE | Static page redirects | BRAND-FE-001 | Low | BRAND-FE-006..009 |
|
||
| BRAND-FE-011 | FE | Product slug redirects | BRAND-FE-010 | Medium | * |
|
||
| BRAND-ADM-001 | Admin | Admin logo | BRAND-FE-002 | Low | * |
|
||
| BRAND-SEO-001 | SEO | Sitemap update | BRAND-FE-006..009 | Low | * |
|
||
| BRAND-SEO-002 | SEO | robots.txt update | BRAND-FE-010 | Low | * |
|
||
| BRAND-QA-001 | QA | Visual + route tests | All above | Low | After FE tasks |
|
||
|
||
**Parallel group**: BRAND-FE-001 through BRAND-FE-003 can run in parallel. BRAND-FE-004 through BRAND-FE-009 can run in parallel after FE-003. BRAND-FE-010 depends on BRAND-FE-001 (extract URLs). BRAND-SEO-001 and BRAND-SEO-002 depend on content pages being done.
|
||
|
||
**Recommended order**:
|
||
1. BRAND-FE-001, BRAND-FE-002, BRAND-FE-003 (parallel)
|
||
2. BRAND-FE-004, BRAND-FE-005, BRAND-FE-006, BRAND-FE-007, BRAND-FE-008, BRAND-FE-009 (parallel)
|
||
3. BRAND-FE-010 + BRAND-FE-011 (after FE-001)
|
||
4. BRAND-ADM-001 (after FE-002)
|
||
5. BRAND-SEO-001 + BRAND-SEO-002 (after content pages)
|
||
6. BRAND-QA-001 (after everything)
|
||
|
||
**High-risk tasks**:
|
||
- BRAND-FE-008 (legal pages — requires human review, cannot be auto-approved)
|
||
- BRAND-FE-011 (product redirects — wrong option could lose SEO equity)
|
||
|
||
**Migration risks**:
|
||
- Legal text is legacy and may not comply with current RGPD — must be reviewed by human before publishing
|
||
- Legacy site may still be actively used — coordinate go-live date
|
||
- Legacy product slugs may not match new platform slug format — requires slug mapping
|