feat(manager): client_chosen status — accept/reject client tech choice

This commit is contained in:
wasrusgen 2026-05-28 15:22:02 +03:00
parent bf2ca464f8
commit 3cefe883ca

View File

@ -251,7 +251,7 @@ window._managerOrders = window._managerOrders || [
tech:[
{name:'Духовой шкаф', wkey:'oven', status:'wait', dims:'', brand:'', source:null},
{name:'Варочная панель', wkey:'cooktop', status:'done', dims:'60×52 см', brand:'Bosch', model:'HXA050B20R', source:'ai'},
{name:'Вытяжка', wkey:'hood', status:'waiting_client', dims:'', brand:'', source:'client'},
{name:'Вытяжка', wkey:'hood', status:'client_chosen', dims:'60 см', brand:'Elica', model:'FLAT GLASS IX/A/60', source:'client'},
{name:'Посудомойка', wkey:'dishwasher', status:'wait', dims:'', brand:'', source:null},
{name:'Холодильник', wkey:'fridge', status:'wait', dims:'', brand:'', source:null},
],
@ -2234,9 +2234,9 @@ function screenOrder() {
// Tech section (kitchen only)
var techHtml='';
if(isKitchen && o.tech.length){
var dc2=o.tech.filter(function(t){return t.status==='done'||t.status==='waiting_client';}).length;
var dc2=o.tech.filter(function(t){return t.status==='done'||t.status==='client_chosen'||t.status==='waiting_client';}).length;
var items=o.tech.map(function(t){
var iconBox='<div class="tech-icon-box '+(t.status==='done'?'done':t.status==='waiting_client'?'client':'wait')+'">'
var iconBox='<div class="tech-icon-box '+(t.status==='done'?'done':(t.status==='waiting_client'||t.status==='client_chosen')?'client':'wait')+'">'
+_techIcon(t.wkey,22)+'</div>';
var sourceLabel = t.source==='own'?'Своя техника'
@ -2277,6 +2277,24 @@ function screenOrder() {
+'<button onclick="_techClientRemind(\''+t.wkey+'\')" class="btn-pill accent">Напомнить</button>'
+'</div>';
}
// client_chosen — клиент выбрал, ждёт подтверждения менеджера
if(t.status==='client_chosen'){
var cDetail=(t.brand||'')+(t.model?' '+t.model:'')+(t.dims?' · '+t.dims:'');
return '<div class="tech-item" style="flex-wrap:wrap;padding-bottom:10px">'
+'<div style="display:flex;gap:10px;width:100%;align-items:flex-start">'
+iconBox
+'<div style="flex:1">'+nameRow
+'<div style="font-size:12px;color:#059669;font-weight:600;margin-top:3px">👤 Клиент выбрал</div>'
+'<div style="font-size:13px;font-weight:700;color:var(--ink);margin-top:1px">'+cDetail+'</div>'
+'</div></div>'
+'<div style="width:100%;margin-top:9px;padding:10px 12px;background:#F0FDF4;border:1.5px solid #86EFAC;border-radius:10px">'
+'<div style="font-size:11px;font-weight:700;color:#15803D;margin-bottom:7px;text-transform:uppercase;letter-spacing:.04em">Подтвердить выбор клиента?</div>'
+'<div style="display:flex;gap:7px">'
+'<button onclick="_acceptClientChoice(\''+oi+'\',\''+t.wkey+'\')" style="flex:1;padding:8px;border-radius:9px;border:none;background:#16A34A;color:#fff;font-size:13px;font-weight:700;cursor:pointer">✅ Принять</button>'
+'<button onclick="_rejectClientChoice(\''+oi+'\',\''+t.wkey+'\')" style="flex:1;padding:8px;border-radius:9px;border:1.5px solid #DC2626;background:transparent;color:#DC2626;font-size:13px;font-weight:700;cursor:pointer">↩ Переспросить</button>'
+'</div></div>'
+'</div>';
}
// done
var detail=(t.brand||'')+(t.model?' '+t.model:'')+(t.dims?'<br><span style="font-size:10px;color:var(--muted)">'+t.dims+'</span>':'');
return '<div class="tech-item">'
@ -2288,8 +2306,10 @@ function screenOrder() {
+'</div>';
}).join('');
var waitCount = o.tech.filter(function(t){return t.status==='wait';}).length;
var clientChosenCount = o.tech.filter(function(t){return t.status==='client_chosen';}).length;
var clientCount = o.tech.filter(function(t){return t.status==='waiting_client';}).length;
var allFilled = waitCount===0;
// allFilled: все должны быть done (client_chosen ≠ done — надо подтвердить)
var allFilled = waitCount===0 && clientChosenCount===0 && clientCount===0;
var confirmed = !!o.techConfirmed;
// Bottom of tech card: confirm CTA or confirmed status
@ -2306,9 +2326,12 @@ function screenOrder() {
+'<div style="font-size:11px;color:var(--muted);text-align:center;margin-top:7px">Технолог получит спецификацию и сможет согласовать проект</div>'
+'</div>';
} else {
techFooter='<div style="margin-top:10px;padding:10px 12px;background:#FFFBEB;border-radius:10px;display:flex;align-items:center;gap:8px">'
+'<div style="font-size:15px"></div>'
+'<div style="font-size:12px;color:#92400E">Заполните все позиции — технолог не может работать без параметров техники</div>'
var pendingMsg = clientChosenCount>0
? 'Клиент выбрал технику — подтвердите выбор выше, затем передайте технологу'
: 'Заполните все позиции — технолог не может работать без параметров техники';
techFooter='<div style="margin-top:10px;padding:10px 12px;background:'+(clientChosenCount>0?'#F0FDF4':'#FFFBEB')+';border-radius:10px;display:flex;align-items:center;gap:8px">'
+'<div style="font-size:15px">'+(clientChosenCount>0?'👆':'⏳')+'</div>'
+'<div style="font-size:12px;color:'+(clientChosenCount>0?'#166534':'#92400E')+'">'+pendingMsg+'</div>'
+'</div>';
}
@ -2944,6 +2967,20 @@ function _startClientPick(key){
function _techClientRemind(key){
_toast('📲 Напоминание отправлено в TG-кабинет клиента','var(--accent)');
}
function _acceptClientChoice(oi,key){
var o=window._managerOrders[oi];
var t=o.tech.filter(function(x){return x.wkey===key;})[0];
if(t){t.status='done';}
_toast('✅ Выбор принят и зафиксирован','var(--success)');
document.getElementById('screen').innerHTML=renderScreen('manager_order');
}
function _rejectClientChoice(oi,key){
var o=window._managerOrders[oi];
var t=o.tech.filter(function(x){return x.wkey===key;})[0];
if(t){t.status='waiting_client'; t.brand=''; t.model=''; t.dims='';}
_toast('↩ Клиенту отправлена просьба выбрать снова','var(--warn)');
document.getElementById('screen').innerHTML=renderScreen('manager_order');
}
function screenTechClient(){
var key=window._clientPickKey||'oven';
var tt=TECH_TYPES.filter(function(t){return t.key===key;})[0]||{key:key,label:key};