Примеры использования¶
🏢 Кейсы внедрения¶
Торговая компания "РосТорг"¶
Задача: Интеграция call-центра с CRM для увеличения конверсии продаж
Решение: - Автоматическое создание лидов из входящих звонков - Click-to-call для менеджеров по продажам - Интеграция с воронкой продаж
Результат: - ✅ Увеличение конверсии на 35% - ✅ Сокращение времени обработки заявок в 2 раза - ✅ Рост выручки на 28%
IT-компания "ТехноСофт"¶
Задача: Интеграция технической поддержки с системой тикетов
Решение: - Автосоздание тикетов поддержки из звонков - Эскалация сложных вопросов - База знаний для операторов
Результат: - ✅ Время решения проблем сократилось на 40% - ✅ Удовлетворенность клиентов выросла до 95% - ✅ Нагрузка на техподдержку снизилась на 25%
💼 Типовые сценарии¶
Сценарий 1: Обработка входящего звонка¶
```python path=null start=null
Автоматический workflow при входящем звонке¶
def handle_incoming_call(caller_number, called_number): # 1. Поиск клиента в базе partner = env['res.partner'].search([('phone', '=', caller_number)])
# 2. Создание записи о звонке
call_log = env['call.log'].create({
'caller_number': caller_number,
'called_number': called_number,
'partner_id': partner.id if partner else False,
'call_type': 'inbound',
'start_time': datetime.now()
})
# 3. Уведомление менеджера
if partner and partner.user_id:
partner.user_id.notify_info(
message=f'Входящий звонок от {partner.name}',
title='Новый звонок'
)
# 4. Открытие карточки клиента
return {
'type': 'ir.actions.act_window',
'res_model': 'res.partner',
'res_id': partner.id,
'view_mode': 'form'
}
```
Сценарий 2: Click-to-Call из CRM¶
javascript path=null start=null
// JavaScript для Click-to-Call функциональности
odoo.define('oduist_pbx.click_to_call', function (require) {
'use strict';
var AbstractField = require('web.AbstractField');
var fieldRegistry = require('web.field_registry');
var ClickToCallWidget = AbstractField.extend({
template: 'ClickToCallWidget',
events: {
'click .o_click_to_call': '_onCallClick',
},
_onCallClick: function (event) {
event.preventDefault();
var phone = this.value;
this._rpc({
model: 'oduist.pbx',
method: 'initiate_call',
args: [phone],
}).then(function (result) {
if (result.success) {
self.displayNotification({
type: 'success',
message: 'Звонок инициирован'
});
}
});
}
});
fieldRegistry.add('click_to_call', ClickToCallWidget);
});
Сценарий 3: Автоматическое создание лидов¶
```xml path=null start=null
lead = env['crm.lead'].create(lead_vals)
# Связываем звонок с лидом
record.lead_id = lead.id
# Уведомляем менеджера
lead.message_post(
body=f'Создан новый лид из входящего звонка. Длительность: {record.duration} сек.',
subject='Новый лид из звонка'
)
</field>
```
📈 Отчеты и аналитика¶
Пример настройки дашборда¶
python path=null start=null
class CallCenterDashboard(models.Model):
_name = 'call.center.dashboard'
_description = 'Дашборд call-центра'
@api.model
def get_dashboard_data(self):
today = fields.Date.today()
# Статистика за сегодня
calls_today = self.env['call.log'].search_count([
('date', '=', today)
])
answered_calls = self.env['call.log'].search_count([
('date', '=', today),
('answered', '=', True)
])
# Конверсия в лиды
leads_from_calls = self.env['crm.lead'].search_count([
('create_date', '>=', today),
('source_id', '=', self.env.ref('oduist_pbx.source_phone_call').id)
])
return {
'calls_today': calls_today,
'answer_rate': (answered_calls / calls_today * 100) if calls_today else 0,
'leads_created': leads_from_calls,
'conversion_rate': (leads_from_calls / calls_today * 100) if calls_today else 0
}
Настройка KPI метрик¶
```python path=null start=null
Модель для хранения KPI метрик¶
class CallKPI(models.Model): _name = 'call.kpi' _description = 'KPI телефонии' _rec_name = 'user_id'
user_id = fields.Many2one('res.users', 'Менеджер', required=True)
date = fields.Date('Дата', required=True, default=fields.Date.today)
# Метрики звонков
total_calls = fields.Integer('Всего звонков')
outbound_calls = fields.Integer('Исходящие')
inbound_calls = fields.Integer('Входящие')
missed_calls = fields.Integer('Пропущенные')
# Временные метрики
total_talk_time = fields.Float('Время разговоров (мин)')
avg_call_duration = fields.Float('Средняя длительность')
# Бизнес-метрики
leads_created = fields.Integer('Создано лидов')
opportunities_won = fields.Integer('Выиграно сделок')
revenue_generated = fields.Monetary('Выручка')
# Автоматический расчет метрик
@api.model
def calculate_daily_kpi(self):
users = self.env['res.users'].search([('active', '=', True)])
today = fields.Date.today()
for user in users:
# Получаем данные о звонках пользователя
user_calls = self.env['call.log'].search([
('user_id', '=', user.id),
('date', '=', today)
])
# Рассчитываем метрики
kpi_vals = {
'user_id': user.id,
'date': today,
'total_calls': len(user_calls),
'outbound_calls': len(user_calls.filtered(lambda c: c.call_type == 'outbound')),
'inbound_calls': len(user_calls.filtered(lambda c: c.call_type == 'inbound')),
'missed_calls': len(user_calls.filtered(lambda c: not c.answered)),
'total_talk_time': sum(user_calls.mapped('duration')) / 60,
'avg_call_duration': sum(user_calls.mapped('duration')) / len(user_calls) if user_calls else 0
}
# Создаем или обновляем запись KPI
existing_kpi = self.search([
('user_id', '=', user.id),
('date', '=', today)
])
if existing_kpi:
existing_kpi.write(kpi_vals)
else:
self.create(kpi_vals)
```
🎯 Best Practices¶
Настройка уведомлений¶
- Настройте push-уведомления для важных звонков
- Используйте email-алерты для пропущенных звонков VIP-клиентов
- Интегрируйте с Telegram/Slack для командных уведомлений
Автоматизация рабочих процессов¶
- Создавайте задачи автоматически по итогам звонков
- Настройте эскалацию для критических ситуаций
- Используйте теги для категоризации звонков
Аналитика и отчетность¶
- Настройте регулярные отчеты по KPI
- Создайте дашборды для разных ролей
- Используйте когортный анализ для оценки эффективности
Полезные ссылки