Marketing · Activity campaigns (programme grouping)
A lighter, multi-language campaign object used to group activities and proposals into a named programme with its own date range and status.
| Area | Marketing |
| Routes | marketing.activity-campaigns · marketing.activity-campaigns.index · marketing.activity-campaigns.new · marketing.activity-campaigns.edit |
| Centre modules | marketing · marketingActivityCampaigns |
| Staff levels | root · admin · manager · scmanager · storeManager · crmmanager · weboperator |
| Models | activity-campaign · activity-campaign-language · campaign · language · proposal |
| UI label | title.header.marketing.activity-campaigns / menu.navbar.crm.activity-campaigns.index |
| Coverage | 3 use cases · 1 happy · 4 failure |
Known issues (1)
Missing translations
These keys are used on this screen but do not exist in
translations.json, so users see the raw key:
activityCampaign
How it works
Gated by a dedicated centre flag: activity-campaign#canAccess requires both an allowed role and center.hasMarketingActivityCampaigns, and the same flag is checked in the campaign editor, proposal editor and push-notification editor (hasMarketingActivityCampaigns) to decide whether the activity-campaign picker appears. Statuses mirror the activity statuses (planned/active/finished/closed) and gate canEdit/canDelete/canClose the same way. Start/end date changes run through onChangeStartDate/onChangeEndDate handlers.
Use cases
Why someone opens this (3)
- Grouping a season’s activities and proposals under one umbrella programme.
- Reporting on a programme rather than on individual activities.
- Linking a push notification or proposal to a programme for attribution.
Path map
flowchart LR F(["Activity campaigns programme grouping"]):::feat F --> H1["Programme created and linked"]:::ok F -.-> X1["Centre flag off"]:::bad F -.-> X2["Closed or finished programme"]:::bad F -.-> X3["Missing translations"]:::bad F -.-> X4["Raw translation key on screen"]:::bad classDef feat fill:#b0432c,stroke:#b0432c,color:#ffffff,font-weight:bold classDef ok fill:#e3f1ea,stroke:#0d6b42,color:#0d4a2e classDef bad fill:#f7e6e2,stroke:#9a2d1c,color:#6e1f13
Happy paths
Programme created and linked
- User creates an activity campaign with a name and date range, translated per language.
- It is saved as
plannedand later becomesactive.- Activities, proposals and push notifications reference it from their own editors.
Failure paths
Centre flag off
Cause —
hasMarketingActivityCampaignsfalse.What happens —
canAccessis false — the menu entry and the pickers in other editors all disappear.
Closed or finished programme
Cause — Status is closed/finished and the role is content_creator or root (per
canEdit’s branch).What happens — Editing is blocked. Note
canDeleteadditionally requirescanCreate, so store managers and CRM managers can edit but not delete.
Missing translations
Cause — A translatable field left blank for a non-default language.
What happens — The shared multi-language guard
error.all-translation-fields.requiredapplies in the editors that enforce it.
Raw translation key on screen
Cause — The code references
activityCampaignbut the key does not exist in translations.json.What happens — ember-intl renders the missing key (or its missing-message placeholder) instead of text — visible to every user of this screen until the key is added.
QA checklist
Tick these off while regression-testing this feature. The boxes are plain Markdown, so progress is visible in git diffs.
- ✅ Programme created and linked
- ⛔ Centre flag off
- ⛔ Closed or finished programme
- ⛔ Missing translations
- ⛔ Raw translation key on screen
Implementation
app/controllers/marketing/activity-campaigns/index.jsapp/controllers/marketing/activity-campaigns/new.jsapp/routes/marketing/activity-campaigns/*.jsapp/models/activity-campaign.jsapp/models/activity-campaign-language.jsapp/abilities/activity-campaign.jsapp/enums/activity-campaign-status.js
Translation keys (7)
Key English title.header.marketing.activity-campaignsActivity campaigns menu.navbar.crm.activity-campaigns.indexActivities campaign marketing.activity-campaign.newCreate new activity campaign campaign.status.plannedPlanned campaign.status.activeActive campaign.status.finishedFinished campaign.status.closedClosed
Related
- Same area — Activity list & duplication · Activity editor (loyalty mechanics, rules & targeting) · Activity report & PDF · Email campaign list, duplication & stop · Email campaign builder (wizard, A-B test, scheduling) · Digital games (lottery) · Fidcard · Present cards (Fideliza gift cards) · Book appointment
- Shares data with — Proposal editor (content, coupon, push, AI images) · Store create & edit · Push notification editor (scheduling, geofencing, deep links) · App button manager (MOFs) · Proposal list & publication workflow · Customer create & edit · Customer CSV import · Customer receipts tab & ticket-stamp generation
- Behind the same module — Proposal editor (content, coupon, push, AI images) · Push notification editor (scheduling, geofencing, deep links)
Generated from doc/feature-inventory.json · id marketing-activity-campaigns · commit 276788ca6