Backoffice stage 4: partners (agencies, venues) and sales CRM
- CRM: configurable pipeline (default: New → Contact → Meeting → Negotiation → Connected / Lost), drag-and-drop board, lead card with call/meeting/note history, photos and files, tasks with Telegram reminders at the due time, map of venues (OpenStreetMap via Leaflet), lost reason. Sales reps see only their own leads. - "Connected" in one click: a venue becomes a club card partner with a one-time owner link to the work bot; an agency gets a code and a client link. The sales rep is recorded on the partner for the bonus. - Sales bonus formula in settings (per venue, per agency, % of revenue from the rep's agency clients for N months); defaults are 0 until the owner sets them. - Agencies (superadmin): clients, gift subscriptions, reward by month, payouts, client link, edit. Venues: offers by membership level (5 languages), staff, card checks, 8-week activity, owner link, map point. - Schema: SalesStage/SalesLead/SalesActivity/SalesTask; salesId on Agency and Partner; lat/lng/phone/note on Partner; agencyId on Payout. - Tests for stage rules, conversion, task reminders and bonus; dev:crm-demo. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
a848bb13e2
commit
ac786cc5cc
30 files changed
+4311
-11
No files matched your search
@@ -45,6 +45,14 @@ export const settingsSchema = z.object({
|
||||
'assign.auto': z.boolean().default(true),
|
||||
/** сколько исполнителей подряд система пробует сама, дальше заказ ждёт диспетчера */
|
||||
'assign.maxAutoOffers': z.number().int().min(1).max(20).default(5),
|
||||
/** бонус продажника: за каждое подключённое заведение, ֏ (0 — не начисляется; задаёт владелец) */
|
||||
'sales.bonusPerVenue': z.number().int().min(0).default(0),
|
||||
/** бонус продажника: за каждое подключённое агентство, ֏ */
|
||||
'sales.bonusPerAgency': z.number().int().min(0).default(0),
|
||||
/** бонус продажника: % от выручки с клиентов его агентств (оплаченные заказы и подписки) */
|
||||
'sales.bonusAgencyPct': z.number().int().min(0).max(100).default(0),
|
||||
/** …сколько месяцев после подключения агентства этот % начисляется */
|
||||
'sales.bonusAgencyMonths': z.number().int().min(1).max(60).default(6),
|
||||
/** MSG-1: чат закрывается через N часов после завершения (Этап 2) */
|
||||
'chat.closeAfterHours': z.number().int().min(0).default(24),
|
||||
/** раздел 6: автоудаление сканов через N дней после завершения */
|
||||
|
||||
Reference in new issue
Block a user