Ensure transactions update origin and target accountings

This commit is contained in:
2024-10-11 13:51:47 +02:00
parent 7aa60ffce6
commit d3c9bd9b80
2 changed files with 81 additions and 0 deletions
@@ -0,0 +1,34 @@
<?php
namespace App\EventListener;
use App\Entity\AccountingTransaction;
use Doctrine\Bundle\DoctrineBundle\Attribute\AsEntityListener;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Event\PostPersistEventArgs;
use Doctrine\ORM\Events;
#[AsEntityListener(event: Events::postPersist, method: 'postPersist', entity: AccountingTransaction::class)]
final class AccountingTransactionsListener
{
public function __construct(
private EntityManagerInterface $entityManager
) {}
public function postPersist(
AccountingTransaction $transaction,
PostPersistEventArgs $event
) {
$origin = $transaction->getOrigin();
$origin->addTransactionsIssued($transaction);
$this->entityManager->persist($origin);
$target = $transaction->getTarget();
$target->addTransactionsReceived($transaction);
$this->entityManager->persist($target);
$this->entityManager->flush();
}
}
+47
View File
@@ -3,6 +3,8 @@
namespace App\Tests\Entity;
use App\Entity\Accounting;
use App\Entity\AccountingTransaction;
use App\Entity\Money;
use App\Entity\Tipjar;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
@@ -59,4 +61,49 @@ class AccountingTest extends KernelTestCase
$this->assertEquals(Tipjar::class, $accountingB->getOwnerClass());
$this->assertEquals('TEST_TIPJAR_B', $accountingB->getTipjar()->getName());
}
public function testAccountingGetsUpdatedByTransactions()
{
$tipjarA = new Tipjar();
$tipjarA->setName('TEST_TIPJAR_A');
$accountingA = new Accounting();
$accountingA->setTipjar($tipjarA);
$tipjarB = new Tipjar();
$tipjarB->setName('TEST_TIPJAR_B');
$accountingB = new Accounting();
$accountingB->setTipjar($tipjarB);
$transaction = new AccountingTransaction();
$transaction->setMoney(new Money(120, 'EUR'));
$transaction->setOrigin($accountingA);
$transaction->setTarget($accountingB);
$this->entityManager->persist($transaction);
$this->entityManager->flush();
$accountingA = $this->entityManager
->getRepository(Tipjar::class)
->findOneBy(['name' => 'TEST_TIPJAR_A'])
->getAccounting();
$accountingB = $this->entityManager
->getRepository(Tipjar::class)
->findOneBy(['name' => 'TEST_TIPJAR_B'])
->getAccounting();
$this->assertCount(1, $accountingA->getTransactionsIssued());
$this->assertCount(0, $accountingA->getTransactionsReceived());
$this->assertCount(0, $accountingB->getTransactionsIssued());
$this->assertCount(1, $accountingB->getTransactionsReceived());
$this->assertEquals(120, $accountingA->getTransactionsIssued()[0]->getMoney()->amount);
$this->assertEquals('EUR', $accountingA->getTransactionsIssued()[0]->getMoney()->currency);
$this->assertEquals(120, $accountingB->getTransactionsReceived()[0]->getMoney()->amount);
$this->assertEquals('EUR', $accountingB->getTransactionsReceived()[0]->getMoney()->currency);
}
}