Api::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 15
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 5
nc 1
nop 8
dl 0
loc 15
rs 10
c 0
b 0
f 0

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
3
/**
4
 * PAYONE Magento 2 Connector is free software: you can redistribute it and/or modify
5
 * it under the terms of the GNU Lesser General Public License as published by
6
 * the Free Software Foundation, either version 3 of the License, or
7
 * (at your option) any later version.
8
 *
9
 * PAYONE Magento 2 Connector is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 * GNU Lesser General Public License for more details.
13
 *
14
 * You should have received a copy of the GNU Lesser General Public License
15
 * along with PAYONE Magento 2 Connector. If not, see <http://www.gnu.org/licenses/>.
16
 *
17
 * PHP version 5
18
 *
19
 * @category  Payone
20
 * @package   Payone_Magento2_Plugin
21
 * @author    FATCHIP GmbH <[email protected]>
22
 * @copyright 2003 - 2016 Payone GmbH
23
 * @license   <http://www.gnu.org/licenses/> GNU Lesser General Public License
24
 * @link      http://www.payone.de
25
 */
26
27
namespace Payone\Core\Helper;
28
29
use Magento\Quote\Model\Quote;
0 ignored issues
show
Bug introduced by
The type Magento\Quote\Model\Quote was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
30
use Payone\Core\Model\Methods\PayoneMethod;
31
use Magento\Sales\Model\Order as SalesOrder;
0 ignored issues
show
Bug introduced by
The type Magento\Sales\Model\Order was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
32
use Payone\Core\Model\Methods\Ratepay\RatepayBase;
33
34
/**
35
 * Helper class for everything that has to do with APIs
36
 *
37
 * @category  Payone
38
 * @package   Payone_Magento2_Plugin
39
 * @author    FATCHIP GmbH <[email protected]>
40
 * @copyright 2003 - 2016 Payone GmbH
41
 * @license   <http://www.gnu.org/licenses/> GNU Lesser General Public License
42
 * @link      http://www.payone.de
43
 */
44
class Api extends Base
45
{
46
    /**
47
     * PAYONE connection curl php
48
     *
49
     * @var \Payone\Core\Helper\Connection\CurlPhp
50
     */
51
    protected $connCurlPhp;
52
53
    /**
54
     * PAYONE connection curl cli
55
     *
56
     * @var \Payone\Core\Helper\Connection\CurlCli
57
     */
58
    protected $connCurlCli;
59
60
    /**
61
     * PAYONE connection fsockopen
62
     *
63
     * @var \Payone\Core\Helper\Connection\Fsockopen
64
     */
65
    protected $connFsockopen;
66
67
    /**
68
     * Checkout session object
69
     *
70
     * @var \Magento\Checkout\Model\Session
0 ignored issues
show
Bug introduced by
The type Magento\Checkout\Model\Session was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
71
     */
72
    protected $checkoutSession;
73
74
    /**
75
     * Fields to copy from the request array to the order
76
     *
77
     * @var array
78
     */
79
    protected $requestToOrder = [
80
        'reference' => 'payone_refnr',
81
        'request' => 'payone_authmode',
82
        'mode' => 'payone_mode',
83
        'mandate_identification' => 'payone_mandate_id',
84
        'workorderid' => 'payone_workorder_id',
85
        'add_paydata[installment_duration]' => 'payone_installment_duration',
86
        'add_paydata[shop_id]' => 'payone_ratepay_shop_id',
87
    ];
88
89
    /**
90
     * Fields to copy from the response to the order
91
     *
92
     * @var array
93
     */
94
    protected $responseToOrder = [
95
        'txid' => 'payone_txid',
96
        'mandate_identification' => 'payone_mandate_id',
97
        'clearing_reference' => 'payone_clearing_reference',
98
        'add_paydata[clearing_reference]' => 'payone_clearing_reference',
99
        'add_paydata[workorderid]' => 'payone_workorder_id',
100
        'clearing_bankaccount' => 'payone_clearing_bankaccount',
101
        'clearing_bankcode' => 'payone_clearing_bankcode',
102
        'clearing_bankcountry' => 'payone_clearing_bankcountry',
103
        'clearing_bankname' => 'payone_clearing_bankname',
104
        'clearing_bankaccountholder' => 'payone_clearing_bankaccountholder',
105
        'clearing_bankcity' => 'payone_clearing_bankcity',
106
        'clearing_bankiban' => 'payone_clearing_bankiban',
107
        'clearing_bankbic' => 'payone_clearing_bankbic',
108
        'clearing_duedate' => 'payone_clearing_duedate',
109
    ];
110
111
    /**
112
     * Fields to copy from the session to the order
113
     *
114
     * @var array
115
     */
116
    protected $sessionToOrder = [
117
        'payone_express_type' => 'payone_express_type',
118
    ];
119
120
    /**
121
     * Constructor
122
     *
123
     * @param \Magento\Framework\App\Helper\Context      $context
124
     * @param \Magento\Store\Model\StoreManagerInterface $storeManager
125
     * @param \Payone\Core\Helper\Shop                   $shopHelper
126
     * @param \Magento\Framework\App\State               $state
127
     * @param \Payone\Core\Helper\Connection\CurlPhp     $connCurlPhp
128
     * @param \Payone\Core\Helper\Connection\CurlCli     $connCurlCli
129
     * @param \Payone\Core\Helper\Connection\Fsockopen   $connFsockopen
130
     * @param \Magento\Checkout\Model\Session            $checkoutSession
131
     */
132
    public function __construct(
133
        \Magento\Framework\App\Helper\Context $context,
0 ignored issues
show
Bug introduced by
The type Magento\Framework\App\Helper\Context was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
134
        \Magento\Store\Model\StoreManagerInterface $storeManager,
0 ignored issues
show
Bug introduced by
The type Magento\Store\Model\StoreManagerInterface was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
135
        \Payone\Core\Helper\Shop $shopHelper,
136
        \Magento\Framework\App\State $state,
0 ignored issues
show
Bug introduced by
The type Magento\Framework\App\State was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
137
        \Payone\Core\Helper\Connection\CurlPhp $connCurlPhp,
138
        \Payone\Core\Helper\Connection\CurlCli $connCurlCli,
139
        \Payone\Core\Helper\Connection\Fsockopen $connFsockopen,
140
        \Magento\Checkout\Model\Session $checkoutSession
141
    ) {
142
        parent::__construct($context, $storeManager, $shopHelper, $state);
143
        $this->connCurlPhp = $connCurlPhp;
144
        $this->connCurlCli = $connCurlCli;
145
        $this->connFsockopen = $connFsockopen;
146
        $this->checkoutSession = $checkoutSession;
147
    }
148
149
    /**
150
     * Check which communication possibilities are existing and send the request
151
     *
152
     * @param  string $sRequestUrl
153
     * @return array
154
     */
155
    public function sendApiRequest($sRequestUrl)
156
    {
157
        $aParsedRequestUrl = parse_url($sRequestUrl);
158
        if ($aParsedRequestUrl === false) {
159
            return ["errormessage" => "Payone API request URL could not be parsed."];
160
        }
161
162
        if ($this->connCurlPhp->isApplicable()) {
163
            // php native curl exists so we gonna use it for requesting
164
            $aResponse = $this->connCurlPhp->sendCurlPhpRequest($aParsedRequestUrl);
165
        } elseif ($this->connCurlCli->isApplicable()) {
166
            // cli version of curl exists on server
167
            $aResponse = $this->connCurlCli->sendCurlCliRequest($aParsedRequestUrl);
168
        } else {
169
            // last resort => via sockets
170
            $aResponse = $this->connFsockopen->sendSocketRequest($aParsedRequestUrl);
171
        }
172
173
        $aResponse = $this->formatOutputByResponse($aResponse);
174
175
        if (!array_key_exists('status', $aResponse)) {
176
            $aResponse['status'] = 'ERROR';
177
            $aResponse['errorcode'] = '0';
178
            $aResponse['customermessage'] = 'No connection to external service provider possible (timeout)';
179
        }
180
181
        return $aResponse;
182
    }
183
184
    /**
185
     * Format response to a clean output array
186
     *
187
     * @param  array $aResponse
188
     * @return array
189
     */
190
    protected function formatOutputByResponse($aResponse)
191
    {
192
        $aOutput = [];
193
194
        if (is_array($aResponse)) { // correct response existing?
0 ignored issues
show
introduced by
The condition is_array($aResponse) is always true.
Loading history...
195
            foreach ($aResponse as $iLinenum => $sLine) { // go through line by line
196
                $iPos = strpos($sLine, "=");
197
                if ($iPos > 0) { // is a "=" as delimiter existing?
198
                    $aOutput[substr($sLine, 0, $iPos)] = trim(substr($sLine, $iPos + 1));
199
                } elseif (!empty($sLine)) { // is line not empty?
200
                    $aOutput[$iLinenum] = $sLine; // add the line unedited
201
                }
202
            }
203
        }
204
205
        return $aOutput;
206
    }
207
208
    /**
209
     * Generate the request url out of the params and die api url
210
     *
211
     * @param  array  $aParameters
212
     * @param  string $sApiUrl
213
     * @return string
214
     */
215
    public function getRequestUrl($aParameters, $sApiUrl)
216
    {
217
        $sRequestUrl = '';
218
        foreach ($aParameters as $sKey => $mValue) {
219
            if (is_array($mValue)) { // might be array
220
                foreach ($mValue as $i => $sSubValue) {
221
                    $sRequestUrl .= "&".$sKey."[".$i."]=".urlencode($sSubValue ?? '');
222
                }
223
            } else {
224
                $sRequestUrl .= "&".$sKey."=".urlencode($mValue ?? '');
225
            }
226
        }
227
        $sRequestUrl = $sApiUrl."?".substr($sRequestUrl, 1);
228
        return $sRequestUrl;
229
    }
230
231
    /**
232
     * Copy Data to order by given map
233
     *
234
     * @param SalesOrder $oOrder
235
     * @param array $aData
236
     * @param array $aMap
237
     * @return SalesOrder
238
     */
239
    protected function addDataToOrder(SalesOrder $oOrder, $aData, $aMap)
240
    {
241
        foreach ($aMap as $sFrom => $sTo) {
242
            if (isset($aData[$sFrom])) {
243
                $oOrder->setData($sTo, $aData[$sFrom]);
244
            }
245
        }
246
        return $oOrder;
247
    }
248
249
    /**
250
     * Get data from session
251
     *
252
     * @return array
253
     */
254
    protected function getSessionData()
255
    {
256
        $aData = [];
257
        foreach ($this->sessionToOrder as $from => $to) {
258
            $aData[$from] = $this->checkoutSession->getData($from, true); // get data and clear
259
        }
260
        return $aData;
261
    }
262
263
    /**
264
     * Add PAYONE information to the order object to be saved in the DB
265
     *
266
     * @param  SalesOrder  $oOrder
267
     * @param  array|false $aRequest
268
     * @param  array       $aResponse
269
     * @return void
270
     */
271
    public function addPayoneOrderData(SalesOrder $oOrder, $aRequest, $aResponse)
272
    {
273
        $this->addDataToOrder($oOrder, $aRequest, $this->requestToOrder);
0 ignored issues
show
Bug introduced by
It seems like $aRequest can also be of type false; however, parameter $aData of Payone\Core\Helper\Api::addDataToOrder() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

273
        $this->addDataToOrder($oOrder, /** @scrutinizer ignore-type */ $aRequest, $this->requestToOrder);
Loading history...
274
        $this->addDataToOrder($oOrder, $aResponse, $this->responseToOrder);
275
        $this->addDataToOrder($oOrder, $this->getSessionData(), $this->sessionToOrder);
276
    }
277
278
    /**
279
     * Check if invoice-data has to be added to the authorization request
280
     *
281
     * @param  PayoneMethod $oPayment
282
     * @param  array|null   $aPositions
283
     * @return bool
284
     */
285
    public function isInvoiceDataNeeded(PayoneMethod $oPayment, $aPositions = null)
286
    {
287
        $oInfoInstance = false;
0 ignored issues
show
Unused Code introduced by
The assignment to $oInfoInstance is dead and can be removed.
Loading history...
288
        try {
289
            $oInfoInstance = $oPayment->getInfoInstance(); // using getInfoInstance when it is not set will throw an exception
290
        } catch (\Exception $exc) {
291
            // do nothing
292
        }
293
294
        $sStoreCode = null;
295
        if ($oInfoInstance && $oInfoInstance->getOrder()) {
296
            $sStoreCode = $oInfoInstance->getOrder()->getStore()->getCode();
297
        }
298
299
        if ($oPayment instanceof RatepayBase && is_array($aPositions) && empty($aPositions)) { // empty array means products and shipping costs were deselected
300
            return false; // RatePay demands that adjustment refunds without products and shipping costs are sent without basket info
301
        }
302
303
        $blInvoiceEnabled = (bool)$this->getConfigParam('transmit_enabled', 'invoicing', 'payone_general', $sStoreCode); // invoicing enabled?
304
        if ($blInvoiceEnabled || $oPayment->needsProductInfo()) {
305
            return true; // invoice data needed
306
        }
307
        return false; // invoice data not needed
308
    }
309
310
    /**
311
     * Return base or display currency of the order depending on the config
312
     *
313
     * @param  SalesOrder $oOrder
314
     * @return null|string
315
     */
316
    public function getCurrencyFromOrder(SalesOrder $oOrder)
317
    {
318
        $sCurrency = $oOrder->getBaseCurrencyCode();
319
        if ($this->getConfigParam('currency', 'global', 'payone_general', $oOrder->getStore()->getCode()) == 'display') {
320
            $sCurrency = $oOrder->getOrderCurrencyCode();
321
        }
322
        return $sCurrency;
323
    }
324
325
    /**
326
     * Return base or display amount of the order depending on the config
327
     *
328
     * @param  SalesOrder $oQuote
329
     * @return float
330
     */
331
    public function getOrderAmount(SalesOrder $oOrder)
332
    {
333
        $dAmount = $oOrder->getBaseGrandTotal();
334
        if ($this->getConfigParam('currency', 'global', 'payone_general', $oOrder->getStore()->getCode()) == 'display') {
335
            $dAmount = $oOrder->getGrandTotal(); // send display amount instead of base amount
336
        }
337
        return $dAmount;
338
    }
339
340
    /**
341
     * Return base or display currency of the quote depending on the config
342
     *
343
     * @param  Quote $oQuote
344
     * @return string
345
     */
346
    public function getCurrencyFromQuote(Quote $oQuote)
347
    {
348
        $sCurrency = $oQuote->getBaseCurrencyCode();
349
        if ($this->getConfigParam('currency', 'global', 'payone_general', $oQuote->getStore()->getCode()) == 'display') {
350
            $sCurrency = $oQuote->getQuoteCurrencyCode();
351
        }
352
        return $sCurrency;
353
    }
354
355
    /**
356
     * Return base or display amount of the quote depending on the config
357
     *
358
     * @param  Quote $oQuote
359
     * @return float
360
     */
361
    public function getQuoteAmount(Quote $oQuote)
362
    {
363
        $dAmount = $oQuote->getBaseGrandTotal();
364
        if ($this->getConfigParam('currency', 'global', 'payone_general', $oQuote->getStore()->getCode()) == 'display') {
365
            $dAmount = $oQuote->getGrandTotal(); // send display amount instead of base amount
366
        }
367
        return $dAmount;
368
    }
369
}
370