docs: loyalty go-live update + Hetzner reset fix + sweep nav
Some checks failed
Some checks failed
- docs/proposals/loyalty-go-live-readiness.md — record the 2026-05-16 session: 7 bugs found during Test 1 round 1 (TimestampMixin, CardDetailResponse, storefront i18n triple, Makefile, meta_keywords), 6 fixed and deployed with commit hashes, B1-F still pending repro on the clean DB. - docs/deployment/hetzner-server-setup.md — fix section 12 step 8 to call seed_email_templates_core.py + seed_email_templates_loyalty.py instead of the non-existent seed_email_templates.py, and add seed_demo.py at the end. Append a note about post-reset state (.build-info + admin settings). - mkdocs.yml — sweep 14 previously-unlinked proposals and 2 module docs (loyalty/production-readiness.md, prospecting/batch-scanning.md) into the nav so the strict build no longer warns. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -15,6 +15,53 @@ loyalty platform live for FASHIONHUB's stores and start the Google
|
||||
Wallet production-access review in parallel (1–3 day Google review,
|
||||
non-blocking).
|
||||
|
||||
## 2026-05-16 update — Test 1 round 1: 7 bugs found, 6 fixed, 1 pending
|
||||
|
||||
First attempt at the customer-facing journey on FASHIONHUB's fallback
|
||||
subdomain (`fashionhub.rewardflow.lu`) surfaced more than expected. A
|
||||
critical timestamp bug was masquerading as a re-enrollment confusion,
|
||||
which sent us briefly down the wrong investigation path. The clean-slate
|
||||
reset described below cleared the bad data so the remaining gates can be
|
||||
verified on a known-good baseline.
|
||||
|
||||
**Six bugs fixed and deployed to prod** (5 commits):
|
||||
|
||||
| Bug | Layer | Fix |
|
||||
|---|---|---|
|
||||
| `TimestampMixin` evaluated `datetime.now(UTC)` once at module import — every row stamped at process-start time | `models/database/base.py` | Pass `_utc_now` callable as `default` / `onupdate`. Critical: affected every `created_at` / `updated_at` on every table that uses the mixin since the last app restart. |
|
||||
| Admin/store/merchant card detail page showed "-" for phone + birthday even when both were captured during enrollment | `app/modules/loyalty/schemas/card.py` + 3 endpoints | Added `customer_phone` + `customer_birthday` to `CardDetailResponse` and populated from `customer.phone` / `customer.birth_date`. Data was persisting all along — purely a serialization gap. |
|
||||
| Storefront `<html lang="en">` hardcoded made `<input type="date">` show in mm/dd/yyyy on the FR storefront | `app/templates/storefront/base.html` | Dynamic `lang="{{ current_language\|default('en') }}"` so the browser respects the FR locale. |
|
||||
| Storefront nav "Home" rendered as English literal across all locales despite `nav.home` existing in every locale file | `app/templates/storefront/base.html` | Use `{{ _('nav.home') }}` on both desktop and mobile nav. |
|
||||
| `Store.description` (the per-store tagline) was single-language only — FASHIONHUB's "Trendy clothing and accessories" rendered in EN on the FR storefront footer | `Store` model + migration `tenancy_005` + template + `seed_demo.py` | Added `description_translations` JSON column with the same shape used by CMS / Platform / Subscription. Added `get_translated_description(lang)` getter with FR/DE → DEFAULT_LANGUAGE → `description` fallback. Seeded FR/DE/LB/EN for Fashion Group's two stores so they render correctly out of the box. |
|
||||
| `make init-prod` and `make db-reset` referenced `scripts/seed/seed_email_templates.py`, which doesn't exist (the real seeders are `_core.py` + `_loyalty.py`) — `db-reset` would silently bomb mid-way | `Makefile` | Call both real scripts in both targets. |
|
||||
| `scripts/seed/create_default_content_pages.py` still passed `meta_keywords` to `ContentPage`, but the column was dropped in migration `cms_003` — fresh seeding failed on the first platform | `scripts/seed/create_default_content_pages.py` | Drop the `meta_keywords` kwarg. |
|
||||
|
||||
**One bug still open:**
|
||||
|
||||
- **B1-F — welcome email not received.** The original investigation was confounded by the timestamp bug (customer looked like it was from May 12 when it was actually fresh, making the re-enrollment hypothesis seem plausible). Needs fresh repro on the clean DB: enroll with a new email, tail `api` + `celery-worker` logs live, check `email_logs` for a row. If still no email, then there's a real bug in the dispatch path — `notification_service.send_enrollment_confirmation` is called from `card_service.enroll_customer:636` and wraps the call in a try/except that only logs warnings (`card_service.py:631-645`), so a silent failure in `_resolve_context` or the Celery enqueue would be invisible from the user's perspective.
|
||||
|
||||
**Two product decisions pending** (from the same session, not yet implemented):
|
||||
|
||||
- **B1-E — QR code in welcome email.** Scoped: pass `wallet_save_url` into the `loyalty_enrollment` template, generate QR server-side (Python `qrcode`), update the HTML body in all 4 locales in `scripts/seed/seed_email_templates_loyalty.py:294-299`, reseed. Blocked on B1-F (no point adding a QR to an email that doesn't send).
|
||||
- **C1-C backfill scope.** Other stores (WizaTech, BookWorld, LuxWeb, WizaMart etc.) still only have a single-language `description`. Fashion Group was seeded; rest can be done by hand via admin UI as merchants come online, or batch-updated later. No code work needed.
|
||||
|
||||
### Prod data reset
|
||||
|
||||
Wiped and reseeded — used the corrected sequence from
|
||||
[`deployment/hetzner-server-setup.md`](../deployment/hetzner-server-setup.md)
|
||||
section 12. Two doc gaps found and patched in the same pass:
|
||||
|
||||
- Reset procedure called `scripts/seed/seed_email_templates.py` (doesn't exist) — now calls both real scripts
|
||||
- Reset procedure was missing `seed_demo.py` at the end of step 8 — now included
|
||||
|
||||
After reset, admin credentials are back to the defaults from `init_production.py` (admin / `Ollama@8044`, etc.); platform admin SMTP overrides in `/admin/settings` need to be re-applied (port 587, STARTTLS, `support@wizard.lu`).
|
||||
|
||||
### Status board delta
|
||||
|
||||
- Step 1 (email templates seeded) — re-seeded post-reset, still ✅
|
||||
- Step 3 (migrations) — now at `tenancy_005`, still ✅
|
||||
- Step 6 (web user-journey E2E tests) — Test 1 round 2 pending on clean DB; the bugs found in round 1 are no longer blockers
|
||||
|
||||
## Status board
|
||||
|
||||
| # | Pre-launch step | State | Notes |
|
||||
|
||||
Reference in New Issue
Block a user