Completed
Push — master ( f3dcef...b4070a )
by Jacques
02:07
created

Client::fundsTransfer()   A

Complexity

Conditions 2
Paths 3

Size

Total Lines 23
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 23
ccs 0
cts 14
cp 0
rs 9.0856
cc 2
eloc 14
nc 3
nop 3
crap 6
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
    public function cancelRecharge($reference)
72
    {
73
        try {
74
            $response = $this->post(
75
                '/SmartcallRestfulProxy/cancel_recharge_js',
76
                [
77
                    'json' => [
78
                        'orderReferenceId' => $reference,
79
                    ],
80
                ]
81
            );
82
83
            return [
84
                'status'    => 'ok',
85
                'http_code' => $response->getStatusCode(),
86
                'body'      => (string) $response->getBody(),
87
            ];
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
0 ignored issues
show
Documentation introduced by
There is no parameter named $sendSms. Did you maybe mean $sendSMS?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function. It has, however, found a similar but not annotated parameter which might be a good fit.

Consider the following example. The parameter $ireland is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $ireland
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was changed, but the annotation was not.

Loading history...
99
     *
100
     * @throws Exception
101
     *
102
     * @return array
103
     */
104
    public function fundsTransfer($amount, $msisdn, $sendSMS)
0 ignored issues
show
Unused Code introduced by
The parameter $sendSMS is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
105
    {
106
        try {
107
            $response = $this->post(
108
                '/SmartcallRestfulProxy/fund_transfer_js',
109
                [
110
                    'json' => [
111
                        'amount'          => $amount,
112
                        'recipientMsisdn' => $msisdn,
113
                        'sendSms'         => (bool)$sendSms,
0 ignored issues
show
Bug introduced by
The variable $sendSms does not exist. Did you mean $sendSMS?

This check looks for variables that are accessed but have not been defined. It raises an issue if it finds another variable that has a similar name.

The variable may have been renamed without also renaming all references.

Loading history...
114
                    ],
115
                ]
116
            );
117
118
            return [
119
                'status'    => 'ok',
120
                'http_code' => $response->getStatusCode(),
121
                'body'      => (string) $response->getBody(),
122
            ];
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 1 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 1
            $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
        } catch (\GuzzleHttp\Exception\ServerException $e) {
146
            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 1
    public function purchaseProduct($productId, $amount, $msisdn, $deviceId, $clientRef, $pinless, $sendSms)
295
    {
296
        try {
297 1
            $response = $this->post(
298 1
                sprintf(
299 1
                    '/SmartcallRestfulProxy/recharge_js/%s',
300
                    $clientRef
301 1
                ),
302
                [
303
                    'json' => [
304 1
                        'amount'             => $amount,
305 1
                        'deviceId'           => $deviceId,
306 1
                        'pinless'            => $pinless,
307 1
                        'productId'          => $productId,
308 1
                        'sendSms'            => $sendSms,
309 1
                        'smsRecipientMsisdn' => $msisdn,
310 1
                    ],
311
                ]
312 1
            );
313
314
            return [
315 1
                'status'    => 'ok',
316 1
                'http_code' => $response->getStatusCode(),
317 1
                'body'      => (string) $response->getBody(),
318 1
            ];
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 $query_string Client Reference when client_ref or a users MSISDN when msisdn
0 ignored issues
show
Bug introduced by
There is no parameter named $query_string. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
330
     *
331
     * @throws Exception
332
     *
333
     * @return array
334
     */
335 5
    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 5
            'client_ref' => 'client_reference',
342 5
            'msisdn'     => 'msisdn',
343 5
            'order_ref'  => 'order_reference',
344 5
        ];
345
346
        try {
347 5
            $response = $this->get(
348 5
                sprintf(
349 5
                    '/SmartcallRestfulProxy/last_transaction_%s_js/%s',
350 5
                    (string) $fields[$field],
351
                    (string) $search
352 5
                )
353 5
            );
354
355
            return [
356 5
                'status'    => 'ok',
357 5
                'http_code' => $response->getStatusCode(),
358 5
                'body'      => (string) $response->getBody(),
359 5
            ];
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