Skip to content

Примеры использования

🏢 Кейсы внедрения

Торговая компания "РосТорг"

Задача: Интеграция 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

Создать лид из звонка on_create record.call_type == 'inbound' and not record.partner_id and record.duration > 30 # Создаем нового лида для неизвестного номера lead_vals = { 'name': f'Лид из звонка {record.caller_number}', 'phone': record.caller_number, 'source_id': env.ref('oduist_pbx.source_phone_call').id, 'user_id': record.user_id.id, 'team_id': env.user.sale_team_id.id, 'description': f'Создан автоматически из звонка длительностью {record.duration} сек.' }

    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
  • Создайте дашборды для разных ролей
  • Используйте когортный анализ для оценки эффективности

Полезные ссылки