From 8dbbdb09d31e05fb28161a61468ecd2b348e7361 Mon Sep 17 00:00:00 2001 From: Daniel Subiabre Date: Tue, 2 Jul 2024 14:18:28 +0200 Subject: [PATCH] Accounting::getTransactions returns sorted full history of issued and received transactions --- src/Entity/Accounting.php | 14 ++++++ tests/Entity/AccountingTest.php | 79 ++++++++++++++++++++++++++++++--- 2 files changed, 87 insertions(+), 6 deletions(-) diff --git a/src/Entity/Accounting.php b/src/Entity/Accounting.php index b85d5c4..1b0c30e 100644 --- a/src/Entity/Accounting.php +++ b/src/Entity/Accounting.php @@ -165,6 +165,20 @@ class Accounting return $this; } + public function getTransactions(): Collection + { + $transactions = [ + ...$this->getTransactionsIssued()->toArray(), + ...$this->getTransactionsReceived()->toArray() + ]; + + \usort($transactions, function ($a, $b) { + return $a->getId() - $b->getId(); + }); + + return new ArrayCollection($transactions); + } + /** * @return Collection */ diff --git a/tests/Entity/AccountingTest.php b/tests/Entity/AccountingTest.php index 5cba5a3..6efd7c3 100644 --- a/tests/Entity/AccountingTest.php +++ b/tests/Entity/AccountingTest.php @@ -8,9 +8,12 @@ use App\Entity\Money; use App\Entity\Tipjar; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; +use Zenstruck\Foundry\Test\ResetDatabase; class AccountingTest extends KernelTestCase { + use ResetDatabase; + private EntityManagerInterface $entityManager; public function setUp(): void @@ -56,13 +59,77 @@ class AccountingTest extends KernelTestCase $this->assertNotNull($accA->getId()); $this->assertNotNull($accB->getId()); - $this->assertCount(1, $accA->getTransactionsIssued()); - $this->assertCount(1, $accB->getTransactionsReceived()); + $this->assertCount(1, $accA->getTransactions()); + $this->assertCount(1, $accB->getTransactions()); - $this->assertEquals(120, $accA->getTransactionsIssued()[0]->getMoney()->amount); - $this->assertEquals('EUR', $accA->getTransactionsIssued()[0]->getMoney()->currency); + $this->assertEquals(120, $accA->getTransactions()[0]->getMoney()->amount); + $this->assertEquals('EUR', $accA->getTransactions()[0]->getMoney()->currency); - $this->assertEquals(120, $accB->getTransactionsReceived()[0]->getMoney()->amount); - $this->assertEquals('EUR', $accB->getTransactionsReceived()[0]->getMoney()->currency); + $this->assertEquals(120, $accB->getTransactions()[0]->getMoney()->amount); + $this->assertEquals('EUR', $accB->getTransactions()[0]->getMoney()->currency); + } + + public function testAccountingSortsMixedTransactions() + { + $tipjarA = new Tipjar(); + $tipjarA->setName('TEST_TIPJAR_A'); + + $accA = new Accounting(); + $accA->setTipjar($tipjarA); + + + $tipjarB = new Tipjar(); + $tipjarB->setName('TEST_TIPJAR_B'); + + $accB = new Accounting(); + $accB->setTipjar($tipjarB); + + $trx1 = new AccountingTransaction(); + $trx1->setMoney(new Money(1, 'EUR')); + $trx1->setOrigin($accA); + $trx1->setTarget($accB); + + $trx2 = new AccountingTransaction(); + $trx2->setMoney(new Money(2, 'USD')); + $trx2->setOrigin($accB); + $trx2->setTarget($accA); + + $this->entityManager->persist($trx1); + $this->entityManager->persist($trx2); + $this->entityManager->flush(); + + /** @var Accounting */ + $accA = $this->entityManager->getRepository(Tipjar::class) + ->findOneBy(['name' => 'TEST_TIPJAR_A']) + ->getAccounting(); + + /** @var Accounting */ + $accB = $this->entityManager->getRepository(Tipjar::class) + ->findOneBy(['name' => 'TEST_TIPJAR_B']) + ->getAccounting(); + + $this->assertNotNull($accA->getId()); + $this->assertNotNull($accB->getId()); + + $this->assertCount(2, $accA->getTransactions()); + $this->assertCount(2, $accB->getTransactions()); + + $this->assertEquals(1, $accA->getTransactions()[0]->getMoney()->amount); + $this->assertEquals('EUR', $accA->getTransactions()[0]->getMoney()->currency); + + $this->assertEquals(1, $accB->getTransactions()[0]->getMoney()->amount); + $this->assertEquals('EUR', $accB->getTransactions()[0]->getMoney()->currency); + + $this->assertEquals(2, $accA->getTransactions()[1]->getMoney()->amount); + $this->assertEquals('USD', $accA->getTransactions()[1]->getMoney()->currency); + + $this->assertEquals(2, $accB->getTransactions()[1]->getMoney()->amount); + $this->assertEquals('USD', $accB->getTransactions()[1]->getMoney()->currency); + + $this->assertEquals($accA, $accA->getTransactions()[0]->getOrigin()); + $this->assertEquals($accA, $accA->getTransactions()[1]->getTarget()); + + $this->assertEquals($accB, $accB->getTransactions()[1]->getOrigin()); + $this->assertEquals($accB, $accB->getTransactions()[0]->getTarget()); } }