Api   A
last analyzed

Complexity

Total Complexity 38

Size/Duplication

Total Lines 324
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 108
dl 0
loc 324
rs 9.36
c 1
b 0
f 0
wmc 38

12 Methods

Rating   Name   Duplication   Size   Complexity  
A getRequestUrl() 0 14 4
A formatOutputByResponse() 0 16 5
A getSessionData() 0 7 2
A addDataToOrder() 0 8 3
A getQuoteAmount() 0 7 2
A sendApiRequest() 0 27 5
A getOrderAmount() 0 7 2
A getCurrencyFromQuote() 0 7 2
B isInvoiceDataNeeded() 0 23 9
A getCurrencyFromOrder() 0 7 2
A addPayoneOrderData() 0 5 1
A __construct() 0 15 1
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