PaymentsGateway::charge()   A
last analyzed

Complexity

Conditions 4
Paths 6

Size

Total Lines 36

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 36
c 0
b 0
f 0
rs 9.344
cc 4
nc 6
nop 4
1
<?php
2
3
namespace App\Containers\Payment\Gateway;
4
5
use App\Containers\Payment\Contracts\ChargeableInterface;
6
use App\Containers\Payment\Contracts\PaymentChargerInterface;
7
use App\Containers\Payment\Exceptions\ChargerTaskDoesNotImplementInterfaceException;
8
use App\Containers\Payment\Exceptions\NoChargeTaskForPaymentGatewayDefinedException;
9
use App\Containers\Payment\Models\PaymentAccount;
10
use App\Containers\Payment\Models\PaymentTransaction;
11
use App\Containers\Payment\Tasks\CheckIfPaymentAccountBelongsToUserTask;
12
use Illuminate\Support\Facades\App;
13
use Illuminate\Support\Facades\Config;
14
15
/**
16
 * Class PaymentsGateway
17
 *
18
 * @author  Johannes Schobel <[email protected]>
19
 * @author  Mahmoud Zalt  <[email protected]>
20
 */
21
class PaymentsGateway
22
{
23
24
    /**
25
     * @param ChargeableInterface $chargeable
26
     * @param PaymentAccount      $account
27
     * @param                     $amount
28
     * @param string|null         $currency
29
     *
30
     * @return PaymentTransaction
31
     * @throws ChargerTaskDoesNotImplementInterfaceException
32
     * @throws NoChargeTaskForPaymentGatewayDefinedException
33
     */
34
    public function charge(ChargeableInterface $chargeable, PaymentAccount $account, $amount, $currency = null) : PaymentTransaction
35
    {
36
        $currency = ($currency === null) ? Config::get('payment.currency') : $currency;
37
38
        // check, if the account is owned by user to be charged
39
        App::make(CheckIfPaymentAccountBelongsToUserTask::class)->run($chargeable, $account);
40
41
        $typedAccount = $account->accountable;
42
43
        $chargerTaskTaskName = Config::get('payment-container.gateways.' . $typedAccount->getPaymentGatewaySlug() . '.charge_task', null);
44
45
        if ($chargerTaskTaskName === null) {
46
            throw new NoChargeTaskForPaymentGatewayDefinedException();
47
        }
48
49
        // create the task
50
        $chargerTask = App::make($chargerTaskTaskName);
51
52
        // check if it implements the required interface
53
        if (!$chargerTask instanceof PaymentChargerInterface) {
54
            throw new ChargerTaskDoesNotImplementInterfaceException();
55
        }
56
57
        /** @var PaymentTransaction $transaction */
58
        $transaction = $chargerTask->charge($chargeable, $typedAccount, $amount, $currency);
59
60
        // now set some details of the transaction
61
        $transaction->user_id = $chargeable->id;
0 ignored issues
show
Bug introduced by Johannes Schobel
Accessing id on the interface App\Containers\Payment\C...cts\ChargeableInterface suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
62
        $transaction->gateway = $typedAccount->getPaymentGatewayReadableName();
63
        $transaction->amount = $amount;
64
        $transaction->currency = $currency;
65
66
        $transaction->save();
67
68
        return $transaction;
69
    }
70
}
71