TrackingDocument   A
last analyzed

Complexity

Total Complexity 14

Size/Duplication

Total Lines 116
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 43
dl 0
loc 116
rs 10
c 2
b 0
f 0
wmc 14

4 Methods

Rating   Name   Duplication   Size   Complexity  
A getStatusDocuments() 0 12 2
A checkTTN() 0 16 3
A clearNumber() 0 3 1
B getStatusTTN() 0 39 8
1
<?php
2
3
namespace Daaner\NovaPoshta\Models;
4
5
use Daaner\NovaPoshta\NovaPoshta;
6
7
class TrackingDocument extends NovaPoshta
8
{
9
    protected $model = 'TrackingDocument';
10
    protected $calledMethod;
11
12
    /**
13
     * Получение полной информации по ТТН/массиву ТТН.
14
     *
15
     * @see https://developers.novaposhta.ua/view/model/a99d2f28-8512-11ec-8ced-005056b2dbe1/method/a9ae7bc9-8512-11ec-8ced-005056b2dbe1
16
     *
17
     * @param  string|array  $documents  Номер ТТН либо массив ТТН, либо строкой через запятую
18
     * @return array
19
     */
20
    public function getStatusDocuments($documents): array
21
    {
22
        $this->calledMethod = 'getStatusDocuments';
23
24
        if (is_array($documents) === false) {
25
            $documents = explode(', ', /** @scrutinizer ignore-type */ $documents);
26
        }
27
        $methodProperties = [
28
            'Documents' => array_values(/** @scrutinizer ignore-type */ $documents),
29
        ];
30
31
        return $this->getResponse($this->model, $this->calledMethod, $methodProperties, false);
32
    }
33
34
    /**
35
     * Проверка единичной ТТН или массива ТТН.
36
     * Телефон, если указан, подставляется один для всех.
37
     *
38
     * @internal Внутренняя функция для простоты обработки
39
     *
40
     * @param  string|array  $ttns  Номер ТТН либо массив ТТН
41
     * @param  string|null  $phone  Номер телефона получателя или отправителя
42
     * @return array
43
     */
44
    public function checkTTN($ttns, ?string $phone = null): array
45
    {
46
        $documents = [];
47
48
        if (is_array($ttns)) {
49
            $docs = array_values($ttns);
50
            foreach ($docs as $key => $ttn) {
51
                $documents[$key]['DocumentNumber'] = $this->clearNumber($ttn);
52
                $documents[$key]['Phone'] = $phone;
53
            }
54
        } else {
55
            $documents[0]['DocumentNumber'] = $this->clearNumber($ttns);
56
            $documents[0]['Phone'] = $phone;
57
        }
58
59
        return $this->getStatusDocuments($documents);
60
    }
61
62
    /**
63
     * Получение коротких статусов одной ТТН или массива.
64
     *
65
     * @internal Внутренняя функция для простоты обработки
66
     *
67
     * @param  string|array  $ttns  Номер ТТН либо массив ТТН
68
     * @param  string|int|null  $phone  Номер телефона получателя или отправителя
69
     * @return array
70
     */
71
    public function getStatusTTN($ttns, $phone = null): array
72
    {
73
        $answer = $this->checkTTN($ttns, $phone);
74
        $statuses = [];
75
76
        if ($answer['success'] && ! empty($answer['result'])) {
77
            foreach ($answer['result'] as $key => $status) {
78
                $statuses[$key]['Number'] = $status['Number'];
79
                $statuses[$key]['StatusCode'] = $status['StatusCode'];
80
                $statuses[$key]['Status'] = $status['Status'];
81
                $statuses[$key]['StatusLocale'] = trans('novaposhta::novaposhta.statusCode.'.$status['StatusCode']);
82
                $statuses[$key]['ActualDeliveryDate'] = $status['ActualDeliveryDate'] ?? null;
83
84
                $statuses[$key]['NewTTN'] = '';
85
                $statuses[$key]['NewMoneyTTN'] = '';
86
87
                // Проверка на существование поля обратной доставки и получения номера накладной
88
                // если присутствует тире в номере - значит это отправка денег назад
89
                if (isset($status['LastCreatedOnTheBasisNumber']) && $status['LastCreatedOnTheBasisNumber']) {
90
                    if (strripos($status['LastCreatedOnTheBasisNumber'], '-')) {
91
                        $statuses[$key]['NewMoneyTTN'] = $status['LastCreatedOnTheBasisNumber'];
92
                    } else {
93
                        $statuses[$key]['NewTTN'] = $status['LastCreatedOnTheBasisNumber'];
94
                    }
95
                }
96
            }
97
        }
98
99
        $return = [
100
            'success' => $answer['success'],
101
            'result' => $statuses,
102
            'info' => $answer['info'],
103
        ];
104
105
        if (isset($answer['dev'])) {
106
            $return['dev'] = $answer['dev'];
107
        }
108
109
        return $return;
110
    }
111
112
    /**
113
     * Очистка пробелов и букв в ТТН.
114
     *
115
     * @internal Внутренняя функция для простоты обработки
116
     *
117
     * @param  string  $ttn  Номер ТТН
118
     * @return string
119
     */
120
    public function clearNumber(string $ttn): string
121
    {
122
        return preg_replace('/[^0-9,]/', '', $ttn);
123
    }
124
}
125