diff --git a/docs/mockup_manager.html b/docs/mockup_manager.html index f835835..2acdc2e 100644 --- a/docs/mockup_manager.html +++ b/docs/mockup_manager.html @@ -256,7 +256,9 @@ window._managerOrders = window._managerOrders || [ {name:'Холодильник', wkey:'fridge', status:'wait', dims:'', brand:'', source:null}, ], techNote:'Ждём габариты духовки и посудомойки. Передано клиенту 10.05.', - blocker:'Техника: ждём 2 позиции' }, + blocker:'Техника: ждём 2 позиции', + zovContract:'ЗОВ-25-041', + zovStatus:{code:'production',label:'В производстве',detail:'Корпуса готовы. Фасады в работе.',date:'27.05.2026 · 14:33',pct:45} }, { id:2,client:'Петров В.Н.',phone:'+7 903 211-44-55', type:'wardrobe',label:'Шкаф-купе · Пр. Мира 7, кв.18', stage:4,contract:'МБ-2025-038',amount:94000,advance:47000, @@ -265,7 +267,9 @@ window._managerOrders = window._managerOrders || [ {label:'Аванс 1 · 50% при подписании',amount:47000,paid:true,date:'18.04.2025'}, {label:'Аванс 2 · при готовности к отгрузке',amount:47000,paid:false,date:null}, ], - rooms:['Спальня'],tech:[],techNote:'',blocker:'Технолог: есть замечания' }, + rooms:['Спальня'],tech:[],techNote:'',blocker:'Технолог: есть замечания', + zovContract:'ЗОВ-25-038', + zovStatus:{code:'ready',label:'Готов к отгрузке',detail:'Все позиции готовы. Дата доставки уточняется.',date:'26.05.2026 · 09:15',pct:90} }, { id:3,client:'Сидорова М.К.',phone:'+7 916 888-22-11', type:'kitchen',label:'Кухня · Ул. Садовая 5, кв.3', stage:5,contract:'МБ-2025-029',amount:212000,advance:106000, @@ -274,9 +278,12 @@ window._managerOrders = window._managerOrders || [ {label:'Аванс 1 · 50% при подписании',amount:106000,paid:true,date:'10.03.2025'}, {label:'Аванс 2 · при готовности к отгрузке',amount:106000,paid:true,date:'08.05.2025'}, ], - rooms:['Кухня','Балкон'],tech:[],techNote:'',blocker:null }, + rooms:['Кухня','Балкон'],tech:[],techNote:'',blocker:null, + zovContract:'ЗОВ-25-029', + zovStatus:{code:'shipped',label:'Отгружен',detail:'Доставлен 09.05.2026. Договор закрыт.',date:'09.05.2026 · 11:20',pct:100} }, ]; window._activeOrder = window._activeOrder || 0; +window._roomsEditing = false; window._wiz = window._wiz || {type:null,step:0,answers:{},budget:null}; window._schedDay = window._schedDay || 3; window._schedView = window._schedView || 'month'; @@ -1077,7 +1084,11 @@ function _convertToOrder(oi) { ]; o.tech = []; o.blocker = null; + o.rooms = []; + o.zovContract = ''; + o.zovStatus = null; window._activeOrder = oi; + window._roomsEditing = true; document.getElementById('screen').innerHTML=renderScreen('manager_order'); document.getElementById('nav').innerHTML=navBar(); _toast('✅ Лид переведён в заказ '+o.contract,'var(--success)'); @@ -2309,15 +2320,101 @@ function screenOrder() { } // Rooms - var roomHtml='
Помещения
' - +o.rooms.map(function(r){ - return '
' - +'🏠 '+r+'' - +'✓ Замер получен
'; - }).join('')+'
'; + var oi = window._activeOrder; + var ALL_ROOMS=['Кухня','Гостиная','Спальня','Детская','Кабинет','Прихожая','Ванная','Балкон','Гардеробная','Столовая']; + var roomsEdit = window._roomsEditing; + var editSvg=''; + var roomHtml='
' + +'Помещения' + +'
'; + if(roomsEdit){ + // Chip selector + roomHtml+='
' + +'
Выберите помещения, в которые идёт мебель:
' + +'
'; + ALL_ROOMS.forEach(function(r){ + var sel = o.rooms.indexOf(r)>=0; + roomHtml+=''; + }); + roomHtml+='
'; + if(o.rooms.length){ + roomHtml+='
Выбрано: '+o.rooms.join(', ')+'
'; + } + roomHtml+='
'; + } else if(o.rooms.length){ + roomHtml+='
' + +o.rooms.map(function(r){ + return '
' + +'🏠 '+r+'' + +'✓ Замер
'; + }).join('')+'
'; + } else { + roomHtml+='
' + +'
🏠
' + +'
Помещения не указаны
' + +'
Нажмите «Изменить» чтобы добавить
' + +'
'; + } + + // ── ЗОВ — статус производства ──────────────────────────────────────────── + var zovInfo = o.zovStatus ? _zovStatusInfo(o.zovStatus.code) : null; + var zovContractVal = o.zovContract || ''; + var zovHtml = '
Производство ЗОВ
' + +'
' + // ZOV contract number field + +'
' + +'
Номер договора ЗОВ
' + +'
' + +'' + +'' + +'
' + +'
'; + if(zovInfo && o.zovStatus){ + var zst = o.zovStatus; + var zpct = zst.pct || 0; + zovHtml += '
' + +'
' + +''+zovInfo.icon+'' + +'
' + +'
'+zst.label+'
' + +'
'+zst.date+'
' + +'
' + +''+zpct+'%' + +'
' + // progress bar + +'
' + +'
' + +'
' + +'
'+zst.detail+'
' + +'
'; + // Pipeline steps for factory + var zSteps=[{c:'accepted',l:'Принят'},{c:'production',l:'Произв-во'},{c:'assembly',l:'Сборка'},{c:'ready',l:'Готов'},{c:'shipped',l:'Отгружен'}]; + var zCodes=['accepted','production','assembly','ready','shipped']; + var zCurIdx = zCodes.indexOf(zst.code); + zovHtml += '
'; + zSteps.forEach(function(zs,zi){ + var isDone = zi < zCurIdx; + var isAct = zi === zCurIdx; + var dotC = isDone?'#10B981':isAct?zovInfo.color:'#CBD5E1'; + var dotBg = isDone?'#DCFCE7':isAct?zovInfo.bg:'var(--card)'; + var dotTxt = isDone?'✓':(zi+1).toString(); + if(zi>0) zovHtml+='
'; + zovHtml+='
' + +'
'+dotTxt+'
' + +'
'+zs.l+'
' + +'
'; + }); + zovHtml += '
'; + } else { + zovHtml += '
' + +(zovContractVal?'Нажмите «Статус» чтобы загрузить данные из zovofficial.com':'Введите номер договора ЗОВ из программы фабрики') + +'
'; + } + zovHtml += '
'; // ── Расчёты (встроены в карточку) ───────────────────────────────────────── - var oi = window._activeOrder; var advances = o.advances || [{label:'Аванс',amount:o.advance||0,paid:true,date:null}]; var paidSum = advances.reduce(function(s,a){return s+(a.paid?a.amount:0);},0); var remaining= o.amount - paidSum; @@ -2390,7 +2487,7 @@ function screenOrder() { +'' +'
' +'
'+pip+'
' - +'
'+blk+techHtml+roomHtml+contHtml+'
' + +'
'+blk+techHtml+roomHtml+zovHtml+contHtml+'
' +''; } function _startTech(){window._wizFromNav=false;window._wizScreen='manager_order';window._techSelection=window._techSelection||[];document.getElementById('screen').innerHTML=renderScreen('manager_tech');} @@ -2416,6 +2513,57 @@ function _confirmTech(){ },1000); } +// ── ZOV Factory helpers ─────────────────────────────────────────────────────── +function _zovStatusInfo(code){ + var map={ + 'accepted': {color:'#2563EB',bg:'#EFF6FF', icon:'📋'}, + 'production':{color:'#D97706',bg:'#FFFBEB', icon:'⚙️'}, + 'assembly': {color:'#7C3AED',bg:'#F5F3FF', icon:'🔧'}, + 'ready': {color:'#059669',bg:'#F0FDF4', icon:'✅'}, + 'shipped': {color:'#0F766E',bg:'#F0FDFA', icon:'🚚'} + }; + return map[code]||{color:'#8A94A6',bg:'#F9FAFB',icon:'❓'}; +} +function _updateZovContract(oi,val){ + window._managerOrders[oi].zovContract=val; + var inp=document.getElementById('inp_zov_'+oi); + if(inp) inp.style.borderColor=val?'var(--accent)':'#E2E8F0'; +} +function _refreshZovStatus(oi){ + var o=window._managerOrders[oi]; + if(!o.zovContract){_toast('Введите номер договора ЗОВ','var(--warn)');return;} + _toast('🔄 Запрашиваю статус с zovofficial.com…','var(--accent)'); + setTimeout(function(){ + var codes=['accepted','production','assembly','ready','shipped']; + var curr=o.zovStatus?codes.indexOf(o.zovStatus.code):-1; + var next=codes[Math.min(curr+1,codes.length-1)]; + var info=_zovStatusInfo(next); + var pcts={accepted:10,production:45,assembly:70,ready:90,shipped:100}; + var details={ + accepted:'Заявка принята фабрикой. Производство запланировано.', + production:'Корпуса готовы. Фасады и столешница в работе.', + assembly:'Все комплектующие готовы. Идёт финальная сборка.', + ready:'Готов к отгрузке. Согласуйте дату доставки.', + shipped:'Отгружен. Транспорт в пути.' + }; + var now=new Date(); + var d=String(now.getDate()).padStart(2,'0')+'.'+String(now.getMonth()+1).padStart(2,'0')+'.'+now.getFullYear(); + var t=String(now.getHours()).padStart(2,'0')+':'+String(now.getMinutes()).padStart(2,'0'); + o.zovStatus={code:next,label:info.icon+' '+['Принят','В производстве','Сборка','Готов к отгрузке','Отгружен'][codes.indexOf(next)],detail:details[next],date:d+' · '+t,pct:pcts[next]||0}; + _toast('✅ Статус обновлён','var(--success)'); + document.getElementById('screen').innerHTML=renderScreen('manager_order'); + },1400); +} + +// ── Rooms helpers ───────────────────────────────────────────────────────────── +function _toggleRoom(oi,room){ + var o=window._managerOrders[oi]; + var idx=o.rooms.indexOf(room); + if(idx>=0) o.rooms.splice(idx,1); + else o.rooms.push(room); + document.getElementById('screen').innerHTML=renderScreen('manager_order'); +} + function _startOwnTech(key){ window._ownTechKey = key; window._ownTechMode = 'choose';