Ensure transactions update origin and target accountings
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user