'
+ +_CHESS_MGRS.map(function(mgr){
+ var rd=_CHESS_DATA[mgr.id]||{};
+ var curSlot=rd['15:00']||{};
+ var nextSlot=rd['16:00']||{};
+ var statusText=curSlot.client?'С клиентом: '+curSlot.client:'Свободен';
+ var statusColor=curSlot.client?'var(--success)':'var(--muted)';
+ var nextText=nextSlot.client?'→ '+nextSlot.client:'→ Свободен';
+ return '
'
+ +'
'+mgr.short+'
'
+ +'
'
+ +'
'+mgr.name+'
'
+ +'
'+statusText+'
'
+ +'
'
+ +'
'+nextText+'
'
+ +'
';
+ }).join('')
+ +'
🔲 Открыть шахматку →
'
+ +'
';
+
// ── Быстрые действия ──
var quickHtml = '
'
+''
@@ -432,13 +537,14 @@ function _screenHome(){
return '
';
}
@@ -1083,14 +1189,24 @@ function _screenStaff(){
var sub = window._staffSubTab || 'schedule';
var mgrNew = (window._MGR_REQUESTS||[]).filter(function(r){return r.status==='new';}).length;
var shiftNew = (window._SHIFT_REQS||[]).filter(function(r){return r.status==='pending';}).length;
- var chipBar = '
'
+ +_tabs.map(function(t){
+ var act=sub===t.key;
+ return '
'
+ +t.label
+ +(t.badge>0?''+t.badge+'':'')
+ +'
';
+ }).join('')
+'
';
if(sub==='requests') return '
'+chipBar+_screenRequests()+'
';
+ if(sub==='chess') return '
'+chipBar+_screenChess()+'
';
+ if(sub==='monthly') return '
'+chipBar+_screenMonthly()+'
';
var edit = window._staffEditMode;
@@ -1496,6 +1612,142 @@ function _cancelCheck(){
_nav('inventory');
}
+// ── ШАХМАТКА ──────────────────────────────────────────────────────────────────
+function _screenChess(){
+ var typeColor={consult:'#3B82F6',measure:'#8B5CF6',follow:'#059669',tech:'#F59E0B'};
+ var typeLabel={consult:'Консульт.',measure:'Замер',follow:'Повторный',tech:'Тех.вопрос'};
+ var statusBg={free:'transparent',busy:'',done:'',noshow:'rgba(239,68,68,.12)'};
+ var now = 15; // текущий час для демо
+
+ // Текущий час-индикатор
+ var nowIdx = _CHESS_HOURS.indexOf('15:00');
+
+ var CELL_W = 68; // px ширина ячейки
+ var NAME_W = 40; // px ширина имени менеджера
+
+ // Шапка часов
+ var headerRow = '
'
+ +'
Менеджер
'
+ +_CHESS_HOURS.map(function(h,i){
+ var isCur=i===nowIdx;
+ return '
'+h+'
';
+ }).join('')
+ +'
';
+
+ // Строки менеджеров
+ var rows = _CHESS_MGRS.map(function(mgr){
+ var rowData = _CHESS_DATA[mgr.id]||{};
+ return '
'
+ +'
'
+ +'
'+mgr.short+'
'
+ +'
'
+ +_CHESS_HOURS.map(function(h,i){
+ var cell=rowData[h]||{status:'free'};
+ var isCur=i===nowIdx;
+ var bg=cell.status==='done'?'rgba(16,185,129,.1)':cell.status==='busy'?'rgba(59,130,246,.1)':cell.status==='noshow'?'rgba(239,68,68,.1)':'';
+ var brd=cell.status==='done'?'1px solid rgba(16,185,129,.25)':cell.status==='busy'?'1px solid rgba(59,130,246,.25)':cell.status==='noshow'?'1px solid rgba(239,68,68,.2)':'1px solid rgba(0,0,0,.05)';
+ var txt=cell.status==='done'?'var(--success)':cell.status==='busy'?'#1D4ED8':cell.status==='noshow'?'var(--danger)':'var(--muted)';
+ var icon=cell.status==='done'?'✓':cell.status==='noshow'?'✗':cell.status==='busy'?'●':'';
+ return '
'
+ +_CHESS_MGRS.map(function(mgr){
+ var rd=_CHESS_DATA[mgr.id]||{};
+ var total=_CHESS_HOURS.length;
+ var busy=_CHESS_HOURS.filter(function(h){return (rd[h]||{}).client;}).length;
+ var pct=Math.round(busy/total*100);
+ var col=pct>=70?'var(--success)':pct>=40?'var(--warn)':'var(--muted)';
+ return '
'
+ +'
'+mgr.short+'
'
+ +'
'
+ +'
'+pct+'%
'
+ +'
'+busy+'/'+total+'сл
'
+ +'
';
+ }).join('')
+ +'
';
+
+ return '
'
+ +'
'
+ +headerRow+rows
+ +'
'
+ +legend+summary;
+}
+
+// ── ПОМЕСЯЧНЫЕ ИТОГИ ───────────────────────────────────────────────────────────
+function _screenMonthly(){
+ var months=['Май','Апр','Мар'];
+ var per=window._monthlyPeriod||'Май';
+
+ var periodTabs='
'
+ +months.map(function(m){
+ var act=m===per;
+ return '
'+m+'
';
+ }).join('')
+ +'
';
+
+ // Топ-менеджер
+ var sorted=_MONTHLY_STATS.slice().sort(function(a,b){return (b.months[per]||{revenue:0}).revenue-(a.months[per]||{revenue:0}).revenue;});
+ var top=sorted[0];
+
+ var topCard='
';
+
+ var cards=sorted.map(function(mgr,idx){
+ var s=mgr.months[per]||{};
+ var prev=mgr.months[months[1]]||{};
+ var revDelta=s.revenue&&prev.revenue?Math.round((s.revenue-prev.revenue)/prev.revenue*100):0;
+ var convDelta=s.conversion&&prev.conversion?s.conversion-prev.conversion:0;
+ return '