mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-07 18:44:08 +00:00
add address suggestion by household
This commit is contained in:
parent
5ef5b65d90
commit
886924a7e5
@ -6,10 +6,12 @@ use Chill\MainBundle\CRUD\Controller\ApiController;
|
|||||||
use Chill\MainBundle\Entity\Address;
|
use Chill\MainBundle\Entity\Address;
|
||||||
use Chill\MainBundle\Serializer\Model\Collection;
|
use Chill\MainBundle\Serializer\Model\Collection;
|
||||||
use Chill\PersonBundle\Entity\Person;
|
use Chill\PersonBundle\Entity\Person;
|
||||||
|
use Chill\PersonBundle\Entity\Household\Household;
|
||||||
use Chill\PersonBundle\Repository\Household\HouseholdRepository;
|
use Chill\PersonBundle\Repository\Household\HouseholdRepository;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
|
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
|
||||||
|
use Symfony\Component\Routing\Annotation\Route;
|
||||||
|
|
||||||
class HouseholdApiController extends ApiController
|
class HouseholdApiController extends ApiController
|
||||||
{
|
{
|
||||||
@ -50,4 +52,45 @@ class HouseholdApiController extends ApiController
|
|||||||
return $this->json($collection, Response::HTTP_OK, [],
|
return $this->json($collection, Response::HTTP_OK, [],
|
||||||
[ "groups" => ["read"]]);
|
[ "groups" => ["read"]]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Route("/api/1.0/person/address/suggest/by-household/{household_id}.{_format}",
|
||||||
|
* name="chill_person_address_suggest_by_household",
|
||||||
|
* requirements={
|
||||||
|
* "_format"="json"
|
||||||
|
* }
|
||||||
|
* )
|
||||||
|
* @ParamConverter("household", options={"id" = "household_id"})
|
||||||
|
*/
|
||||||
|
public function suggestAddressByHousehold(Household $household, string $_format)
|
||||||
|
{
|
||||||
|
// TODO add acl
|
||||||
|
|
||||||
|
$addresses = [];
|
||||||
|
// collect addresses from location in courses
|
||||||
|
foreach ($household->getCurrentPersons() as $person) {
|
||||||
|
foreach ($person->getAccompanyingPeriodParticipations() as $participation) {
|
||||||
|
if (null !== $participation->getAccompanyingPeriod()->getAddressLocation()) {
|
||||||
|
$a = $participation->getAccompanyingPeriod()->getAddressLocation();
|
||||||
|
$addresses[$a->getId()] = $a;
|
||||||
|
}
|
||||||
|
if (null !== $personLocation = $participation
|
||||||
|
->getAccompanyingPeriod()->getPersonLocation()) {
|
||||||
|
$a = $personLocation->getCurrentHouseholdAddress();
|
||||||
|
if (null !== $a) {
|
||||||
|
$addresses[$a->getId()] = $a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove the actual address
|
||||||
|
$actual = $household->getCurrentAddress();
|
||||||
|
if (null !== $actual) {
|
||||||
|
$addresses = \array_filter($addresses, fn($a) => $a !== $actual);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->json(\array_values($addresses), Response::HTTP_OK, [],
|
||||||
|
[ 'groups' => [ 'read' ] ]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -77,13 +77,15 @@ class PersonApiController extends ApiController
|
|||||||
$a = $participation->getAccompanyingPeriod()->getAddressLocation();
|
$a = $participation->getAccompanyingPeriod()->getAddressLocation();
|
||||||
$addresses[$a->getId()] = $a;
|
$addresses[$a->getId()] = $a;
|
||||||
}
|
}
|
||||||
if (null !== $participation->getAccompanyingPeriod()->getPersonLocation()) {
|
if (null !== $personLocation = $participation
|
||||||
$a = $participation->getAccompanyingPeriod()->getAddressLocation();
|
->getAccompanyingPeriod()->getPersonLocation()) {
|
||||||
$addresses[$a->getId()] = $a;
|
$a = $personLocation->getCurrentHouseholdAddress();
|
||||||
|
if (null !== $a) {
|
||||||
|
$addresses[$a->getId()] = $a;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
\array_unique($addresses);
|
|
||||||
// remove the actual address
|
// remove the actual address
|
||||||
$actual = $person->getCurrentHouseholdAddress();
|
$actual = $person->getCurrentHouseholdAddress();
|
||||||
if (null !== $actual) {
|
if (null !== $actual) {
|
||||||
|
@ -4,6 +4,7 @@ namespace Chill\PersonBundle\Tests\Controller;
|
|||||||
|
|
||||||
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
||||||
use Chill\MainBundle\Test\PrepareClientTrait;
|
use Chill\MainBundle\Test\PrepareClientTrait;
|
||||||
|
use Chill\PersonBundle\Entity\Household\Household;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
|
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
|
||||||
@ -29,6 +30,21 @@ class HouseholdApiControllerTest extends WebTestCase
|
|||||||
$this->assertResponseIsSuccessful();
|
$this->assertResponseIsSuccessful();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider generateHouseholdId
|
||||||
|
*/
|
||||||
|
public function testSuggestAddressByHousehold(int $householdId)
|
||||||
|
{
|
||||||
|
$client = $this->getClientAuthenticated();
|
||||||
|
|
||||||
|
$client->request(
|
||||||
|
Request::METHOD_GET,
|
||||||
|
"/api/1.0/person/address/suggest/by-household/{$householdId}.json"
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertResponseIsSuccessful();
|
||||||
|
}
|
||||||
|
|
||||||
public function generatePersonId()
|
public function generatePersonId()
|
||||||
{
|
{
|
||||||
self::bootKernel();
|
self::bootKernel();
|
||||||
@ -51,5 +67,33 @@ class HouseholdApiControllerTest extends WebTestCase
|
|||||||
->first()->getPerson();
|
->first()->getPerson();
|
||||||
|
|
||||||
yield [ $person->getId() ];
|
yield [ $person->getId() ];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function generateHouseholdId()
|
||||||
|
{
|
||||||
|
self::bootKernel();
|
||||||
|
|
||||||
|
$qb = self::$container->get(EntityManagerInterface::class)
|
||||||
|
->createQueryBuilder();
|
||||||
|
|
||||||
|
$householdIds = $qb
|
||||||
|
->select('DISTINCT household.id')
|
||||||
|
->from(Household::class, 'household')
|
||||||
|
->join('household.members', 'members')
|
||||||
|
->join('members.person', 'person')
|
||||||
|
->join('person.center', 'center')
|
||||||
|
->where($qb->expr()->eq('center.name', ':center_name'))
|
||||||
|
->andWhere($qb->expr()->gt('SIZE(person.accompanyingPeriodParticipations)', 0))
|
||||||
|
->setParameter('center_name', 'Center A')
|
||||||
|
->setMaxResults(100)
|
||||||
|
->getQuery()
|
||||||
|
->getResult()
|
||||||
|
;
|
||||||
|
|
||||||
|
\shuffle($householdIds);
|
||||||
|
|
||||||
|
yield [ \array_pop($householdIds)['id'] ];
|
||||||
|
yield [ \array_pop($householdIds)['id'] ];
|
||||||
|
yield [ \array_pop($householdIds)['id'] ];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -384,6 +384,34 @@ paths:
|
|||||||
200:
|
200:
|
||||||
description: "OK"
|
description: "OK"
|
||||||
|
|
||||||
|
/1.0/person/address/suggest/by-household/{id}.json:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- address
|
||||||
|
summary: get a list of suggested address for a household
|
||||||
|
description: >
|
||||||
|
The address are computed from various source. Currently:
|
||||||
|
|
||||||
|
- the address of course to which the members is participating
|
||||||
|
|
||||||
|
The current household address is always ignored.
|
||||||
|
parameters:
|
||||||
|
- name: id
|
||||||
|
in: path
|
||||||
|
required: true
|
||||||
|
description: The household id
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
format: integer
|
||||||
|
minimum: 1
|
||||||
|
responses:
|
||||||
|
401:
|
||||||
|
description: "Unauthorized"
|
||||||
|
404:
|
||||||
|
description: "Not found"
|
||||||
|
200:
|
||||||
|
description: "OK"
|
||||||
|
|
||||||
/1.0/person/accompanying-course/{id}.json:
|
/1.0/person/accompanying-course/{id}.json:
|
||||||
get:
|
get:
|
||||||
tags:
|
tags:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user