Passed
Push — develop ( d5179e...bede24 )
by Портнов
05:56 queued 11s
created

InsertDataToDB   A

Complexity

Total Complexity 18

Size/Duplication

Total Lines 101
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 18
eloc 49
c 1
b 0
f 0
dl 0
loc 101
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A isOriginateDial() 0 2 3
A processingOriginateData() 0 30 5
A fillCdrData() 0 15 6
A execute() 0 29 4
1
<?php
2
3
4
namespace MikoPBX\Core\Workers\Libs\WorkerCallEvents;
5
6
7
use MikoPBX\Common\Models\CallDetailRecordsTmp;
8
use MikoPBX\Core\System\Util;
9
10
class InsertDataToDB {
11
12
    public static function execute($data):void
13
    {
14
        if (empty($data['UNIQUEID'])) {
15
            Util::sysLogMsg(__FUNCTION__, 'UNIQUEID is empty ' . json_encode($data), LOG_DEBUG);
16
            return;
17
        }
18
19
        $is_new = false;
20
        /** @var CallDetailRecordsTmp $m_data */
21
        $m_data = CallDetailRecordsTmp::findFirst(
22
            [
23
                "UNIQUEID=:id: AND linkedid=:linkedid:",
24
                'bind' => [
25
                    'id'       => $data['UNIQUEID'],
26
                    'linkedid' => $data['linkedid']
27
                ],
28
            ]
29
        );
30
        if ($m_data === null) {
31
            // Создаем новую строку истории.
32
            $m_data = new CallDetailRecordsTmp();
33
            $is_new = true;
34
        } elseif (self::isOriginateDial($data)) {
35
            self::processingOriginateData($data, $m_data);
36
            // Дальнейшая обработка не требуется.
37
            return;
38
        }
39
40
        self::fillCdrData($m_data, $data, $is_new);
41
    }
42
43
    /**
44
     * Обработка данных Originate. При Dial этот пакет может прийти дважды.
45
     * @param $data
46
     * @param $m_data
47
     */
48
    private static function processingOriginateData($data, $m_data):void
49
    {
50
        if (empty($m_data->endtime)) {
51
            // Если это оригинация dial может прийти дважды.
52
            if(!empty($m_data->src_num) && $m_data->src_num === $data['dst_num']){
53
                $m_data->dst_num = $data['src_num'];
54
                $m_data->save();
55
            }
56
        }else{
57
            // Предыдущие звонки завершены. Текущий вызов новый, к примеру через резервного провайдера.
58
            // Меняем идентификатор предыдущих звонков.
59
            $m_data->UNIQUEID .= Util::generateRandomString(5);
60
            // Чистим путь к файлу записи.
61
            $m_data->recordingfile = "";
62
            $m_data->save();
63
64
            $new_m_data               = new CallDetailRecordsTmp();
65
            $new_m_data->UNIQUEID     = $data['UNIQUEID'];
66
            $new_m_data->start        = $data['start'];
67
            $new_m_data->src_chan     = $m_data->src_chan;
68
            $new_m_data->src_num      = $m_data->src_num;
69
            $new_m_data->dst_num      = $data['src_num'];
70
            $new_m_data->did          = $data['did'];
71
            $new_m_data->from_account = $data['from_account'];
72
            $new_m_data->linkedid     = $data['linkedid'];
73
            $new_m_data->transfer     = $data['transfer'];
74
75
            $res = $new_m_data->save();
76
            if ( ! $res) {
77
                Util::sysLogMsg(__FUNCTION__, implode(' ', $m_data->getMessages()), LOG_ERR);
78
            }
79
        }
80
    }
81
82
    /**
83
     * Проверка данных на Originate.
84
     * @param $data
85
     * @return bool
86
     */
87
    private static function isOriginateDial($data): bool{
88
        return isset($data['IS_ORGNT']) && $data['IS_ORGNT'] !== false && $data['action'] === 'dial';
89
    }
90
91
    /**
92
     * @param CallDetailRecordsTmp $m_data
93
     * @param                      $data
94
     * @param bool                 $is_new
95
     */
96
    private static function fillCdrData(CallDetailRecordsTmp $m_data, $data, bool $is_new): void{
97
        $f_list = $m_data->toArray();
98
        // Заполняем данные истроии звонков.
99
        foreach ($data as $attribute => $value) {
100
            if (!array_key_exists($attribute, $f_list)) {
101
                continue;
102
            }
103
            if ($is_new === false && 'UNIQUEID' === $attribute) {
104
                continue;
105
            }
106
            $m_data->writeAttribute($attribute, $value);
107
        }
108
        $res = $m_data->save();
109
        if (!$res) {
110
            Util::sysLogMsg(__FUNCTION__, implode(' ', $m_data->getMessages()), LOG_ERR);
111
        }
112
    }
113
114
}