Skip to content

Commit

Permalink
Add accessor field for payment status
Browse files Browse the repository at this point in the history
- it was hard to look up the payment status through the payment specific fields
- enable easier lookup

This commit can be reverted when doing squizlabs/PHP_CodeSniffer#3479
  • Loading branch information
moiikana authored and gbirke committed Aug 29, 2022
1 parent bcaf0fd commit dfc4758
Show file tree
Hide file tree
Showing 18 changed files with 158 additions and 143 deletions.
9 changes: 9 additions & 0 deletions src/Domain/Model/BankTransferPayment.php
Expand Up @@ -71,4 +71,13 @@ public function getDisplayValues(): array {
$subtypeValues
);
}

/**
* @return string
*/
protected function getLegacyPaymentStatus(): string {
if ( $this->isCancelled() ) { return LegacyPaymentStatus::CANCELLED->value;
}
return LegacyPaymentStatus::BANK_TRANSFER->value;
}
}
5 changes: 3 additions & 2 deletions src/Domain/Model/CreditCardPayment.php
Expand Up @@ -16,6 +16,8 @@
*/
class CreditCardPayment extends Payment implements BookablePayment {

use LegacyBookingStatusTrait;

private const PAYMENT_METHOD = 'MCP';

/**
Expand All @@ -34,7 +36,7 @@ public function getValuationDate(): ?DateTimeImmutable {
return $this->valuationDate;
}

private function isBooked(): bool {
public function isBooked(): bool {
return $this->valuationDate !== null && !empty( $this->bookingData );
}

Expand Down Expand Up @@ -71,5 +73,4 @@ public function getDisplayValues(): array {
$subtypeValues
);
}

}
9 changes: 9 additions & 0 deletions src/Domain/Model/DirectDebitPayment.php
Expand Up @@ -78,4 +78,13 @@ public function getDisplayValues(): array {
$subtypeValues
);
}

/**
* @return string (N is the NEW payment status (legacy) for directdebit payments)
*/
protected function getLegacyPaymentStatus(): string {
if ( $this->isCancelled() ) { return LegacyPaymentStatus::CANCELLED->value;
}
return LegacyPaymentStatus::DIRECT_DEBIT->value;
}
}
17 changes: 17 additions & 0 deletions src/Domain/Model/LegacyBookingStatusTrait.php
@@ -0,0 +1,17 @@
<?php

declare( strict_types = 1 );

namespace WMDE\Fundraising\PaymentContext\Domain\Model;

trait LegacyBookingStatusTrait {

abstract public function isBooked(): bool;

protected function getLegacyPaymentStatus(): string {
if ( $this->isBooked() ) { return LegacyPaymentStatus::EXTERNAL_BOOKED->value;
}
return LegacyPaymentStatus::EXTERNAL_INCOMPLETE->value;
}

}
5 changes: 4 additions & 1 deletion src/Domain/Model/LegacyPaymentData.php
Expand Up @@ -7,17 +7,20 @@
* This is the value object for {@see LegacyDataTransformer}.
*/
class LegacyPaymentData {

/**
* @param int $amountInEuroCents
* @param int $intervalInMonths
* @param string $paymentName 3-letter payment name
* @param array<string,mixed> $paymentSpecificValues
* @param string $paymentStatus Deprecated status, should be removed when https://phabricator.wikimedia.org/T281853 is done
*/
public function __construct(
public readonly int $amountInEuroCents,
public readonly int $intervalInMonths,
public readonly string $paymentName,
public readonly array $paymentSpecificValues
public readonly array $paymentSpecificValues,
public readonly string $paymentStatus
) {
}
}
28 changes: 28 additions & 0 deletions src/Domain/Model/LegacyPaymentStatus.php
@@ -0,0 +1,28 @@
<?php
// phpcs:ignoreFile -- Until phpcs has 8.1 enum support, see https://github.com/squizlabs/PHP_CodeSniffer/issues/3479
declare( strict_types = 1 );

namespace WMDE\Fundraising\PaymentContext\Domain\Model;

/**
* These values are a mixture of payment-type dependent status and
* actions (booking, cancelling) that were performed on the payment.
*
* The status will be stored in the donation (which may add another status for moderation).
*
* When https://phabricator.wikimedia.org/T281853 is done, you should delete this class and all code that uses it.
*/
enum LegacyPaymentStatus: string {
// direct debit
case DIRECT_DEBIT = 'N';

// bank transfer
case BANK_TRANSFER = 'Z';

// external payment, not notified by payment provider
case EXTERNAL_INCOMPLETE = 'X';

// external payment, notified by payment provider
case EXTERNAL_BOOKED = 'B';
case CANCELLED = 'D';
}
2 changes: 2 additions & 0 deletions src/Domain/Model/PayPalPayment.php
Expand Up @@ -12,6 +12,8 @@

class PayPalPayment extends Payment implements BookablePayment {

use LegacyBookingStatusTrait;

private const PAYMENT_METHOD = 'PPL';

/**
Expand Down
11 changes: 10 additions & 1 deletion src/Domain/Model/Payment.php
Expand Up @@ -27,7 +27,8 @@ public function getLegacyData(): LegacyPaymentData {
$this->amount->getEuroCents(),
$this->interval->value,
$this->getPaymentName(),
$this->getPaymentSpecificLegacyData()
$this->getPaymentSpecificLegacyData(),
$this->getLegacyPaymentStatus(),
);
}

Expand Down Expand Up @@ -67,4 +68,12 @@ public function getDisplayValues(): array {
"paymentType" => $this->getPaymentName()
];
}

/**
* Get the legacy status {@see LegacyPaymentStatus} for possible values
*
* @deprecated See https://phabricator.wikimedia.org/T281853
* @return string
*/
abstract protected function getLegacyPaymentStatus(): string;
}
6 changes: 6 additions & 0 deletions src/Domain/Model/SofortPayment.php
Expand Up @@ -12,6 +12,8 @@

class SofortPayment extends Payment implements BookablePayment {

use LegacyBookingStatusTrait;

private const PAYMENT_METHOD = 'SUB';

/**
Expand Down Expand Up @@ -48,6 +50,10 @@ public function getValuationDate(): ?DateTimeImmutable {
return $this->valuationDate;
}

public function isBooked(): bool {
return $this->valuationDate !== null && $this->transactionId !== null;
}

public function canBeBooked( array $transactionData ): bool {
return $this->transactionId === null;
}
Expand Down
54 changes: 0 additions & 54 deletions src/Services/LegacyDataProvider.php

This file was deleted.

3 changes: 2 additions & 1 deletion src/UseCases/GetPayment/GetPaymentUseCase.php
Expand Up @@ -73,7 +73,8 @@ private function createExtendedLegacyData( LegacyPaymentData $legacyData, Iban $
$legacyData->amountInEuroCents,
$legacyData->intervalInMonths,
$legacyData->paymentName,
$this->getLegacyBankdataFieldsArray( $extendedBankData )
$this->getLegacyBankdataFieldsArray( $extendedBankData ),
$legacyData->paymentStatus
);
}

Expand Down
23 changes: 22 additions & 1 deletion tests/Unit/Domain/Model/BankTransferPaymentTest.php
Expand Up @@ -7,6 +7,7 @@
use WMDE\Euro\Euro;
use WMDE\Fundraising\PaymentContext\Domain\Model\BankTransferPayment;
use WMDE\Fundraising\PaymentContext\Domain\Model\LegacyPaymentData;
use WMDE\Fundraising\PaymentContext\Domain\Model\LegacyPaymentStatus;
use WMDE\Fundraising\PaymentContext\Domain\Model\PaymentInterval;
use WMDE\Fundraising\PaymentContext\Domain\Model\PaymentReferenceCode;

Expand Down Expand Up @@ -38,7 +39,27 @@ public function testGetLegacyData(): void {
7821,
1,
'UEB',
[ 'ueb_code' => 'XW-TAR-ARA-X' ]
[ 'ueb_code' => 'XW-TAR-ARA-X' ],
LegacyPaymentStatus::BANK_TRANSFER->value
);

$this->assertEquals( $expectedLegacyData, $payment->getLegacyData() );
}

public function testGetLegacyDataForCancelledPayment(): void {
$payment = BankTransferPayment::create(
1,
Euro::newFromCents( 7821 ),
PaymentInterval::Monthly,
new PaymentReferenceCode( 'XW', 'TARARA', 'X' )
);
$payment->cancel();
$expectedLegacyData = new LegacyPaymentData(
7821,
1,
'UEB',
[ 'ueb_code' => 'XW-TAR-ARA-X' ],
LegacyPaymentStatus::CANCELLED->value
);

$this->assertEquals( $expectedLegacyData, $payment->getLegacyData() );
Expand Down
10 changes: 10 additions & 0 deletions tests/Unit/Domain/Model/CreditCardPaymentTest.php
Expand Up @@ -7,6 +7,7 @@
use PHPUnit\Framework\TestCase;
use WMDE\Euro\Euro;
use WMDE\Fundraising\PaymentContext\Domain\Model\CreditCardPayment;
use WMDE\Fundraising\PaymentContext\Domain\Model\LegacyPaymentStatus;
use WMDE\Fundraising\PaymentContext\Domain\Model\PaymentInterval;
use WMDE\Fundraising\PaymentContext\Tests\Data\CreditCardPaymentBookingData;
use WMDE\Fundraising\PaymentContext\Tests\Fixtures\DummyPaymentIdRepository;
Expand Down Expand Up @@ -84,6 +85,15 @@ public function testGivenNewPayment_paymentLegacyDataIsEmptyArray(): void {
$this->assertSame( [], $creditCardPayment->getLegacyData()->paymentSpecificValues );
}

public function testStatusInLegacyDataChangesWithBookedStatus(): void {
$creditCardPayment = new CreditCardPayment( 1, Euro::newFromInt( 1000 ), PaymentInterval::Monthly );
$bookedCreditCardPayment = new CreditCardPayment( 1, Euro::newFromInt( 1000 ), PaymentInterval::Monthly );
$bookedCreditCardPayment->bookPayment( CreditCardPaymentBookingData::newValidBookingData(), new DummyPaymentIdRepository() );

$this->assertSame( LegacyPaymentStatus::EXTERNAL_INCOMPLETE->value, $creditCardPayment->getLegacyData()->paymentStatus );
$this->assertSame( LegacyPaymentStatus::EXTERNAL_BOOKED->value, $bookedCreditCardPayment->getLegacyData()->paymentStatus );
}

public function testGetDisplayDataReturnsAllFieldsToDisplayForBookedPayment(): void {
$creditCardPayment = new CreditCardPayment( 1, Euro::newFromInt( 1000 ), PaymentInterval::Monthly );
$creditCardPayment->bookPayment( CreditCardPaymentBookingData::newValidBookingData(), new DummyPaymentIdRepository() );
Expand Down
6 changes: 5 additions & 1 deletion tests/Unit/Domain/Model/PayPalPaymentTest.php
Expand Up @@ -5,6 +5,7 @@

use PHPUnit\Framework\TestCase;
use WMDE\Euro\Euro;
use WMDE\Fundraising\PaymentContext\Domain\Model\LegacyPaymentStatus;
use WMDE\Fundraising\PaymentContext\Domain\Model\PaymentInterval;
use WMDE\Fundraising\PaymentContext\Domain\Model\PayPalPayment;
use WMDE\Fundraising\PaymentContext\Domain\Repositories\PaymentIDRepository;
Expand Down Expand Up @@ -120,13 +121,14 @@ public function testCreateFollowupDisallowsFollowUpsFromNonRecurringPayments():
);
}

public function testGetLegacyDataIsEmptyForUnbookedPayments(): void {
public function testGetLegacyDataForUnbookedPayments(): void {
$payment = new PayPalPayment( 1, Euro::newFromCents( 1000 ), PaymentInterval::OneTime );

$legacyData = $payment->getLegacyData();

$this->assertSame( [], $legacyData->paymentSpecificValues );
$this->assertSame( 'PPL', $legacyData->paymentName );
$this->assertSame( LegacyPaymentStatus::EXTERNAL_INCOMPLETE->value, $legacyData->paymentStatus );
}

public function testGetLegacyDataHasDataForBookedPayments(): void {
Expand All @@ -140,6 +142,8 @@ public function testGetLegacyDataHasDataForBookedPayments(): void {
$this->assertSame( '42', $legacyData->paymentSpecificValues['paypal_payer_id'] );
$this->assertSame( '8RHHUM3W3PRH7QY6B59', $legacyData->paymentSpecificValues['ext_subscr_id'] );
$this->assertSame( '2022-01-01 01:01:01', $legacyData->paymentSpecificValues['ext_payment_timestamp'] );
// Check booked status
$this->assertSame( LegacyPaymentStatus::EXTERNAL_BOOKED->value, $legacyData->paymentStatus );
}

public function testGetDisplayDataReturnsAllFieldsToDisplayForBookedPayment(): void {
Expand Down
7 changes: 6 additions & 1 deletion tests/Unit/Domain/Model/PaymentTest.php
Expand Up @@ -28,7 +28,8 @@ public function testGetLegacyDataCollectsPaymentInformation(): void {
1199,
0,
'TST',
[ 'value' => 'infinite' ]
[ 'value' => 'infinite' ],
'Y'
);

$this->assertEquals( $expectedLegacyData, $payment->getLegacyData() );
Expand Down Expand Up @@ -76,6 +77,10 @@ protected function getPaymentName(): string {
protected function getPaymentSpecificLegacyData(): array {
return [ 'value' => 'infinite' ];
}

protected function getLegacyPaymentStatus(): string {
return 'Y';
}
};
}
}
10 changes: 10 additions & 0 deletions tests/Unit/Domain/Model/SofortPaymentTest.php
Expand Up @@ -6,6 +6,7 @@

use PHPUnit\Framework\TestCase;
use WMDE\Euro\Euro;
use WMDE\Fundraising\PaymentContext\Domain\Model\LegacyPaymentStatus;
use WMDE\Fundraising\PaymentContext\Domain\Model\PaymentInterval;
use WMDE\Fundraising\PaymentContext\Domain\Model\PaymentReferenceCode;
use WMDE\Fundraising\PaymentContext\Domain\Model\SofortPayment;
Expand Down Expand Up @@ -126,6 +127,15 @@ public function testBookedPaymentHasTransactionDataInLegacyData(): void {
$this->assertEquals( $expectedLegacyData, $legacyData->paymentSpecificValues );
}

public function testStatusInLegacyDataChangesWithBookedStatus(): void {
$sofortPayment = $this->makeSofortPayment();
$bookedSofortPayment = $this->makeSofortPayment();
$bookedSofortPayment->bookPayment( $this->makeValidTransactionData(), new DummyPaymentIdRepository() );

$this->assertSame( LegacyPaymentStatus::EXTERNAL_INCOMPLETE->value, $sofortPayment->getLegacyData()->paymentStatus );
$this->assertSame( LegacyPaymentStatus::EXTERNAL_BOOKED->value, $bookedSofortPayment->getLegacyData()->paymentStatus );
}

public function testGetDisplayDataReturnsAllFieldsToDisplay(): void {
$payment = $this->makeSofortPayment();
$payment->bookPayment( $this->makeValidTransactionData(), new DummyPaymentIdRepository() );
Expand Down

0 comments on commit dfc4758

Please sign in to comment.