mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-07-01 22:46:13 +00:00
Fixed: add string key for summary of charges and resources into doc generation
This commit is contained in:
parent
c64ec89274
commit
88eefa698b
@ -14,9 +14,8 @@ namespace Chill\BudgetBundle\Repository;
|
|||||||
use Chill\BudgetBundle\Entity\ChargeKind;
|
use Chill\BudgetBundle\Entity\ChargeKind;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use Doctrine\ORM\EntityRepository;
|
use Doctrine\ORM\EntityRepository;
|
||||||
use Doctrine\Persistence\ObjectRepository;
|
|
||||||
|
|
||||||
class ChargeKindRepository implements ObjectRepository
|
final class ChargeKindRepository implements ChargeKindRepositoryInterface
|
||||||
{
|
{
|
||||||
private EntityRepository $repository;
|
private EntityRepository $repository;
|
||||||
|
|
||||||
@ -50,7 +49,8 @@ class ChargeKindRepository implements ObjectRepository
|
|||||||
->where($qb->expr()->eq('c.isActive', 'true'))
|
->where($qb->expr()->eq('c.isActive', 'true'))
|
||||||
->orderBy('c.ordering', 'ASC')
|
->orderBy('c.ordering', 'ASC')
|
||||||
->getQuery()
|
->getQuery()
|
||||||
->getResult();
|
->getResult()
|
||||||
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -77,6 +77,11 @@ class ChargeKindRepository implements ObjectRepository
|
|||||||
return $this->repository->findOneBy($criteria);
|
return $this->repository->findOneBy($criteria);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function findOneByKind(string $kind): ?ChargeKind
|
||||||
|
{
|
||||||
|
return $this->repository->findOneBy(['kind' => $kind]);
|
||||||
|
}
|
||||||
|
|
||||||
public function getClassName(): string
|
public function getClassName(): string
|
||||||
{
|
{
|
||||||
return ChargeKind::class;
|
return ChargeKind::class;
|
||||||
|
@ -0,0 +1,49 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Chill\BudgetBundle\Repository;
|
||||||
|
|
||||||
|
use Chill\BudgetBundle\Entity\ChargeKind;
|
||||||
|
use Doctrine\Persistence\ObjectRepository;
|
||||||
|
|
||||||
|
interface ChargeKindRepositoryInterface extends ObjectRepository
|
||||||
|
{
|
||||||
|
public function find($id): ?ChargeKind;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return ChargeType[]
|
||||||
|
*/
|
||||||
|
public function findAll(): array;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return ChargeType[]
|
||||||
|
*/
|
||||||
|
public function findAllActive(): array;
|
||||||
|
|
||||||
|
public function findOneByKind(string $kind): ?ChargeKind;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return ChargeType[]
|
||||||
|
*/
|
||||||
|
public function findAllByType(string $type): array;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed|null $limit
|
||||||
|
* @param mixed|null $offset
|
||||||
|
*
|
||||||
|
* @return ChargeType[]
|
||||||
|
*/
|
||||||
|
public function findBy(array $criteria, ?array $orderBy = null, ?int $limit = null, ?int $offset = null): array;
|
||||||
|
|
||||||
|
public function findOneBy(array $criteria): ?ChargeKind;
|
||||||
|
|
||||||
|
public function getClassName(): string;
|
||||||
|
}
|
@ -14,9 +14,8 @@ namespace Chill\BudgetBundle\Repository;
|
|||||||
use Chill\BudgetBundle\Entity\ResourceKind;
|
use Chill\BudgetBundle\Entity\ResourceKind;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use Doctrine\ORM\EntityRepository;
|
use Doctrine\ORM\EntityRepository;
|
||||||
use Doctrine\Persistence\ObjectRepository;
|
|
||||||
|
|
||||||
class ResourceKindRepository implements ObjectRepository
|
final class ResourceKindRepository implements ResourceKindRepositoryInterface
|
||||||
{
|
{
|
||||||
private EntityRepository $repository;
|
private EntityRepository $repository;
|
||||||
|
|
||||||
@ -50,7 +49,8 @@ class ResourceKindRepository implements ObjectRepository
|
|||||||
->where($qb->expr()->eq('r.isActive', 'true'))
|
->where($qb->expr()->eq('r.isActive', 'true'))
|
||||||
->orderBy('r.ordering', 'ASC')
|
->orderBy('r.ordering', 'ASC')
|
||||||
->getQuery()
|
->getQuery()
|
||||||
->getResult();
|
->getResult()
|
||||||
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -77,6 +77,11 @@ class ResourceKindRepository implements ObjectRepository
|
|||||||
return $this->repository->findOneBy($criteria);
|
return $this->repository->findOneBy($criteria);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function findOneByKind(string $kind): ?ResourceKind
|
||||||
|
{
|
||||||
|
return $this->repository->findOneBy(['kind' => $kind]);
|
||||||
|
}
|
||||||
|
|
||||||
public function getClassName(): string
|
public function getClassName(): string
|
||||||
{
|
{
|
||||||
return ResourceKind::class;
|
return ResourceKind::class;
|
||||||
|
@ -0,0 +1,49 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Chill\BudgetBundle\Repository;
|
||||||
|
|
||||||
|
use Chill\BudgetBundle\Entity\ResourceKind;
|
||||||
|
use Doctrine\Persistence\ObjectRepository;
|
||||||
|
|
||||||
|
interface ResourceKindRepositoryInterface extends ObjectRepository
|
||||||
|
{
|
||||||
|
public function find($id): ?ResourceKind;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return ResourceType[]
|
||||||
|
*/
|
||||||
|
public function findAll(): array;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return ResourceType[]
|
||||||
|
*/
|
||||||
|
public function findAllActive(): array;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return ResourceType[]
|
||||||
|
*/
|
||||||
|
public function findAllByType(string $type): array;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed|null $limit
|
||||||
|
* @param mixed|null $offset
|
||||||
|
*
|
||||||
|
* @return ResourceType[]
|
||||||
|
*/
|
||||||
|
public function findBy(array $criteria, ?array $orderBy = null, ?int $limit = null, ?int $offset = null): array;
|
||||||
|
|
||||||
|
public function findOneBy(array $criteria): ?ResourceKind;
|
||||||
|
|
||||||
|
public function findOneByKind(string $kind): ?ResourceKind;
|
||||||
|
|
||||||
|
public function getClassName(): string;
|
||||||
|
}
|
@ -14,7 +14,9 @@ namespace Chill\BudgetBundle\Service\Summary;
|
|||||||
use Chill\BudgetBundle\Entity\ChargeKind;
|
use Chill\BudgetBundle\Entity\ChargeKind;
|
||||||
use Chill\BudgetBundle\Entity\ResourceKind;
|
use Chill\BudgetBundle\Entity\ResourceKind;
|
||||||
use Chill\BudgetBundle\Repository\ChargeKindRepository;
|
use Chill\BudgetBundle\Repository\ChargeKindRepository;
|
||||||
|
use Chill\BudgetBundle\Repository\ChargeKindRepositoryInterface;
|
||||||
use Chill\BudgetBundle\Repository\ResourceKindRepository;
|
use Chill\BudgetBundle\Repository\ResourceKindRepository;
|
||||||
|
use Chill\BudgetBundle\Repository\ResourceKindRepositoryInterface;
|
||||||
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
|
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
|
||||||
use Chill\PersonBundle\Entity\Household\Household;
|
use Chill\PersonBundle\Entity\Household\Household;
|
||||||
use Chill\PersonBundle\Entity\Person;
|
use Chill\PersonBundle\Entity\Person;
|
||||||
@ -27,7 +29,7 @@ use function count;
|
|||||||
/**
|
/**
|
||||||
* Helps to find a summary of the budget: the sum of resources and charges.
|
* Helps to find a summary of the budget: the sum of resources and charges.
|
||||||
*/
|
*/
|
||||||
class SummaryBudget implements SummaryBudgetInterface
|
final class SummaryBudget implements SummaryBudgetInterface
|
||||||
{
|
{
|
||||||
private const QUERY_CHARGE_BY_HOUSEHOLD = 'select SUM(amount) AS sum, string_agg(comment, \'|\') AS comment, charge_id AS kind_id FROM chill_budget.charge WHERE (person_id IN (_ids_) OR household_id = ?) AND NOW() BETWEEN startdate AND COALESCE(enddate, \'infinity\'::timestamp) GROUP BY charge_id';
|
private const QUERY_CHARGE_BY_HOUSEHOLD = 'select SUM(amount) AS sum, string_agg(comment, \'|\') AS comment, charge_id AS kind_id FROM chill_budget.charge WHERE (person_id IN (_ids_) OR household_id = ?) AND NOW() BETWEEN startdate AND COALESCE(enddate, \'infinity\'::timestamp) GROUP BY charge_id';
|
||||||
|
|
||||||
@ -37,23 +39,19 @@ class SummaryBudget implements SummaryBudgetInterface
|
|||||||
|
|
||||||
private const QUERY_RESOURCE_BY_PERSON = 'select SUM(amount) AS sum, string_agg(comment, \'|\') AS comment, resource_id AS kind_id FROM chill_budget.resource WHERE person_id = ? AND NOW() BETWEEN startdate AND COALESCE(enddate, \'infinity\'::timestamp) GROUP BY resource_id';
|
private const QUERY_RESOURCE_BY_PERSON = 'select SUM(amount) AS sum, string_agg(comment, \'|\') AS comment, resource_id AS kind_id FROM chill_budget.resource WHERE person_id = ? AND NOW() BETWEEN startdate AND COALESCE(enddate, \'infinity\'::timestamp) GROUP BY resource_id';
|
||||||
|
|
||||||
private ChargeKindRepository $chargeKindRepository;
|
private ChargeKindRepositoryInterface $chargeKindRepository;
|
||||||
|
|
||||||
private array $chargeLabels;
|
|
||||||
|
|
||||||
private EntityManagerInterface $em;
|
private EntityManagerInterface $em;
|
||||||
|
|
||||||
private ResourceKindRepository $resourceKindRepository;
|
private ResourceKindRepositoryInterface $resourceKindRepository;
|
||||||
|
|
||||||
private array $resourcesLabels;
|
|
||||||
|
|
||||||
private TranslatableStringHelperInterface $translatableStringHelper;
|
private TranslatableStringHelperInterface $translatableStringHelper;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
EntityManagerInterface $em,
|
EntityManagerInterface $em,
|
||||||
TranslatableStringHelperInterface $translatableStringHelper,
|
TranslatableStringHelperInterface $translatableStringHelper,
|
||||||
ResourceKindRepository $resourceKindRepository,
|
ResourceKindRepositoryInterface $resourceKindRepository,
|
||||||
ChargeKindRepository $chargeKindRepository
|
ChargeKindRepositoryInterface $chargeKindRepository
|
||||||
) {
|
) {
|
||||||
$this->em = $em;
|
$this->em = $em;
|
||||||
$this->translatableStringHelper = $translatableStringHelper;
|
$this->translatableStringHelper = $translatableStringHelper;
|
||||||
@ -129,19 +127,19 @@ class SummaryBudget implements SummaryBudgetInterface
|
|||||||
|
|
||||||
private function getEmptyChargeArray(): array
|
private function getEmptyChargeArray(): array
|
||||||
{
|
{
|
||||||
$keys = array_map(static fn (ChargeKind $kind) => $kind->getId(), $this->chargeKindRepository->findAll());
|
$keys = array_map(static fn (ChargeKind $kind) => $kind->getKind(), $this->chargeKindRepository->findAll());
|
||||||
|
|
||||||
return array_combine($keys, array_map(function ($id) {
|
return array_combine($keys, array_map(function ($kind) {
|
||||||
return ['sum' => 0.0, 'label' => $this->translatableStringHelper->localize($this->chargeKindRepository->find($id)->getName()), 'comment' => ''];
|
return ['sum' => 0.0, 'label' => $this->translatableStringHelper->localize($this->chargeKindRepository->findOneByKind($kind)->getName()), 'comment' => ''];
|
||||||
}, $keys));
|
}, $keys));
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getEmptyResourceArray(): array
|
private function getEmptyResourceArray(): array
|
||||||
{
|
{
|
||||||
$keys = array_map(static fn (ResourceKind $kind) => $kind->getId(), $this->resourceKindRepository->findAll());
|
$keys = array_map(static fn (ResourceKind $kind) => $kind->getKind(), $this->resourceKindRepository->findAll());
|
||||||
|
|
||||||
return array_combine($keys, array_map(function ($id) {
|
return array_combine($keys, array_map(function ($kind) {
|
||||||
return ['sum' => 0.0, 'label' => $this->translatableStringHelper->localize($this->resourceKindRepository->find($id)->getName()), 'comment' => ''];
|
return ['sum' => 0.0, 'label' => $this->translatableStringHelper->localize($this->resourceKindRepository->findOneByKind($kind)->getName()), 'comment' => ''];
|
||||||
}, $keys));
|
}, $keys));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -152,10 +150,10 @@ class SummaryBudget implements SummaryBudgetInterface
|
|||||||
switch ($kind) {
|
switch ($kind) {
|
||||||
case 'charge':
|
case 'charge':
|
||||||
foreach ($rows as $row) {
|
foreach ($rows as $row) {
|
||||||
$chargeKind = $this->chargeKindRepository->find($row['kind_id']);
|
$chargeKind = $this->chargeKindRepository->findOneByKind($row['kind_id']);
|
||||||
|
|
||||||
if (null === $chargeKind) {
|
if (null === $chargeKind) {
|
||||||
throw new RuntimeException('charge kind not found');
|
throw new RuntimeException('charge kind not found: ' . $row['kind_id']);
|
||||||
}
|
}
|
||||||
$result[$chargeKind->getKind()] = [
|
$result[$chargeKind->getKind()] = [
|
||||||
'sum' => (float) $row['sum'],
|
'sum' => (float) $row['sum'],
|
||||||
@ -168,10 +166,10 @@ class SummaryBudget implements SummaryBudgetInterface
|
|||||||
|
|
||||||
case 'resource':
|
case 'resource':
|
||||||
foreach ($rows as $row) {
|
foreach ($rows as $row) {
|
||||||
$resourceKind = $this->resourceKindRepository->find($row['kind_id']);
|
$resourceKind = $this->resourceKindRepository->findOneByKind($row['kind_id']);
|
||||||
|
|
||||||
if (null === $resourceKind) {
|
if (null === $resourceKind) {
|
||||||
throw new RuntimeException('charge kind not found');
|
throw new RuntimeException('charge kind not found: ' . $row['kind_id']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$result[$resourceKind->getKind()] = [
|
$result[$resourceKind->getKind()] = [
|
||||||
|
@ -0,0 +1,155 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Chill\BudgetBundle\Tests\Service\Summary;
|
||||||
|
|
||||||
|
use Chill\BudgetBundle\Entity\ChargeKind;
|
||||||
|
use Chill\BudgetBundle\Entity\ResourceKind;
|
||||||
|
use Chill\BudgetBundle\Repository\ChargeKindRepositoryInterface;
|
||||||
|
use Chill\BudgetBundle\Repository\ResourceKindRepositoryInterface;
|
||||||
|
use Chill\BudgetBundle\Service\Summary\SummaryBudget;
|
||||||
|
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
|
||||||
|
use Chill\PersonBundle\Entity\Household\Household;
|
||||||
|
use Chill\PersonBundle\Entity\Household\HouseholdMember;
|
||||||
|
use Chill\PersonBundle\Entity\Person;
|
||||||
|
use Doctrine\ORM\AbstractQuery;
|
||||||
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
use Doctrine\ORM\Query;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use Prophecy\Argument;
|
||||||
|
use Prophecy\PhpUnit\ProphecyTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
*
|
||||||
|
* @coversNothing
|
||||||
|
*/
|
||||||
|
final class SummaryBudgetTest extends TestCase
|
||||||
|
{
|
||||||
|
use ProphecyTrait;
|
||||||
|
|
||||||
|
public function testGenerateSummaryForPerson(): void
|
||||||
|
{
|
||||||
|
$queryCharges = $this->prophesize(AbstractQuery::class);
|
||||||
|
$queryCharges->getResult()->willReturn([
|
||||||
|
[
|
||||||
|
'sum' => 250.0,
|
||||||
|
'comment' => '',
|
||||||
|
'kind_id' => 'rental',
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
$queryCharges->setParameters(Argument::type('array'))
|
||||||
|
->will(function ($args, $query) {
|
||||||
|
return $query;
|
||||||
|
})
|
||||||
|
;
|
||||||
|
|
||||||
|
$queryResources = $this->prophesize(AbstractQuery::class);
|
||||||
|
$queryResources->getResult()->willReturn([
|
||||||
|
[
|
||||||
|
'sum' => 1500.0,
|
||||||
|
'comment' => '',
|
||||||
|
'kind_id' => 'salary',
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
$queryResources->setParameters(Argument::type('array'))
|
||||||
|
->will(function ($args, $query) {
|
||||||
|
return $query;
|
||||||
|
})
|
||||||
|
;
|
||||||
|
|
||||||
|
$em = $this->prophesize(EntityManagerInterface::class);
|
||||||
|
$em->createNativeQuery(Argument::type('string'), Argument::type(Query\ResultSetMapping::class))
|
||||||
|
->will(function ($args) use ($queryResources, $queryCharges) {
|
||||||
|
if (false !== strpos($args[0], 'chill_budget.resource')) {
|
||||||
|
return $queryResources->reveal();
|
||||||
|
}
|
||||||
|
if (false !== strpos($args[0], 'chill_budget.charge')) {
|
||||||
|
return $queryCharges->reveal();
|
||||||
|
}
|
||||||
|
throw new \RuntimeException('this query does not have a stub counterpart: '.$args[0]);
|
||||||
|
})
|
||||||
|
;
|
||||||
|
|
||||||
|
$chargeRepository = $this->prophesize(ChargeKindRepositoryInterface::class);
|
||||||
|
$chargeRepository->findAll()->willReturn([
|
||||||
|
$rental = (new ChargeKind())->setKind('rental')->setName(['fr' => 'Rental']),
|
||||||
|
$other = (new ChargeKind())->setKind('other')->setName(['fr' => 'Other']),
|
||||||
|
]);
|
||||||
|
$chargeRepository->findOneByKind('rental')->willReturn($rental);
|
||||||
|
$chargeRepository->findOneByKind('other')->willReturn($other);
|
||||||
|
|
||||||
|
$resourceRepository = $this->prophesize(ResourceKindRepositoryInterface::class);
|
||||||
|
$resourceRepository->findAll()->willReturn([
|
||||||
|
$salary = (new ResourceKind())->setKind('salary')->setName(['fr' => 'Salary']),
|
||||||
|
$misc = (new ResourceKind())->setKind('misc')->setName(['fr' => 'Misc']),
|
||||||
|
]);
|
||||||
|
$resourceRepository->findOneByKind('salary')->willReturn($salary);
|
||||||
|
$resourceRepository->findOneByKind('misc')->willReturn($misc);
|
||||||
|
|
||||||
|
$translatableStringHelper = $this->prophesize(TranslatableStringHelperInterface::class);
|
||||||
|
$translatableStringHelper->localize(Argument::type('array'))->will(function ($arg) {
|
||||||
|
return $arg[0]['fr'];
|
||||||
|
});
|
||||||
|
|
||||||
|
$person = new Person();
|
||||||
|
$personReflection = new \ReflectionClass($person);
|
||||||
|
$personIdReflection = $personReflection->getProperty('id');
|
||||||
|
$personIdReflection->setAccessible(true);
|
||||||
|
$personIdReflection->setValue($person, 1);
|
||||||
|
|
||||||
|
$household = new Household();
|
||||||
|
$householdReflection = new \ReflectionClass($household);
|
||||||
|
$householdReflection->getProperty('id')->setAccessible(true);
|
||||||
|
$householdReflection->getProperty('id')->setValue($household, 1);
|
||||||
|
$householdMember = (new HouseholdMember())->setPerson($person)
|
||||||
|
->setStartDate(new \DateTimeImmutable('1 month ago'))
|
||||||
|
;
|
||||||
|
$household->addMember($householdMember);
|
||||||
|
|
||||||
|
$summaryBudget = new SummaryBudget(
|
||||||
|
$em->reveal(),
|
||||||
|
$translatableStringHelper->reveal(),
|
||||||
|
$resourceRepository->reveal(),
|
||||||
|
$chargeRepository->reveal()
|
||||||
|
);
|
||||||
|
|
||||||
|
$summary = $summaryBudget->getSummaryForPerson($person);
|
||||||
|
$summaryForHousehold = $summaryBudget->getSummaryForHousehold($household);
|
||||||
|
|
||||||
|
// we check the structure for the summary. The structure is the same for household
|
||||||
|
// and persons
|
||||||
|
|
||||||
|
$expected = [
|
||||||
|
'charges' => [
|
||||||
|
'rental' => ['sum' => 250.0, 'comment' => '', 'label' => 'Rental'],
|
||||||
|
'other' => ['sum' => 0.0, 'comment' => '', 'label' => 'Other'],
|
||||||
|
],
|
||||||
|
'resources' => [
|
||||||
|
'salary' => ['sum' => 1500.0, 'comment' => '', 'label' => 'Salary'],
|
||||||
|
'misc' => ['sum' => 0.0, 'comment' => '', 'label' => 'Misc'],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ([$summaryForHousehold, $summary] as $summary) {
|
||||||
|
$this->assertIsArray($summary);
|
||||||
|
$this->assertEqualsCanonicalizing(['charges', 'resources'], array_keys($summary));
|
||||||
|
$this->assertEqualsCanonicalizing(['rental', 'other'], array_keys($summary['charges']));
|
||||||
|
$this->assertEqualsCanonicalizing(['salary', 'misc'], array_keys($summary['resources']));
|
||||||
|
|
||||||
|
foreach ($expected as $resCha => $contains) {
|
||||||
|
foreach ($contains as $kind => $row) {
|
||||||
|
$this->assertEqualsCanonicalizing($row, $summary[$resCha][$kind]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Validator\AccompanyingPeriod;
|
||||||
|
|
||||||
|
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
||||||
|
use Chill\PersonBundle\Entity\AccompanyingPeriodParticipation;
|
||||||
|
use Chill\PersonBundle\Entity\Person;
|
||||||
|
use Chill\PersonBundle\Templating\Entity\PersonRenderInterface;
|
||||||
|
use Chill\PersonBundle\Validator\Constraints\AccompanyingPeriod\ParticipationOverlap;
|
||||||
|
use Chill\PersonBundle\Validator\Constraints\AccompanyingPeriod\ParticipationOverlapValidator;
|
||||||
|
use Chill\ThirdPartyBundle\Entity\ThirdParty;
|
||||||
|
use Chill\ThirdPartyBundle\Templating\Entity\ThirdPartyRender;
|
||||||
|
use Doctrine\Common\Collections\ArrayCollection;
|
||||||
|
use Prophecy\Argument;
|
||||||
|
use Prophecy\PhpUnit\ProphecyTrait;
|
||||||
|
use Symfony\Component\Validator\Test\ConstraintValidatorTestCase;
|
||||||
|
|
||||||
|
class ParticipationOverlapValidatorTest extends ConstraintValidatorTestCase
|
||||||
|
{
|
||||||
|
use ProphecyTrait;
|
||||||
|
|
||||||
|
protected function createValidator()
|
||||||
|
{
|
||||||
|
$personRender = $this->prophesize(PersonRenderInterface::class);
|
||||||
|
$personRender->renderString(Argument::is(Person::class), [])->willReturn('person');
|
||||||
|
$thirdPartyRender = $this->prophesize(ThirdPartyRender::class);
|
||||||
|
$thirdPartyRender->renderString(Argument::is(ThirdParty::class), [])->willReturn('thirdparty');
|
||||||
|
|
||||||
|
return new ParticipationOverlapValidator($personRender->reveal(), $thirdPartyRender->reveal());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testOneParticipation()
|
||||||
|
{
|
||||||
|
$period = new AccompanyingPeriod();
|
||||||
|
$person = new Person();
|
||||||
|
|
||||||
|
$collection = new ArrayCollection([
|
||||||
|
new AccompanyingPeriodParticipation($period, $person)
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->validator->validate($collection, $this->getConstraint());
|
||||||
|
|
||||||
|
$this->assertNoViolation();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function getConstraint()
|
||||||
|
{
|
||||||
|
return new ParticipationOverlap();
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user