fix(analytics): funnel shows real order path with bypass detection
This commit is contained in:
parent
a695a73af7
commit
14a3006918
|
|
@ -185,16 +185,20 @@ export const AdminDashboard = () => {
|
|||
total: d.total || 0, delivered: d.delivered || 0, picked_up: d.picked_up || 0, problems: d.problems || 0,
|
||||
}));
|
||||
|
||||
// ── Funnel: Real order path ────────────────────────────────────────────────
|
||||
// Each step shows how many orders reached that stage
|
||||
// ── Funnel: Real order path with bypass detection ─────────────────────────
|
||||
const completedTotal = (econ.full_chain_client || 0) + (econ.client_date_no_driver || 0)
|
||||
+ (econ.manager_date_completed || 0) + (econ.no_date_completed || 0) + (econ.no_sms_completed || 0);
|
||||
|
||||
const funnelSteps = [
|
||||
{ label: 'Всего заказов', value: econ.total_groups || 0, color: '#94a3b8' },
|
||||
{ label: 'SMS отправлено', value: econ.sms_sent || 0, color: '#3b82f6' },
|
||||
{ label: 'Авто-завершено', value: econ.completed_auto || 0, color: '#22c55e' },
|
||||
{ label: 'Завершено вручную', value: econ.completed_manual || 0, color: '#14b8a6' },
|
||||
{ label: 'Полная цепочка', value: econ.full_chain_client || 0, color: '#22c55e' },
|
||||
{ label: 'Клиент выбрал дату', value: econ.client_date_no_driver || 0, color: '#14b8a6' },
|
||||
{ label: 'Менеджер назначил дату', value: econ.manager_date_completed || 0, color: '#8b5cf6' },
|
||||
{ label: 'В обход (по телефону)', value: econ.no_date_completed || 0, color: '#f97316' },
|
||||
{ label: 'Без SMS (импорт)', value: econ.no_sms_completed || 0, color: '#6366f1' },
|
||||
{ label: 'Застряло в ручном', value: econ.stuck_in_manual || 0, color: '#eab308' },
|
||||
{ label: 'Без SMS завершено', value: econ.no_sms_completed || 0, color: '#6366f1' },
|
||||
{ label: 'Платное хранение', value: econ.paid_storage_count || 0, color: '#06b6d4' },
|
||||
{ label: 'В работе', value: econ.in_progress || 0, color: '#3b82f6' },
|
||||
{ label: 'Отменено', value: econ.cancelled_count || 0, color: '#ef4444' },
|
||||
];
|
||||
|
||||
|
|
@ -357,16 +361,16 @@ export const AdminDashboard = () => {
|
|||
marginTop: '0.75rem', paddingTop: '0.6rem', borderTop: '1px solid var(--color-border)',
|
||||
}}>
|
||||
<div style={{ textAlign: 'center' }}>
|
||||
<div style={{ fontSize: fontSize.xs, color: '#22c55e', marginBottom: '1px' }}>Автоматизация</div>
|
||||
<div style={{ fontSize: mobile ? '0.95rem' : '1.1rem', fontWeight: 700, color: '#22c55e' }}>{econ.automation_pct ?? 0}%</div>
|
||||
<div style={{ fontSize: fontSize.xs, color: '#22c55e', marginBottom: '1px' }}>Полная цепочка</div>
|
||||
<div style={{ fontSize: mobile ? '0.95rem' : '1.1rem', fontWeight: 700, color: '#22c55e' }}>{econ.full_chain_pct ?? 0}%</div>
|
||||
</div>
|
||||
<div style={{ textAlign: 'center' }}>
|
||||
<div style={{ fontSize: fontSize.xs, color: '#ef4444', marginBottom: '1px' }}>Ручное вмешательство</div>
|
||||
<div style={{ fontSize: mobile ? '0.95rem' : '1.1rem', fontWeight: 700, color: '#ef4444' }}>{econ.manual_intervention_pct ?? 0}%</div>
|
||||
<div style={{ fontSize: fontSize.xs, color: '#f97316', marginBottom: '1px' }}>В обход</div>
|
||||
<div style={{ fontSize: mobile ? '0.95rem' : '1.1rem', fontWeight: 700, color: '#f97316' }}>{econ.bypassed_pct ?? 0}%</div>
|
||||
</div>
|
||||
<div style={{ textAlign: 'center', display: mobile ? 'none' : 'block' }}>
|
||||
<div style={{ fontSize: fontSize.xs, color: 'var(--color-text-muted)', marginBottom: '1px' }}>Завершено всего</div>
|
||||
<div style={{ fontSize: mobile ? '0.95rem' : '1.1rem', fontWeight: 700, color: 'var(--color-text)' }}>{(econ.completed_auto || 0) + (econ.completed_manual || 0) + (econ.no_sms_completed || 0)}</div>
|
||||
<div style={{ fontSize: fontSize.xs, color: 'var(--color-text-muted)', marginBottom: '1px' }}>Завершено</div>
|
||||
<div style={{ fontSize: mobile ? '0.95rem' : '1.1rem', fontWeight: 700, color: 'var(--color-text)' }}>{completedTotal}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
Loading…
Reference in New Issue