diff --git a/docs/mockup_commercial.html b/docs/mockup_commercial.html index 65804b3..ea28a2d 100644 --- a/docs/mockup_commercial.html +++ b/docs/mockup_commercial.html @@ -460,16 +460,37 @@ function _sOrders(){ +''; } +// ─── ВЕРТИКАЛЬ: КД → АДМИНИСТРАТОР → МЕНЕДЖЕРЫ ───────────────────── +// Единый источник истины — отражает обе стороны (КД и Администратор) +var _HIERARCHY=[ + { + salonId:'lenina', salon:'Салон Ленина', color:'#3B82F6', + admin:{name:'Анна М.', short:'АМ'}, + orders:27, ordersPlan:30, revenue:1537000, revenuePlan:1700000, + overdue:1, overdueRisk:98500, purchases:2, newLeads:14, status:'warn', + managers:[ + {id:'ak', name:'Анна К.', short:'АК', color:'#7C3AED', visits:42, deals:14, revenue:847000, conversion:33, avg:60500, rating:4.8, active:true}, + {id:'ms', name:'Мария С.', short:'МС', color:'#0891B2', visits:35, deals:9, revenue:610000, conversion:26, avg:67800, rating:4.5, active:true}, + ] + }, + { + salonId:'pobedy', salon:'Салон Победы', color:'#8B5CF6', + admin:{name:'Ирина С.', short:'ИС'}, + orders:20, ordersPlan:22, revenue:1310000, revenuePlan:1500000, + overdue:1, overdueRisk:113000, purchases:1, newLeads:12, status:'warn', + managers:[ + {id:'pv', name:'Пётр В.', short:'ПВ', color:'#059669', visits:28, deals:7, revenue:490000, conversion:25, avg:70000, rating:4.3, active:true}, + {id:'iv', name:'Иван В.', short:'ИВ', color:'#D97706', visits:31, deals:8, revenue:530000, conversion:26, avg:66250, rating:4.1, active:false}, + ] + }, +]; +window._mgrExpSalon = window._mgrExpSalon || null; + // ─── МЕНЕДЖЕРЫ ────────────────────────────────────────────────────── function _sManagers(){ - var admins=[ - {name:'Анна М.', salon:'Салон Ленина', role:'Администратор', - orders:27, ordersPlan:30, revenue:1537000, revenuePlan:1700000, - overdue:1, overdueRisk:98500, purchases:2, managers:2, newLeads:14, status:'warn'}, - {name:'Ирина С.', salon:'Салон Победы', role:'Администратор', - orders:20, ordersPlan:22, revenue:1310000, revenuePlan:1500000, - overdue:1, overdueRisk:113000, purchases:1, managers:1, newLeads:12, status:'warn'}, - ]; + var admins=_HIERARCHY.map(function(h){ + return Object.assign({role:'Администратор'}, h); + }); var sc={ok:'var(--success)',bad:'var(--danger)',warn:'var(--warn)'}; var bg={ok:'#F0FDF4',bad:'#FEF2F2',warn:'#FFFBEB'}; var totOrders =admins.reduce(function(s,a){return s+a.orders;},0); @@ -501,22 +522,34 @@ function _sManagers(){ +'' : '') - +'
Администраторы салонов
' + +'
Администраторы → Менеджеры
' +'
' +admins.map(function(a){ var ordPct =Math.round(a.orders/a.ordersPlan*100); var revPctA=Math.round(a.revenue/a.revenuePlan*100); var sColor =sc[a.status]; - return '
' + var isExp = window._mgrExpSalon===a.salonId; + var mgrRevTotal=a.managers.reduce(function(s,m){return s+m.revenue;},0); + return '
' + // ── Заголовок администратора ── + +'
' +'
' - + '
'+a.name+'
' - + '
'+a.role+' · '+a.salon+'
' + + '
' + + '
' + + '
'+a.admin.short+'
' + + '
' + + '
'+a.admin.name+'
' + + '
'+a.role+' · '+a.salon+'
' + + '
' + + '
' + + '
' + '
' + (a.status==='ok'?'✓ Норма':a.status==='warn'?'⚠ Внимание':'✕ Проблема') + '
' +'
' + // ── KPI салона ── +'
' + '
' + '
'+a.orders+'
' @@ -531,20 +564,60 @@ function _sManagers(){ + '
' + '
'+a.newLeads+'
' + '
лидов
' - + '
'+a.managers+' менедж.
' + + '
'+a.managers.length+' менедж.
' + '
' +'
' +(a.overdue>0||a.purchases>0 - ? '
' + ? '
' +(a.overdue>0?'
' - +'⚠️' - +'Просрочено: '+a.overdue+' · риск '+Math.round(a.overdueRisk/1000)+' тыс ₽
':'') + +'' + +'Просрочено: '+a.overdue+' · риск '+Math.round(a.overdueRisk/1000)+' тыс
':'') +(a.purchases>0?'
' +'📋' +'Закупки: '+a.purchases+' заявки
':'') +'
' - : '
✅ Всё в норме
') + : '') + + // ── Кнопка раскрыть менеджеров ── + +'
' + + ''+a.managers.length+' менеджера · '+Math.round(mgrRevTotal/1000)+' тыс ₽ выручка' + + ''+(isExp?'▲':'▼')+'' + +'
' + + +'
' + + // ── Раскрытые менеджеры ── + +(isExp + ? '
' + +'
Менеджеры · '+a.salon+'
' + +a.managers.map(function(m,mi){ + return '
' + // Аватар + +'
'+m.short+'
' + +'
' + + '
' + + ''+m.name+'' + + (m.active?'online':'offline') + + '
' + + '
' + + 'Визиты: '+m.visits+'' + + 'Сделки: '+m.deals+'' + + 'Конверсия: '+m.conversion+'%' + + '
' + +'
' + +'
' + + '
'+Math.round(m.revenue/1000)+' тыс
' + + '
' + + '' + + ''+m.rating+'' + + '
' + +'
' + +'
'; + }).join('') + +'
' + : '') +'
'; }).join('')