Completed
Push — master ( ebb1a5...6312a8 )
by Jacques
02:13
created

Client::getDealerBalance()   A

Complexity

Conditions 2
Paths 3

Size

Total Lines 14
Code Lines 9

Duplication

Lines 14
Ratio 100 %

Code Coverage

Tests 8
CRAP Score 2

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 14
loc 14
ccs 8
cts 8
cp 1
rs 9.4285
cc 2
eloc 9
nc 3
nop 0
crap 2
1
<?php
2
/**
3
 * Client for Smartcall's Restful Proxy.
4
 *
5
 * @author    Jacques Marneweck <[email protected]>
6
 * @copyright 2016 Jacques Marneweck.  All rights strictly reserved.
7
 * @license   MIT
8
 */
9
10
namespace Jacques\SmartCallProxy;
11
12
class Client extends \GuzzleHttp\Client
13
{
14
    /**
15
     * @const string Version number
16
     */
17
    const VERSION = '0.0.1';
18
19
    /**
20
     * Defaults to expecting that Apache Tomcat runs on port 8080 on localhost
21
     * (127.0.0.1).
22
     *
23
     * @var array[]
24
     */
25
    protected $options = [
26
        'scheme'   => 'http',
27
        'hostname' => 'localhost',
28
        'port'     => '8080',
29
    ];
30
31
    /**
32
     * @param   $options array
33
     *
34
     * @return void
0 ignored issues
show
Comprehensibility Best Practice introduced by
Adding a @return annotation to constructors is generally not recommended as a constructor does not have a meaningful return value.

Adding a @return annotation to a constructor is not recommended, since a constructor does not have a meaningful return value.

Please refer to the PHP core documentation on constructors.

Loading history...
35
     */
36 2
    public function __construct($options = [])
37
    {
38
        /*
39
         * Allow on instantiation to overwrite the defaults
40
         */
41 2
        $this->options = array_merge(
0 ignored issues
show
Documentation Bug introduced by
It seems like array_merge($this->options, $options) of type array is incompatible with the declared type array<integer,array> of property $options.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
42 2
            $this->options,
43
            $options
44 2
        );
45
46
        $config = [
47 2
            'base_uri' => sprintf(
48 2
                '%s://%s:%s/',
49 2
                $this->options['scheme'],
50 2
                $this->options['hostname'],
51 2
                $this->options['port']
52 2
            ),
53
            'headers' => [
54 2
                'User-Agent' => 'SmartcallRestfulProxyClient-PHP/'.self::VERSION.' '.\GuzzleHttp\default_user_agent(),
55 2
            ],
56 2
        ];
57
58 2
        parent::__construct($config);
59 2
    }
60
61
    /**
62
     * Facility provided to cancel recharges.  This does not work if the recharge
63
     * has been processed by the MNO.
64
     *
65
     * @param int $reference Order Reference from SmartCall
66
     *
67
     * @throws Exception
68
     *
69
     * @return array
70
     */
71 2
    public function cancelRecharge($reference)
72
    {
73
        try {
74 2
            $response = $this->post(
75 2
                '/SmartcallRestfulProxy/cancel_recharge_js',
76
                [
77
                    'json' => [
78 2
                        'orderReferenceId' => $reference,
79 2
                    ],
80
                ]
81 2
            );
82
83
            return [
84 2
                'status'    => 'ok',
85 2
                'http_code' => $response->getStatusCode(),
86 2
                'body'      => (string) $response->getBody(),
87 2
            ];
88
        } catch (\GuzzleHttp\Exception\ServerException $e) {
89
            return $this->parseError($e);
90
        }
91
    }
92
93
    /**
94
     * Transfer funds to another SmartCall Dealer Account.
95
     *
96
     * @param int  $amount  Amount in rands (ZAR) to transfer to the recipients SmartCall Dealer Account
97
     * @param int  $msisdn  MSISDN of the account to receive the funds being transfered
98
     * @param bool $sendSms true = send sms | false do not send a sms
99
     *
100
     * @throws Exception
101
     *
102
     * @return array
103
     */
104 1
    public function fundsTransfer($amount, $msisdn, $sendSms)
105
    {
106
        try {
107 1
            $response = $this->post(
108 1
                '/SmartcallRestfulProxy/funds_transfer_js',
109
                [
110
                    'json' => [
111 1
                        'amount'          => $amount,
112 1
                        'recipientMsisdn' => $msisdn,
113 1
                        'sendSms'         => (bool) $sendSms,
114 1
                    ],
115
                ]
116 1
            );
117
118
            return [
119 1
                'status'    => 'ok',
120 1
                'http_code' => $response->getStatusCode(),
121 1
                'body'      => (string) $response->getBody(),
122 1
            ];
123
        } catch (\GuzzleHttp\Exception\ServerException $e) {
124
            return $this->parseError($e);
125
        }
126
    }
127
128
    /**
129
     * Fetches the Dealer Balance from SmartCall.
130
     *
131
     * @throws Exception
132
     *
133
     * @return array
134
     */
135 2 View Code Duplication
    public function getDealerBalance()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
136
    {
137
        try {
138 2
            $response = $this->get('/SmartcallRestfulProxy/balance');
139
140
            return [
141 1
                'status'    => 'ok',
142 1
                'http_code' => $response->getStatusCode(),
143 1
                'body'      => (string) $response->getBody(),
144 1
            ];
145 1
        } catch (\GuzzleHttp\Exception\ServerException $e) {
146 1
            return $this->parseError($e);
147
        }
148
    }
149
150
    /**
151
     * Fetches the Dealer Balance from SmartCall.
152
     *
153
     * @throws Exception
154
     *
155
     * @return array
156
     */
157 1 View Code Duplication
    public function isDealerRegistered($msisdn)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
158
    {
159
        try {
160 1
            $response = $this->get(
161 1
                sprintf(
162 1
                    '/SmartcallRestfulProxy/registered/%s',
163
                    $msisdn
164 1
                )
165 1
            );
166
167
            return [
168 1
                'status'    => 'ok',
169 1
                'http_code' => $response->getStatusCode(),
170 1
                'body'      => (string) $response->getBody(),
171 1
            ];
172
        } catch (\GuzzleHttp\Exception\ServerException $e) {
173
            return $this->parseError($e);
174
        }
175
    }
176
177
    /**
178
     * Fetches the Product from SmartCall.
179
     *
180
     * @param int $productId Product Identifier
181
     *
182
     * @throws Exception
183
     *
184
     * @return array
185
     */
186 2 View Code Duplication
    public function getProduct($productId)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
187
    {
188
        try {
189 2
            $response = $this->get(
190 2
                sprintf(
191 2
                    '/SmartcallRestfulProxy/product_js/%d',
192
                    $productId
193 2
                )
194 2
            );
195
196
            return [
197 1
                'status'    => 'ok',
198 1
                'http_code' => $response->getStatusCode(),
199 1
                'body'      => (string) $response->getBody(),
200 1
            ];
201 1
        } catch (\GuzzleHttp\Exception\ServerException $e) {
202 1
            return $this->parseError($e);
203
        }
204
    }
205
206
    /**
207
     * Fetches the Product List from SmartCall.
208
     *
209
     * @throws Exception
210
     *
211
     * @return array
212
     */
213 1 View Code Duplication
    public function getProducts()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
214
    {
215
        try {
216 1
            $response = $this->get('/SmartcallRestfulProxy/all_networks_js');
217
218
            return [
219 1
                'status'    => 'ok',
220 1
                'http_code' => $response->getStatusCode(),
221 1
                'body'      => (string) $response->getBody(),
222 1
            ];
223
        } catch (\GuzzleHttp\Exception\ServerException $e) {
224
            return $this->parseError($e);
225
        }
226
    }
227
228
    /**
229
     * Fetches the details of the last transaction processed from SmartCall.
230
     *
231
     * @throws Exception
232
     *
233
     * @return array
234
     */
235 1 View Code Duplication
    public function getLastTransaction()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
236
    {
237
        try {
238 1
            $response = $this->get('/SmartcallRestfulProxy/last_transaction_js');
239
240
            return [
241 1
                'status'    => 'ok',
242 1
                'http_code' => $response->getStatusCode(),
243 1
                'body'      => (string) $response->getBody(),
244 1
            ];
245
        } catch (\GuzzleHttp\Exception\ServerException $e) {
246
            return $this->parseError($e);
247
        }
248
    }
249
250
    /**
251
     * Fetches the Product List by the specified network identifier from SmartCall.
252
     *
253
     * @param int $networkId identifier for the network
254
     *
255
     * @throws Exception
256
     *
257
     * @return array
258
     */
259 1 View Code Duplication
    public function getProductsByNetwork($networkId)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
260
    {
261
        try {
262 1
            $response = $this->get(
263 1
                sprintf(
264 1
                    '/SmartcallRestfulProxy/network_js/%d',
265
                    $networkId
266 1
                )
267 1
            );
268
269
            return [
270 1
                'status'    => 'ok',
271 1
                'http_code' => $response->getStatusCode(),
272 1
                'body'      => (string) $response->getBody(),
273 1
            ];
274
        } catch (\GuzzleHttp\Exception\ServerException $e) {
275
            return $this->parseError($e);
276
        }
277
    }
278
279
    /**
280
     * Purchase a voucher or do a pinless recharge on SmartCall.
281
     *
282
     * @param int    $productId identifier for the product
283
     * @param int    $amount    amount in rands of the product
284
     * @param int    $msisdn    mobile number of the recipient of the product
285
     * @param int    $deviceId  mobile number or meter number of the device being recharged
286
     * @param string $clientRef Client Reference (use a UUID)
287
     * @param bool   $pinless   true = device will be recharged via the network's IN platform | false = pinbased virtual voucher
288
     * @param bool   $sendSms   true = SmartCall will send the voucher via SMS | false don't send the voucher via SMS
289
     *
290
     * @throws Exception
291
     *
292
     * @return array
293
     */
294 4
    public function purchaseProduct($productId, $amount, $msisdn, $deviceId, $clientRef, $pinless, $sendSms)
295
    {
296
        try {
297 4
            $response = $this->post(
298 4
                sprintf(
299 4
                    '/SmartcallRestfulProxy/recharge_js/%s',
300
                    $clientRef
301 4
                ),
302
                [
303
                    'json' => [
304 4
                        'amount'             => $amount,
305 4
                        'deviceId'           => $deviceId,
306 4
                        'pinless'            => $pinless,
307 4
                        'productId'          => $productId,
308 4
                        'sendSms'            => $sendSms,
309 4
                        'smsRecipientMsisdn' => $msisdn,
310 4
                    ],
311
                ]
312 4
            );
313
314
            return [
315 4
                'status'    => 'ok',
316 4
                'http_code' => $response->getStatusCode(),
317 4
                'body'      => (string) $response->getBody(),
318 4
            ];
319
        } catch (\GuzzleHttp\Exception\ServerException $e) {
320
            return $this->parseError($e);
321
        }
322
    }
323
324
    /**
325
     * Searches SmartCall for a specified transaction using a specified key and string to search
326
     * against at SmartCall.
327
     *
328
     * @param string $field  client_ref | msisdn | order_reference
329
     * @param string $search Client Reference when client_ref or a users MSISDN when msisdn
330
     *
331
     * @throws Exception
332
     *
333
     * @return array
334
     */
335 6
    public function searchTransaction($field, $search)
336
    {
337
        /**
338
         * Map Smartcall's longer version of the url to shorter param to pass in.
339
         */
340
        $fields = [
341 6
            'client_ref' => 'client_reference',
342 6
            'msisdn'     => 'msisdn',
343 6
            'order_ref'  => 'order_reference',
344 6
        ];
345
346
        try {
347 6
            $response = $this->get(
348 6
                sprintf(
349 6
                    '/SmartcallRestfulProxy/last_transaction_%s_js/%s',
350 6
                    (string) $fields[$field],
351
                    (string) $search
352 6
                )
353 6
            );
354
355
            return [
356 6
                'status'    => 'ok',
357 6
                'http_code' => $response->getStatusCode(),
358 6
                'body'      => (string) $response->getBody(),
359 6
            ];
360
        } catch (\GuzzleHttp\Exception\ServerException $e) {
361
            return $this->parseError($e);
362
        }
363
    }
364
365 1
    private function parseError(\GuzzleHttp\Exception\ServerException $exception)
366
    {
367 1
        $body = (string) $exception->getResponse()->getBody();
368
369 1
        preg_match('!<p><b>type</b> Exception report</p><p><b>message</b> <u>(.*[^</u>])</u></p><p><b>description</b>!', $body, $matches);
370
371
        return [
372 1
            'status'    => 'error',
373 1
            'http_code' => $exception->getResponse()->getStatusCode(),
374 1
            'body'      => $matches['1'],
375 1
        ];
376
    }
377
}
378