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
@@ -387,6 +387,228 @@ const ru = {
|
||||
'chat.details': 'Подробнее',
|
||||
'chat.more': 'Ещё действия',
|
||||
|
||||
// ───── партнёры и CRM (этап 4) ─────
|
||||
'crm.title': 'CRM',
|
||||
'crm.newLead': 'Новый лид',
|
||||
'crm.editLead': 'Лид',
|
||||
'crm.stagesBtn': 'Воронка',
|
||||
'crm.tab.board': 'Воронка',
|
||||
'crm.tab.tasks': 'Задачи',
|
||||
'crm.tab.map': 'Карта',
|
||||
'crm.search': 'Название, контакт, телефон или адрес',
|
||||
'crm.kind.all': 'Все',
|
||||
'crm.kind.VENUE': 'Заведения',
|
||||
'crm.kind.AGENCY': 'Агентства',
|
||||
'crm.kind1.VENUE': 'Заведение',
|
||||
'crm.kind1.AGENCY': 'Агентство',
|
||||
'crm.owner': 'Продажник',
|
||||
'crm.allSales': 'Все продажники',
|
||||
'crm.noOwner': 'Без продажника',
|
||||
'crm.ownerIs': 'ведёт {name}',
|
||||
'crm.connected': 'Подключён',
|
||||
'crm.connect': 'Подключение',
|
||||
'crm.days': '{n} дн',
|
||||
'crm.inStage': 'Сколько дней на этом этапе',
|
||||
'crm.dropHere': 'Перетащите сюда',
|
||||
'crm.dragHint': 'Перетаскивайте карточки между этапами. «Подключён» сразу создаёт партнёра или агентство и выдаёт ссылку, «Отказ» спросит причину.',
|
||||
'crm.overdue': 'просрочена',
|
||||
'crm.tasksOpen': 'Открытые',
|
||||
'crm.tasksDone': 'Выполненные',
|
||||
'crm.addTask': 'Задача',
|
||||
'crm.noTasks': 'Открытых задач нет.',
|
||||
'crm.noDoneTasks': 'Выполненных задач пока нет.',
|
||||
'crm.noLead': 'без лида',
|
||||
'crm.tasksHint': 'В срок задачи придёт напоминание в рабочий бот (если привязан Telegram).',
|
||||
'crm.taskTitle': 'Что сделать',
|
||||
'crm.taskDay': 'День',
|
||||
'crm.taskTime': 'Время',
|
||||
'crm.taskHint': 'Напоминание придёт в рабочий бот в это время (по Еревану).',
|
||||
'crm.tp.call': 'Позвонить',
|
||||
'crm.tp.meet': 'Встреча',
|
||||
'crm.tp.send': 'Отправить условия',
|
||||
'crm.tp.check': 'Узнать решение',
|
||||
'crm.partnerOnMap': 'партнёр клуба',
|
||||
'crm.legendPartner': 'подключённые партнёры',
|
||||
'crm.legendLead': 'лиды (цвет этапа)',
|
||||
'crm.mapHint': 'Точка появляется, когда у лида есть координаты.',
|
||||
'crm.name': 'Название',
|
||||
'crm.namePhVenue': 'Например: Lumen Coffee',
|
||||
'crm.namePhAgency': 'Например: Domik Realty',
|
||||
'crm.category': 'Тип',
|
||||
'crm.contactName': 'Контактное лицо',
|
||||
'crm.contactPh': 'Имя и должность',
|
||||
'crm.address': 'Адрес',
|
||||
'crm.note': 'Заметка',
|
||||
'crm.convert': 'Подключить',
|
||||
'crm.convertTitle': 'Подключить «{name}»',
|
||||
'crm.convertVenueHint': 'Создадим партнёра клубной карты и ссылку для собственника: он откроет рабочий бот и сможет проверять карты клиентов. Предложения по уровням добавите в карточке заведения.',
|
||||
'crm.convertAgencyHint': 'Создадим агентство с кодом и ссылку для его клиентов: по ней они получают подарочный месяц и закрепляются за агентством.',
|
||||
'crm.agencyCode': 'Код агентства',
|
||||
'crm.agencyCodeHint': 'Латиница и цифры, клиенты могут ввести его вручную',
|
||||
'crm.convertedTitle': 'Подключено 🎉',
|
||||
'crm.convertedVenue': 'Отправьте эту ссылку собственнику заведения. Ссылка одноразовая.',
|
||||
'crm.convertedAgency': 'Эту ссылку агентство раздаёт клиентам.',
|
||||
'crm.openVenue': 'Карточка заведения',
|
||||
'crm.openAgency': 'Карточка агентства',
|
||||
'crm.ownerLinked': 'Собственник уже в рабочем боте.',
|
||||
'crm.ownerNotYet': 'Собственник ещё не открыл ссылку. Отправьте её ещё раз:',
|
||||
'crm.agencyInfo': 'Код {code}, клиентов: {n}',
|
||||
'crm.lostTitle': 'Почему отказ?',
|
||||
'crm.lostReason': 'Причина',
|
||||
'crm.lr.price': 'Не устроили условия',
|
||||
'crm.lr.notNow': 'Не сейчас, вернуться позже',
|
||||
'crm.lr.noAnswer': 'Не выходят на связь',
|
||||
'crm.lr.competitor': 'Работают с конкурентом',
|
||||
'crm.lostBanner': 'Отказ: {reason}',
|
||||
'crm.stagesTitle': 'Этапы воронки',
|
||||
'crm.stagesHint': 'Порядок — стрелками. Нужен хотя бы один открытый этап и один «Подключён». Этап с лидами при удалении скрывается, лиды остаются.',
|
||||
'crm.addStage': 'Этап',
|
||||
'crm.stageKind.OPEN': 'в работе',
|
||||
'crm.stageKind.WON': 'подключён',
|
||||
'crm.stageKind.LOST': 'отказ',
|
||||
'crm.bonusMonth': 'Бонус за месяц',
|
||||
'crm.bonusMineSuper': 'Бонус (ваш), месяц',
|
||||
'crm.bonusNotSet': 'не настроен',
|
||||
'crm.bonusVenues': 'Заведения: {n} → {sum}',
|
||||
'crm.bonusAgencies': 'Агентства: {n} → {sum}',
|
||||
'crm.bonusRevenue': '{pct}% выручки клиентов агентств → {sum}',
|
||||
'crm.bonusTitle': 'Формула бонуса продажника',
|
||||
'crm.bonusHint': 'Бонус за месяц = подключённые заведения × ставка + агентства × ставка + % выручки клиентов агентств продажника (первые N месяцев после подключения). Выручка — оплаченные заказы и подписки.',
|
||||
'crm.bonusPerVenue': 'За заведение, ֏',
|
||||
'crm.bonusPerAgency': 'За агентство, ֏',
|
||||
'crm.bonusPct': '% выручки клиентов агентств',
|
||||
'crm.bonusMonths': 'Сколько месяцев',
|
||||
'crm.back': 'CRM',
|
||||
'crm.created': 'с {date}',
|
||||
'crm.stage': 'Этап',
|
||||
'crm.history': 'История контактов',
|
||||
'crm.noHistory': 'Пока пусто — запишите первый звонок или встречу.',
|
||||
'crm.act.CALL': 'Звонок',
|
||||
'crm.act.MEETING': 'Встреча',
|
||||
'crm.act.NOTE': 'Заметка',
|
||||
'crm.act.FILE': 'Файл',
|
||||
'crm.act.STAGE': 'Этап',
|
||||
'crm.act.WON': 'Подключён',
|
||||
'crm.actPh.CALL': 'О чём договорились по телефону?',
|
||||
'crm.actPh.MEETING': 'Как прошла встреча, что дальше?',
|
||||
'crm.actPh.NOTE': 'Заметка для себя и команды',
|
||||
'crm.addAct': 'Записать',
|
||||
'crm.attach': 'Фото или файл',
|
||||
'crm.tasks': 'Задачи',
|
||||
'crm.noLeadTasks': 'Задач нет. Поставьте следующий шаг — придёт напоминание.',
|
||||
'crm.contacts': 'Контакты',
|
||||
'crm.noCoords': 'На карте нет точки.',
|
||||
'crm.coordsPh': 'Ссылка Google Maps или «40.18, 44.51»',
|
||||
'crm.coordsBad': 'Не нашли координаты — вставьте ссылку из Google Maps или числа через запятую.',
|
||||
'crm.remove': 'Удалить лид',
|
||||
'crm.removeConfirm': 'Удалить лид вместе с историей и задачами?',
|
||||
'venue.cat.cafe': 'Кафе',
|
||||
'venue.cat.restaurant': 'Ресторан',
|
||||
'venue.cat.shop': 'Магазин',
|
||||
'venue.cat.beauty': 'Красота',
|
||||
'venue.cat.other': 'Другое',
|
||||
'ag.title': 'Агентства',
|
||||
'ag.add': 'Новое агентство',
|
||||
'ag.editTitle': 'Агентство',
|
||||
'ag.empty': 'Агентств пока нет.',
|
||||
'ag.col.name': 'Агентство',
|
||||
'ag.col.clients': 'Клиенты',
|
||||
'ag.col.gifts': 'Подарки',
|
||||
'ag.col.month': 'Вознаграждение, месяц',
|
||||
'ag.col.balance': 'К выплате',
|
||||
'ag.hint': 'Вознаграждение — % от оплаченных заказов клиентов агентства, пока они закреплены за ним.',
|
||||
'ag.inactive': 'выключено',
|
||||
'ag.back': 'Все агентства',
|
||||
'ag.pct': '{n}% с заказов клиентов',
|
||||
'ag.byS': 'подключил(а) {name}',
|
||||
'ag.link': 'Ссылка для клиентов',
|
||||
'ag.linkHint': 'По ссылке клиент открывает бота, получает подарочный месяц и закрепляется за агентством. Или вводит код {code} командой /code.',
|
||||
'ag.clients': 'Клиенты',
|
||||
'ag.giftsN': 'подарков: {n}',
|
||||
'ag.noClients': 'Клиентов пока нет.',
|
||||
'ag.orders': 'заказов: {n}',
|
||||
'ag.toPay': 'Вознаграждение к выплате',
|
||||
'ag.accrued': 'Начислено',
|
||||
'ag.payouts': 'Выплаты',
|
||||
'ag.payoutTitle': 'Выплата агентству',
|
||||
'ag.balanceHint': 'Начислено и не выплачено: {sum}',
|
||||
'ag.pctLabel': 'Вознаграждение, %',
|
||||
'ag.sales': 'Подключил продажник',
|
||||
'ag.contactPh': 'Имя, телефон, Telegram',
|
||||
'ag.active': 'Агентство работает (код принимается)',
|
||||
'vn.title': 'Заведения',
|
||||
'vn.add': 'Новое заведение',
|
||||
'vn.editTitle': 'Заведение',
|
||||
'vn.empty': 'Заведений пока нет.',
|
||||
'vn.col.name': 'Заведение',
|
||||
'vn.col.offers': 'Предложения',
|
||||
'vn.col.staff': 'Сотрудники',
|
||||
'vn.col.visits': 'Проверки за 30 дн',
|
||||
'vn.col.last': 'Последняя проверка',
|
||||
'vn.hint': 'Проверка — сотрудник заведения отсканировал клубную карту клиента в рабочем боте.',
|
||||
'vn.noOwner': 'нет собственника',
|
||||
'vn.noOffers': 'нет предложений',
|
||||
'vn.back': 'Все заведения',
|
||||
'vn.ownerHint': 'Собственник ещё не подключён — отправьте ему одноразовую ссылку в рабочий бот.',
|
||||
'vn.makeLink': 'Создать ссылку',
|
||||
'vn.offers': 'Предложения по уровням',
|
||||
'vn.addOffer': 'Предложение',
|
||||
'vn.editOffer': 'Предложение',
|
||||
'vn.noOffersHint': 'Добавьте, что положено членам клуба: скидку, подарок, комплимент.',
|
||||
'vn.level.any': 'Любой член клуба',
|
||||
'vn.level.BAREV_PLUS': 'Barev+ и Elite',
|
||||
'vn.level.ELITE': 'Только Elite',
|
||||
'vn.limit.NONE': 'без ограничений',
|
||||
'vn.limit.ONCE': 'один раз',
|
||||
'vn.limit.WEEK': '{n} р. в неделю',
|
||||
'vn.limit.MONTH': '{n} р. в месяц',
|
||||
'vn.limitOpt.NONE': 'Без ограничений',
|
||||
'vn.limitOpt.ONCE': 'Только первый визит',
|
||||
'vn.limitOpt.WEEK': 'N раз в неделю',
|
||||
'vn.limitOpt.MONTH': 'N раз в месяц',
|
||||
'vn.offerOff': 'выключено',
|
||||
'vn.offerTitle': 'Что получает клиент',
|
||||
'vn.offerTitleHint': 'Например: «Капучино в подарок» или «−15% на всё меню»',
|
||||
'vn.forWhom': 'Для кого',
|
||||
'vn.howOften': 'Как часто',
|
||||
'vn.times': 'Сколько раз',
|
||||
'vn.offerActive': 'Предложение действует',
|
||||
'vn.activity': 'Активность',
|
||||
'vn.weeks8': 'за 8 недель',
|
||||
'vn.checks': 'проверки карты',
|
||||
'vn.redeemed': 'списания предложений',
|
||||
'vn.cardCheck': 'проверка карты',
|
||||
'vn.staff': 'Сотрудники',
|
||||
'vn.noStaff': 'Пока никого.',
|
||||
'vn.role.OWNER': 'собственник',
|
||||
'vn.role.STAFF': 'сотрудник',
|
||||
'vn.removeStaff': 'Убрать {name} из заведения?',
|
||||
'vn.staffHint': 'Сотрудников приглашает собственник в рабочем боте (QR на сутки).',
|
||||
'vn.newOwnerLink': 'Ссылка собственнику',
|
||||
'vn.newOwnerLinkHint': 'Новая одноразовая ссылка — например, если сменился собственник',
|
||||
'vn.blurb': 'Коротко о скидке (на карточке у клиента)',
|
||||
'vn.blurbHint': 'Например: «−10% по клубной карте»',
|
||||
'vn.coords': 'Точка на карте',
|
||||
'vn.activeLabel': 'Заведение видно клиентам',
|
||||
'err.LEAD_NOT_CONVERTED': 'Чтобы перевести в «Подключён», нажмите «Подключить» — так создастся партнёр.',
|
||||
'err.ALREADY_CONVERTED': 'Лид уже подключён.',
|
||||
'err.AGENCY_CODE_FORMAT': 'Код — латиница, цифры и «_», до 32 символов.',
|
||||
'err.AGENCY_CODE_TAKEN': 'Такой код уже есть у другого агентства.',
|
||||
'err.STAGES_INVALID': 'Нужен хотя бы один открытый этап и один «Подключён».',
|
||||
'audit.bo.crm.create': 'добавил(а) лид',
|
||||
'audit.bo.crm.update': 'изменил(а) лид',
|
||||
'audit.bo.crm.move': 'перевёл(а) лид на другой этап',
|
||||
'audit.bo.crm.convert': 'подключил(а) партнёра',
|
||||
'audit.bo.crm.addActivity': 'записал(а) контакт',
|
||||
'audit.bo.crm.saveStages': 'изменил(а) воронку',
|
||||
'audit.bo.crm.setBonusRules': 'изменил(а) формулу бонуса',
|
||||
'audit.bo.partners.saveAgency': 'изменил(а) агентство',
|
||||
'audit.bo.partners.agencyPayout': 'отметил(а) выплату агентству',
|
||||
'audit.bo.partners.saveVenue': 'изменил(а) заведение',
|
||||
'audit.bo.partners.saveOffer': 'изменил(а) предложение заведения',
|
||||
'audit.bo.partners.ownerInvite': 'выпустил(а) ссылку собственнику',
|
||||
'audit.bo.partners.removeMember': 'убрал(а) сотрудника заведения',
|
||||
|
||||
// ───── заказы и исполнители (этап 3) ─────
|
||||
'ord.title': 'Заказы',
|
||||
'ord.new': 'Новый заказ',
|
||||
@@ -1031,6 +1253,228 @@ const en: Dict = {
|
||||
'chat.details': 'Details',
|
||||
'chat.more': 'More actions',
|
||||
|
||||
// ───── партнёры и CRM (этап 4) ─────
|
||||
'crm.title': 'CRM',
|
||||
'crm.newLead': 'New lead',
|
||||
'crm.editLead': 'Lead',
|
||||
'crm.stagesBtn': 'Pipeline',
|
||||
'crm.tab.board': 'Pipeline',
|
||||
'crm.tab.tasks': 'Tasks',
|
||||
'crm.tab.map': 'Map',
|
||||
'crm.search': 'Name, contact, phone or address',
|
||||
'crm.kind.all': 'All',
|
||||
'crm.kind.VENUE': 'Venues',
|
||||
'crm.kind.AGENCY': 'Agencies',
|
||||
'crm.kind1.VENUE': 'Venue',
|
||||
'crm.kind1.AGENCY': 'Agency',
|
||||
'crm.owner': 'Sales rep',
|
||||
'crm.allSales': 'All sales reps',
|
||||
'crm.noOwner': 'Unassigned',
|
||||
'crm.ownerIs': 'owned by {name}',
|
||||
'crm.connected': 'Connected',
|
||||
'crm.connect': 'Connecting',
|
||||
'crm.days': '{n} d',
|
||||
'crm.inStage': 'Days in this stage',
|
||||
'crm.dropHere': 'Drop here',
|
||||
'crm.dragHint': 'Drag cards between stages. “Connected” creates the partner or agency and gives you a link; “Lost” asks for a reason.',
|
||||
'crm.overdue': 'overdue',
|
||||
'crm.tasksOpen': 'Open',
|
||||
'crm.tasksDone': 'Done',
|
||||
'crm.addTask': 'Task',
|
||||
'crm.noTasks': 'No open tasks.',
|
||||
'crm.noDoneTasks': 'No completed tasks yet.',
|
||||
'crm.noLead': 'no lead',
|
||||
'crm.tasksHint': 'When a task is due you get a reminder in the work bot (if Telegram is linked).',
|
||||
'crm.taskTitle': 'What to do',
|
||||
'crm.taskDay': 'Day',
|
||||
'crm.taskTime': 'Time',
|
||||
'crm.taskHint': 'A reminder comes to the work bot at this time (Yerevan).',
|
||||
'crm.tp.call': 'Call',
|
||||
'crm.tp.meet': 'Meeting',
|
||||
'crm.tp.send': 'Send the terms',
|
||||
'crm.tp.check': 'Ask for a decision',
|
||||
'crm.partnerOnMap': 'club partner',
|
||||
'crm.legendPartner': 'connected partners',
|
||||
'crm.legendLead': 'leads (stage colour)',
|
||||
'crm.mapHint': 'A dot appears once a lead has coordinates.',
|
||||
'crm.name': 'Name',
|
||||
'crm.namePhVenue': 'E.g. Lumen Coffee',
|
||||
'crm.namePhAgency': 'E.g. Domik Realty',
|
||||
'crm.category': 'Type',
|
||||
'crm.contactName': 'Contact person',
|
||||
'crm.contactPh': 'Name and position',
|
||||
'crm.address': 'Address',
|
||||
'crm.note': 'Note',
|
||||
'crm.convert': 'Connect',
|
||||
'crm.convertTitle': 'Connect “{name}”',
|
||||
'crm.convertVenueHint': 'We’ll create a club card partner and an owner link: the owner opens the work bot and can check client cards. Add offers in the venue card.',
|
||||
'crm.convertAgencyHint': 'We’ll create the agency with a code and a client link: clients get a gift month and are attached to the agency.',
|
||||
'crm.agencyCode': 'Agency code',
|
||||
'crm.agencyCodeHint': 'Latin letters and digits; clients can type it in',
|
||||
'crm.convertedTitle': 'Connected 🎉',
|
||||
'crm.convertedVenue': 'Send this link to the venue owner. It works once.',
|
||||
'crm.convertedAgency': 'The agency shares this link with clients.',
|
||||
'crm.openVenue': 'Venue card',
|
||||
'crm.openAgency': 'Agency card',
|
||||
'crm.ownerLinked': 'The owner is already in the work bot.',
|
||||
'crm.ownerNotYet': 'The owner hasn’t opened the link yet. Send it again:',
|
||||
'crm.agencyInfo': 'Code {code}, clients: {n}',
|
||||
'crm.lostTitle': 'Why lost?',
|
||||
'crm.lostReason': 'Reason',
|
||||
'crm.lr.price': 'Terms didn’t fit',
|
||||
'crm.lr.notNow': 'Not now, come back later',
|
||||
'crm.lr.noAnswer': 'Not responding',
|
||||
'crm.lr.competitor': 'Work with a competitor',
|
||||
'crm.lostBanner': 'Lost: {reason}',
|
||||
'crm.stagesTitle': 'Pipeline stages',
|
||||
'crm.stagesHint': 'Reorder with arrows. You need at least one open and one “Connected” stage. A stage with leads is hidden, not deleted.',
|
||||
'crm.addStage': 'Stage',
|
||||
'crm.stageKind.OPEN': 'open',
|
||||
'crm.stageKind.WON': 'connected',
|
||||
'crm.stageKind.LOST': 'lost',
|
||||
'crm.bonusMonth': 'Bonus this month',
|
||||
'crm.bonusMineSuper': 'Bonus (yours), month',
|
||||
'crm.bonusNotSet': 'not set',
|
||||
'crm.bonusVenues': 'Venues: {n} → {sum}',
|
||||
'crm.bonusAgencies': 'Agencies: {n} → {sum}',
|
||||
'crm.bonusRevenue': '{pct}% of agency client revenue → {sum}',
|
||||
'crm.bonusTitle': 'Sales bonus formula',
|
||||
'crm.bonusHint': 'Monthly bonus = connected venues × rate + agencies × rate + % of revenue from the rep’s agency clients (first N months). Revenue = paid orders and subscriptions.',
|
||||
'crm.bonusPerVenue': 'Per venue, ֏',
|
||||
'crm.bonusPerAgency': 'Per agency, ֏',
|
||||
'crm.bonusPct': '% of agency client revenue',
|
||||
'crm.bonusMonths': 'For how many months',
|
||||
'crm.back': 'CRM',
|
||||
'crm.created': 'since {date}',
|
||||
'crm.stage': 'Stage',
|
||||
'crm.history': 'Contact history',
|
||||
'crm.noHistory': 'Empty so far — log the first call or meeting.',
|
||||
'crm.act.CALL': 'Call',
|
||||
'crm.act.MEETING': 'Meeting',
|
||||
'crm.act.NOTE': 'Note',
|
||||
'crm.act.FILE': 'File',
|
||||
'crm.act.STAGE': 'Stage',
|
||||
'crm.act.WON': 'Connected',
|
||||
'crm.actPh.CALL': 'What did you agree on the call?',
|
||||
'crm.actPh.MEETING': 'How did the meeting go, what’s next?',
|
||||
'crm.actPh.NOTE': 'A note for yourself and the team',
|
||||
'crm.addAct': 'Log it',
|
||||
'crm.attach': 'Photo or file',
|
||||
'crm.tasks': 'Tasks',
|
||||
'crm.noLeadTasks': 'No tasks. Set the next step — you’ll get a reminder.',
|
||||
'crm.contacts': 'Contacts',
|
||||
'crm.noCoords': 'Not on the map yet.',
|
||||
'crm.coordsPh': 'Google Maps link or “40.18, 44.51”',
|
||||
'crm.coordsBad': 'No coordinates found — paste a Google Maps link or two numbers.',
|
||||
'crm.remove': 'Delete lead',
|
||||
'crm.removeConfirm': 'Delete the lead with its history and tasks?',
|
||||
'venue.cat.cafe': 'Café',
|
||||
'venue.cat.restaurant': 'Restaurant',
|
||||
'venue.cat.shop': 'Shop',
|
||||
'venue.cat.beauty': 'Beauty',
|
||||
'venue.cat.other': 'Other',
|
||||
'ag.title': 'Agencies',
|
||||
'ag.add': 'New agency',
|
||||
'ag.editTitle': 'Agency',
|
||||
'ag.empty': 'No agencies yet.',
|
||||
'ag.col.name': 'Agency',
|
||||
'ag.col.clients': 'Clients',
|
||||
'ag.col.gifts': 'Gifts',
|
||||
'ag.col.month': 'Reward, month',
|
||||
'ag.col.balance': 'To pay',
|
||||
'ag.hint': 'Reward = % of paid orders of the agency’s clients while they’re attached.',
|
||||
'ag.inactive': 'inactive',
|
||||
'ag.back': 'All agencies',
|
||||
'ag.pct': '{n}% of client orders',
|
||||
'ag.byS': 'connected by {name}',
|
||||
'ag.link': 'Client link',
|
||||
'ag.linkHint': 'The client opens the bot, gets a gift month and is attached to the agency. Or types code {code} via /code.',
|
||||
'ag.clients': 'Clients',
|
||||
'ag.giftsN': 'gifts: {n}',
|
||||
'ag.noClients': 'No clients yet.',
|
||||
'ag.orders': 'orders: {n}',
|
||||
'ag.toPay': 'Reward to pay',
|
||||
'ag.accrued': 'Accrued',
|
||||
'ag.payouts': 'Payouts',
|
||||
'ag.payoutTitle': 'Payout to agency',
|
||||
'ag.balanceHint': 'Accrued and unpaid: {sum}',
|
||||
'ag.pctLabel': 'Reward, %',
|
||||
'ag.sales': 'Connected by',
|
||||
'ag.contactPh': 'Name, phone, Telegram',
|
||||
'ag.active': 'Agency active (code accepted)',
|
||||
'vn.title': 'Venues',
|
||||
'vn.add': 'New venue',
|
||||
'vn.editTitle': 'Venue',
|
||||
'vn.empty': 'No venues yet.',
|
||||
'vn.col.name': 'Venue',
|
||||
'vn.col.offers': 'Offers',
|
||||
'vn.col.staff': 'Staff',
|
||||
'vn.col.visits': 'Checks, 30 d',
|
||||
'vn.col.last': 'Last check',
|
||||
'vn.hint': 'A check = venue staff scanned a client’s club card in the work bot.',
|
||||
'vn.noOwner': 'no owner',
|
||||
'vn.noOffers': 'no offers',
|
||||
'vn.back': 'All venues',
|
||||
'vn.ownerHint': 'The owner isn’t connected yet — send them a one-time work bot link.',
|
||||
'vn.makeLink': 'Create link',
|
||||
'vn.offers': 'Offers by level',
|
||||
'vn.addOffer': 'Offer',
|
||||
'vn.editOffer': 'Offer',
|
||||
'vn.noOffersHint': 'Add what members get: a discount, a gift, a treat.',
|
||||
'vn.level.any': 'Any member',
|
||||
'vn.level.BAREV_PLUS': 'Barev+ and Elite',
|
||||
'vn.level.ELITE': 'Elite only',
|
||||
'vn.limit.NONE': 'unlimited',
|
||||
'vn.limit.ONCE': 'once',
|
||||
'vn.limit.WEEK': '{n}× a week',
|
||||
'vn.limit.MONTH': '{n}× a month',
|
||||
'vn.limitOpt.NONE': 'Unlimited',
|
||||
'vn.limitOpt.ONCE': 'First visit only',
|
||||
'vn.limitOpt.WEEK': 'N times a week',
|
||||
'vn.limitOpt.MONTH': 'N times a month',
|
||||
'vn.offerOff': 'off',
|
||||
'vn.offerTitle': 'What the client gets',
|
||||
'vn.offerTitleHint': 'E.g. “Free cappuccino” or “−15% on the menu”',
|
||||
'vn.forWhom': 'For whom',
|
||||
'vn.howOften': 'How often',
|
||||
'vn.times': 'Times',
|
||||
'vn.offerActive': 'Offer active',
|
||||
'vn.activity': 'Activity',
|
||||
'vn.weeks8': 'last 8 weeks',
|
||||
'vn.checks': 'card checks',
|
||||
'vn.redeemed': 'offers redeemed',
|
||||
'vn.cardCheck': 'card check',
|
||||
'vn.staff': 'Staff',
|
||||
'vn.noStaff': 'Nobody yet.',
|
||||
'vn.role.OWNER': 'owner',
|
||||
'vn.role.STAFF': 'staff',
|
||||
'vn.removeStaff': 'Remove {name} from the venue?',
|
||||
'vn.staffHint': 'Staff are invited by the owner in the work bot (24-hour QR).',
|
||||
'vn.newOwnerLink': 'Owner link',
|
||||
'vn.newOwnerLinkHint': 'A new one-time link — e.g. if the owner changed',
|
||||
'vn.blurb': 'Short offer line (shown to clients)',
|
||||
'vn.blurbHint': 'E.g. “−10% with the club card”',
|
||||
'vn.coords': 'Map point',
|
||||
'vn.activeLabel': 'Visible to clients',
|
||||
'err.LEAD_NOT_CONVERTED': 'To move to “Connected”, use “Connect” — it creates the partner.',
|
||||
'err.ALREADY_CONVERTED': 'The lead is already connected.',
|
||||
'err.AGENCY_CODE_FORMAT': 'Code: Latin letters, digits and “_”, up to 32.',
|
||||
'err.AGENCY_CODE_TAKEN': 'This code is already taken.',
|
||||
'err.STAGES_INVALID': 'You need at least one open and one “Connected” stage.',
|
||||
'audit.bo.crm.create': 'added a lead',
|
||||
'audit.bo.crm.update': 'edited a lead',
|
||||
'audit.bo.crm.move': 'moved a lead',
|
||||
'audit.bo.crm.convert': 'connected a partner',
|
||||
'audit.bo.crm.addActivity': 'logged a contact',
|
||||
'audit.bo.crm.saveStages': 'edited the pipeline',
|
||||
'audit.bo.crm.setBonusRules': 'changed the bonus formula',
|
||||
'audit.bo.partners.saveAgency': 'edited an agency',
|
||||
'audit.bo.partners.agencyPayout': 'recorded an agency payout',
|
||||
'audit.bo.partners.saveVenue': 'edited a venue',
|
||||
'audit.bo.partners.saveOffer': 'edited a venue offer',
|
||||
'audit.bo.partners.ownerInvite': 'issued an owner link',
|
||||
'audit.bo.partners.removeMember': 'removed venue staff',
|
||||
|
||||
// ───── заказы и исполнители (этап 3) ─────
|
||||
'ord.title': 'Orders',
|
||||
'ord.new': 'New order',
|
||||
@@ -1672,6 +2116,228 @@ const hy: Dict = {
|
||||
'chat.details': 'Մանրամասներ',
|
||||
'chat.more': 'Այլ գործողություններ',
|
||||
|
||||
// ───── партнёры и CRM (этап 4) ─────
|
||||
'crm.title': 'CRM',
|
||||
'crm.newLead': 'Նոր լիդ',
|
||||
'crm.editLead': 'Լիդ',
|
||||
'crm.stagesBtn': 'Ձագար',
|
||||
'crm.tab.board': 'Ձագար',
|
||||
'crm.tab.tasks': 'Առաջադրանքներ',
|
||||
'crm.tab.map': 'Քարտեզ',
|
||||
'crm.search': 'Անուն, կոնտակտ, հեռախոս կամ հասցե',
|
||||
'crm.kind.all': 'Բոլորը',
|
||||
'crm.kind.VENUE': 'Հաստատություններ',
|
||||
'crm.kind.AGENCY': 'Գործակալություններ',
|
||||
'crm.kind1.VENUE': 'Հաստատություն',
|
||||
'crm.kind1.AGENCY': 'Գործակալություն',
|
||||
'crm.owner': 'Վաճառող',
|
||||
'crm.allSales': 'Բոլոր վաճառողները',
|
||||
'crm.noOwner': 'Առանց վաճառողի',
|
||||
'crm.ownerIs': 'վարում է {name}',
|
||||
'crm.connected': 'Միացված',
|
||||
'crm.connect': 'Միացում',
|
||||
'crm.days': '{n} օր',
|
||||
'crm.inStage': 'Օրեր այս փուլում',
|
||||
'crm.dropHere': 'Քաշեք այստեղ',
|
||||
'crm.dragHint': 'Քաշեք քարտերը փուլերի միջև։ «Միացված»-ը ստեղծում է գործընկեր կամ գործակալություն։',
|
||||
'crm.overdue': 'ժամկետանց',
|
||||
'crm.tasksOpen': 'Բաց',
|
||||
'crm.tasksDone': 'Կատարված',
|
||||
'crm.addTask': 'Առաջադրանք',
|
||||
'crm.noTasks': 'Բաց առաջադրանքներ չկան։',
|
||||
'crm.noDoneTasks': 'Կատարված առաջադրանքներ դեռ չկան։',
|
||||
'crm.noLead': 'առանց լիդի',
|
||||
'crm.tasksHint': 'Ժամկետին հիշեցում կգա աշխատանքային բոտում։',
|
||||
'crm.taskTitle': 'Ինչ անել',
|
||||
'crm.taskDay': 'Օր',
|
||||
'crm.taskTime': 'Ժամ',
|
||||
'crm.taskHint': 'Հիշեցումը կգա այդ ժամին (Երևան)։',
|
||||
'crm.tp.call': 'Զանգահարել',
|
||||
'crm.tp.meet': 'Հանդիպում',
|
||||
'crm.tp.send': 'Ուղարկել պայմանները',
|
||||
'crm.tp.check': 'Իմանալ որոշումը',
|
||||
'crm.partnerOnMap': 'ակումբի գործընկեր',
|
||||
'crm.legendPartner': 'միացված գործընկերներ',
|
||||
'crm.legendLead': 'լիդեր (փուլի գույն)',
|
||||
'crm.mapHint': 'Կետը հայտնվում է կոորդինատներ ունենալիս։',
|
||||
'crm.name': 'Անվանում',
|
||||
'crm.namePhVenue': 'Օրինակ՝ Lumen Coffee',
|
||||
'crm.namePhAgency': 'Օրինակ՝ Domik Realty',
|
||||
'crm.category': 'Տեսակ',
|
||||
'crm.contactName': 'Կոնտակտային անձ',
|
||||
'crm.contactPh': 'Անուն և պաշտոն',
|
||||
'crm.address': 'Հասցե',
|
||||
'crm.note': 'Նշում',
|
||||
'crm.convert': 'Միացնել',
|
||||
'crm.convertTitle': 'Միացնել «{name}»',
|
||||
'crm.convertVenueHint': 'Կստեղծենք գործընկեր և հղում սեփականատիրոջ համար։',
|
||||
'crm.convertAgencyHint': 'Կստեղծենք գործակալություն կոդով և հղում հաճախորդների համար։',
|
||||
'crm.agencyCode': 'Գործակալության կոդ',
|
||||
'crm.agencyCodeHint': 'Լատինատառ և թվեր',
|
||||
'crm.convertedTitle': 'Միացված է 🎉',
|
||||
'crm.convertedVenue': 'Ուղարկեք այս հղումը սեփականատիրոջը։ Միանգամյա է։',
|
||||
'crm.convertedAgency': 'Այս հղումը գործակալությունը տալիս է հաճախորդներին։',
|
||||
'crm.openVenue': 'Հաստատության քարտ',
|
||||
'crm.openAgency': 'Գործակալության քարտ',
|
||||
'crm.ownerLinked': 'Սեփականատերն արդեն բոտում է։',
|
||||
'crm.ownerNotYet': 'Սեփականատերը դեռ չի բացել հղումը։ Ուղարկեք կրկին՝',
|
||||
'crm.agencyInfo': 'Կոդ {code}, հաճախորդներ՝ {n}',
|
||||
'crm.lostTitle': 'Ինչու՞ հրաժարում',
|
||||
'crm.lostReason': 'Պատճառ',
|
||||
'crm.lr.price': 'Պայմանները չհամապատասխանեցին',
|
||||
'crm.lr.notNow': 'Ոչ հիմա',
|
||||
'crm.lr.noAnswer': 'Չեն պատասխանում',
|
||||
'crm.lr.competitor': 'Աշխատում են մրցակցի հետ',
|
||||
'crm.lostBanner': 'Հրաժարում՝ {reason}',
|
||||
'crm.stagesTitle': 'Ձագարի փուլեր',
|
||||
'crm.stagesHint': 'Հերթականությունը՝ սլաքներով։',
|
||||
'crm.addStage': 'Փուլ',
|
||||
'crm.stageKind.OPEN': 'ընթացքում',
|
||||
'crm.stageKind.WON': 'միացված',
|
||||
'crm.stageKind.LOST': 'հրաժարում',
|
||||
'crm.bonusMonth': 'Բոնուս այս ամիս',
|
||||
'crm.bonusMineSuper': 'Բոնուս (ձեր), ամիս',
|
||||
'crm.bonusNotSet': 'կարգավորված չէ',
|
||||
'crm.bonusVenues': 'Հաստատություններ՝ {n} → {sum}',
|
||||
'crm.bonusAgencies': 'Գործակալություններ՝ {n} → {sum}',
|
||||
'crm.bonusRevenue': '{pct}% եկամուտից → {sum}',
|
||||
'crm.bonusTitle': 'Վաճառողի բոնուսի բանաձև',
|
||||
'crm.bonusHint': 'Բոնուս = հաստատություններ × դրույք + գործակալություններ × դրույք + % եկամուտից։',
|
||||
'crm.bonusPerVenue': 'Հաստատության համար, ֏',
|
||||
'crm.bonusPerAgency': 'Գործակալության համար, ֏',
|
||||
'crm.bonusPct': '% եկամուտից',
|
||||
'crm.bonusMonths': 'Քանի ամիս',
|
||||
'crm.back': 'CRM',
|
||||
'crm.created': '{date}-ից',
|
||||
'crm.stage': 'Փուլ',
|
||||
'crm.history': 'Կոնտակտների պատմություն',
|
||||
'crm.noHistory': 'Դեռ դատարկ է։',
|
||||
'crm.act.CALL': 'Զանգ',
|
||||
'crm.act.MEETING': 'Հանդիպում',
|
||||
'crm.act.NOTE': 'Նշում',
|
||||
'crm.act.FILE': 'Ֆայլ',
|
||||
'crm.act.STAGE': 'Փուլ',
|
||||
'crm.act.WON': 'Միացված',
|
||||
'crm.actPh.CALL': 'Ինչի՞ մասին պայմանավորվեցիք',
|
||||
'crm.actPh.MEETING': 'Ինչպե՞ս անցավ հանդիպումը',
|
||||
'crm.actPh.NOTE': 'Նշում ձեզ և թիմի համար',
|
||||
'crm.addAct': 'Գրանցել',
|
||||
'crm.attach': 'Լուսանկար կամ ֆայլ',
|
||||
'crm.tasks': 'Առաջադրանքներ',
|
||||
'crm.noLeadTasks': 'Առաջադրանքներ չկան։',
|
||||
'crm.contacts': 'Կոնտակտներ',
|
||||
'crm.noCoords': 'Քարտեզում չկա։',
|
||||
'crm.coordsPh': 'Google Maps հղում կամ «40.18, 44.51»',
|
||||
'crm.coordsBad': 'Կոորդինատներ չգտնվեցին։',
|
||||
'crm.remove': 'Ջնջել լիդը',
|
||||
'crm.removeConfirm': 'Ջնջե՞լ լիդը։',
|
||||
'venue.cat.cafe': 'Սրճարան',
|
||||
'venue.cat.restaurant': 'Ռեստորան',
|
||||
'venue.cat.shop': 'Խանութ',
|
||||
'venue.cat.beauty': 'Գեղեցկություն',
|
||||
'venue.cat.other': 'Այլ',
|
||||
'ag.title': 'Գործակալություններ',
|
||||
'ag.add': 'Նոր գործակալություն',
|
||||
'ag.editTitle': 'Գործակալություն',
|
||||
'ag.empty': 'Գործակալություններ դեռ չկան։',
|
||||
'ag.col.name': 'Գործակալություն',
|
||||
'ag.col.clients': 'Հաճախորդներ',
|
||||
'ag.col.gifts': 'Նվերներ',
|
||||
'ag.col.month': 'Պարգև, ամիս',
|
||||
'ag.col.balance': 'Վճարման',
|
||||
'ag.hint': 'Պարգև՝ % վճարված պատվերներից։',
|
||||
'ag.inactive': 'անջատված',
|
||||
'ag.back': 'Բոլոր գործակալությունները',
|
||||
'ag.pct': '{n}% հաճախորդների պատվերներից',
|
||||
'ag.byS': 'միացրել է {name}',
|
||||
'ag.link': 'Հղում հաճախորդների համար',
|
||||
'ag.linkHint': 'Հաճախորդը բացում է բոտը և ստանում նվեր ամիս։ Կամ մուտքագրում է {code} կոդը։',
|
||||
'ag.clients': 'Հաճախորդներ',
|
||||
'ag.giftsN': 'նվերներ՝ {n}',
|
||||
'ag.noClients': 'Հաճախորդներ դեռ չկան։',
|
||||
'ag.orders': 'պատվերներ՝ {n}',
|
||||
'ag.toPay': 'Վճարման ենթակա պարգև',
|
||||
'ag.accrued': 'Հաշվեգրված',
|
||||
'ag.payouts': 'Վճարումներ',
|
||||
'ag.payoutTitle': 'Վճարում գործակալությանը',
|
||||
'ag.balanceHint': 'Չվճարված՝ {sum}',
|
||||
'ag.pctLabel': 'Պարգև, %',
|
||||
'ag.sales': 'Միացրել է',
|
||||
'ag.contactPh': 'Անուն, հեռախոս, Telegram',
|
||||
'ag.active': 'Գործակալությունն աշխատում է',
|
||||
'vn.title': 'Հաստատություններ',
|
||||
'vn.add': 'Նոր հաստատություն',
|
||||
'vn.editTitle': 'Հաստատություն',
|
||||
'vn.empty': 'Հաստատություններ դեռ չկան։',
|
||||
'vn.col.name': 'Հաստատություն',
|
||||
'vn.col.offers': 'Առաջարկներ',
|
||||
'vn.col.staff': 'Աշխատակիցներ',
|
||||
'vn.col.visits': 'Ստուգումներ, 30 օր',
|
||||
'vn.col.last': 'Վերջին ստուգումը',
|
||||
'vn.hint': 'Ստուգում՝ աշխատակիցը սկանավորել է ակումբային քարտը։',
|
||||
'vn.noOwner': 'սեփականատեր չկա',
|
||||
'vn.noOffers': 'առաջարկներ չկան',
|
||||
'vn.back': 'Բոլոր հաստատությունները',
|
||||
'vn.ownerHint': 'Սեփականատերը դեռ միացված չէ՝ ուղարկեք միանգամյա հղում։',
|
||||
'vn.makeLink': 'Ստեղծել հղում',
|
||||
'vn.offers': 'Առաջարկներ ըստ մակարդակի',
|
||||
'vn.addOffer': 'Առաջարկ',
|
||||
'vn.editOffer': 'Առաջարկ',
|
||||
'vn.noOffersHint': 'Ավելացրեք, թե ինչ են ստանում անդամները։',
|
||||
'vn.level.any': 'Ցանկացած անդամ',
|
||||
'vn.level.BAREV_PLUS': 'Barev+ և Elite',
|
||||
'vn.level.ELITE': 'Միայն Elite',
|
||||
'vn.limit.NONE': 'առանց սահմանափակման',
|
||||
'vn.limit.ONCE': 'մեկ անգամ',
|
||||
'vn.limit.WEEK': 'շաբաթական {n} անգամ',
|
||||
'vn.limit.MONTH': 'ամսական {n} անգամ',
|
||||
'vn.limitOpt.NONE': 'Առանց սահմանափակման',
|
||||
'vn.limitOpt.ONCE': 'Միայն առաջին այցը',
|
||||
'vn.limitOpt.WEEK': 'N անգամ շաբաթական',
|
||||
'vn.limitOpt.MONTH': 'N անգամ ամսական',
|
||||
'vn.offerOff': 'անջատված',
|
||||
'vn.offerTitle': 'Ինչ է ստանում հաճախորդը',
|
||||
'vn.offerTitleHint': 'Օրինակ՝ «Կապուչինո նվեր»',
|
||||
'vn.forWhom': 'Ում համար',
|
||||
'vn.howOften': 'Որքան հաճախ',
|
||||
'vn.times': 'Քանի անգամ',
|
||||
'vn.offerActive': 'Առաջարկն ակտիվ է',
|
||||
'vn.activity': 'Ակտիվություն',
|
||||
'vn.weeks8': '8 շաբաթում',
|
||||
'vn.checks': 'քարտի ստուգումներ',
|
||||
'vn.redeemed': 'օգտագործված առաջարկներ',
|
||||
'vn.cardCheck': 'քարտի ստուգում',
|
||||
'vn.staff': 'Աշխատակիցներ',
|
||||
'vn.noStaff': 'Դեռ ոչ ոք։',
|
||||
'vn.role.OWNER': 'սեփականատեր',
|
||||
'vn.role.STAFF': 'աշխատակից',
|
||||
'vn.removeStaff': 'Հեռացնե՞լ {name}-ին։',
|
||||
'vn.staffHint': 'Աշխատակիցներին հրավիրում է սեփականատերը։',
|
||||
'vn.newOwnerLink': 'Հղում սեփականատիրոջը',
|
||||
'vn.newOwnerLinkHint': 'Նոր միանգամյա հղում',
|
||||
'vn.blurb': 'Կարճ նկարագրություն',
|
||||
'vn.blurbHint': 'Օրինակ՝ «−10% ակումբային քարտով»',
|
||||
'vn.coords': 'Քարտեզի կետ',
|
||||
'vn.activeLabel': 'Տեսանելի է հաճախորդներին',
|
||||
'err.LEAD_NOT_CONVERTED': 'Օգտագործեք «Միացնել»։',
|
||||
'err.ALREADY_CONVERTED': 'Լիդն արդեն միացված է։',
|
||||
'err.AGENCY_CODE_FORMAT': 'Կոդ՝ լատինատառ և թվեր։',
|
||||
'err.AGENCY_CODE_TAKEN': 'Այս կոդն արդեն զբաղված է։',
|
||||
'err.STAGES_INVALID': 'Անհրաժեշտ է գոնե մեկ բաց և մեկ «Միացված» փուլ։',
|
||||
'audit.bo.crm.create': 'ավելացրեց լիդ',
|
||||
'audit.bo.crm.update': 'փոխեց լիդը',
|
||||
'audit.bo.crm.move': 'տեղափոխեց լիդը',
|
||||
'audit.bo.crm.convert': 'միացրեց գործընկեր',
|
||||
'audit.bo.crm.addActivity': 'գրանցեց կոնտակտ',
|
||||
'audit.bo.crm.saveStages': 'փոխեց ձագարը',
|
||||
'audit.bo.crm.setBonusRules': 'փոխեց բոնուսի բանաձևը',
|
||||
'audit.bo.partners.saveAgency': 'փոխեց գործակալությունը',
|
||||
'audit.bo.partners.agencyPayout': 'նշեց վճարում գործակալությանը',
|
||||
'audit.bo.partners.saveVenue': 'փոխեց հաստատությունը',
|
||||
'audit.bo.partners.saveOffer': 'փոխեց առաջարկը',
|
||||
'audit.bo.partners.ownerInvite': 'հղում տվեց սեփականատիրոջը',
|
||||
'audit.bo.partners.removeMember': 'հեռացրեց աշխատակցին',
|
||||
|
||||
// ───── заказы и исполнители (этап 3) ─────
|
||||
'ord.title': 'Պատվերներ',
|
||||
'ord.new': 'Նոր պատվեր',
|
||||
|
||||
Reference in new issue
Block a user