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=''
+ +'Помещения '
+ +''
+ +editSvg+(roomsEdit?' Готово':' Изменить')+'
';
+ if(roomsEdit){
+ // Chip selector
+ roomHtml+=''
+ +'
Выберите помещения, в которые идёт мебель:
'
+ +'
';
+ ALL_ROOMS.forEach(function(r){
+ var sel = o.rooms.indexOf(r)>=0;
+ roomHtml+=''+r+' ';
+ });
+ 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() {
+''
+''
- +''+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';