diff --git a/public/js/statistics.js b/public/js/statistics.js index 3abdca3..da7891a 100644 --- a/public/js/statistics.js +++ b/public/js/statistics.js @@ -835,28 +835,34 @@ function renderClientLastTicketCard() { }).join('')}`; } +function getTaskCreator(task) { + // Ищем создателя по lifetime: самая ранняя запись с usertype=20 (внешний/клиент). + // lifetime.data отсортирован по убыванию (новые первые), поэтому ищем с конца. + const entries = task.lifetime?.data || []; + // Сначала ищем внешнего пользователя (клиента) + for (let i = entries.length - 1; i >= 0; i--) { + if (entries[i].usertype === 20 && entries[i].username) return entries[i].username; + } + // Fallback: последняя запись (самая ранняя) с любым username + for (let i = entries.length - 1; i >= 0; i--) { + if (entries[i].username) return entries[i].username; + } + return null; +} + function renderClientUsersCard() { const wrap = document.getElementById('stats-client-users-wrap'); if (!wrap) return; - // _clientname — организация (из справочника по clientid) - // clientname — сырое поле API: имя контакта/заявителя когда _clientname задан, - // либо имя организации если clientid не задан - // Собираем: организация → { total, users: { contactName → count } } + // Собираем: организация → { total, users: { creator → count } } const cMap = {}; allData.forEach((item) => { const t = item.task; const org = t._clientname || t.clientname || 'Неизвестно'; - // Контакт: clientname когда есть отдельное _clientname (org), иначе lastComment автор - let contact; - if (t._clientname && t.clientname && t._clientname !== t.clientname) { - contact = t.clientname; - } else { - contact = item.lastComment?.username || t.updatedby || '—'; - } + const creator = getTaskCreator(t) || '—'; if (!cMap[org]) cMap[org] = { total: 0, users: {} }; cMap[org].total++; - cMap[org].users[contact] = (cMap[org].users[contact] || 0) + 1; + cMap[org].users[creator] = (cMap[org].users[creator] || 0) + 1; }); const entries = Object.entries(cMap).sort((a, b) => b[1].total - a[1].total); @@ -866,15 +872,23 @@ function renderClientUsersCard() { wrap.innerHTML = `