Passed
Push — main ( 45f186...3a7509 )
by Iain
04:30
created

RefundRepository::getForExternalReference()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 4
nc 2
nop 1
dl 0
loc 9
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * Copyright Iain Cambridge 2020-2023.
7
 *
8
 * Use of this software is governed by the Business Source License included in the LICENSE file and at https://getparthenon.com/docs/next/license.
9
 *
10
 * Change Date: TBD ( 3 years after 2.2.0 release )
11
 *
12
 * On the date above, in accordance with the Business Source License, use of this software will be governed by the open source license specified in the LICENSE file.
13
 */
14
15
namespace Parthenon\Billing\Repository\Orm;
16
17
use Brick\Money\Currency;
18
use Brick\Money\Money;
19
use Parthenon\Athena\Repository\DoctrineCrudRepository;
20
use Parthenon\Billing\Entity\BillingAdminInterface;
21
use Parthenon\Billing\Entity\CustomerInterface;
22
use Parthenon\Billing\Entity\Payment;
23
use Parthenon\Billing\Entity\Refund;
24
use Parthenon\Billing\Repository\RefundRepositoryInterface;
25
use Parthenon\Common\Exception\NoEntityFoundException;
26
27
class RefundRepository extends DoctrineCrudRepository implements RefundRepositoryInterface
28
{
29
    public function getForBillingAdmin(BillingAdminInterface $billingAdmin): array
30
    {
31
        return $this->entityRepository->findBy(['billingAdmin' => $billingAdmin]);
32
    }
33
34
    public function getForCustomer(CustomerInterface $customer): array
35
    {
36
        return $this->entityRepository->findBy(['customer' => $customer]);
37
    }
38
39
    /**
40
     * {@inheritDoc}
41
     */
42
    public function getForPayment(Payment $payment): array
43
    {
44
        return $this->entityRepository->findBy(['payment' => $payment]);
45
    }
46
47
    public function getTotalRefundedForPayment(Payment $payment): Money
48
    {
49
        $refunds = $this->getForPayment($payment);
50
51
        $amount = Money::of(0, Currency::of($payment->getCurrency()));
52
53
        foreach ($refunds as $refund) {
54
            $amount = $amount->plus($refund->getAsMoney());
55
        }
56
57
        return $amount;
58
    }
59
60
    public function getForExternalReference(string $externalReference): Refund
61
    {
62
        $refund = $this->entityRepository->findOneBy(['externalReference' => $externalReference]);
63
64
        if (!$refund instanceof Refund) {
65
            throw new NoEntityFoundException(sprintf("Can't find refund for external reference '%s'", $externalReference));
66
        }
67
68
        return $refund;
69
    }
70
}
71