diff --git a/src/Bundle/ChillActivityBundle/DataFixtures/ORM/LoadActivity.php b/src/Bundle/ChillActivityBundle/DataFixtures/ORM/LoadActivity.php
index de1ea97c2..ce32143f5 100644
--- a/src/Bundle/ChillActivityBundle/DataFixtures/ORM/LoadActivity.php
+++ b/src/Bundle/ChillActivityBundle/DataFixtures/ORM/LoadActivity.php
@@ -138,11 +138,15 @@ class LoadActivity extends AbstractFixture implements OrderedFixtureInterface, C
foreach($persons as $person) {
$activityNbr = rand(0,3);
+ $ref = 'activity_'.$person->getFullnameCanonical();
+
for($i = 0; $i < $activityNbr; $i ++) {
- print "Creating an activity type for : ".$person."\n";
+ print "Creating an activity type for : ".$person." (ref: ".$ref.") \n";
$activity = $this->newRandomActivity($person);
$manager->persist($activity);
}
+
+ $this->setReference($ref, $activity);
}
$manager->flush();
}
diff --git a/src/Bundle/ChillActivityBundle/DataFixtures/ORM/LoadActivityNotifications.php b/src/Bundle/ChillActivityBundle/DataFixtures/ORM/LoadActivityNotifications.php
new file mode 100644
index 000000000..7835a0db4
--- /dev/null
+++ b/src/Bundle/ChillActivityBundle/DataFixtures/ORM/LoadActivityNotifications.php
@@ -0,0 +1,38 @@
+ 'Hello !',
+ 'entityClass' => Activity::class,
+ 'entityRef' => 'activity_gerard depardieu',
+ 'sender' => 'center a_social',
+ 'addressees' => [
+ 'center a_administrative',
+ 'center a_direction',
+ 'multi_center'
+ ],
+ ]
+ ];
+
+ public function getDependencies()
+ {
+ return [
+ LoadActivity::class,
+ ];
+ }
+}
diff --git a/src/Bundle/ChillMainBundle/DataFixtures/ORM/LoadAbstractNotificationsTrait.php b/src/Bundle/ChillMainBundle/DataFixtures/ORM/LoadAbstractNotificationsTrait.php
new file mode 100644
index 000000000..071f67497
--- /dev/null
+++ b/src/Bundle/ChillMainBundle/DataFixtures/ORM/LoadAbstractNotificationsTrait.php
@@ -0,0 +1,41 @@
+notifs as $notif) {
+ $entityId = $this->getReference($notif['entityRef'])->getId();
+
+ print('Adding notification for '.$notif['entityClass'].'(entity id:'.$entityId.")\n");
+
+ $newNotif = (new Notification())
+ ->setMessage($notif['message'])
+ ->setSender($this->getReference($notif['sender']))
+ ->setRelatedEntityClass($notif['entityClass'])
+ ->setRelatedEntityId($entityId)
+ ->setDate(new \DateTimeImmutable('now'))
+ ->setRead([])
+ ;
+
+ foreach ($notif['addressees'] as $addressee) {
+ $newNotif->addAddressee($this->getReference($addressee));
+ }
+
+ $manager->persist($newNotif);
+
+ $manager->flush();
+ }
+ }
+}
diff --git a/src/Bundle/ChillMainBundle/Entity/Notification.php b/src/Bundle/ChillMainBundle/Entity/Notification.php
new file mode 100644
index 000000000..092445c9b
--- /dev/null
+++ b/src/Bundle/ChillMainBundle/Entity/Notification.php
@@ -0,0 +1,187 @@
+
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+namespace Chill\MainBundle\Entity;
+
+use Chill\MainBundle\Entity\User;
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+use Doctrine\ORM\Mapping as ORM;
+
+/**
+ * @ORM\Entity
+ * @ORM\Table(
+ * name="chill_main_notification",
+ * uniqueConstraints={
+ * @ORM\UniqueConstraint(columns={"relatedEntityClass", "relatedEntityId"})
+ * }
+ * )
+ */
+class Notification
+{
+ /**
+ * @ORM\Id
+ * @ORM\GeneratedValue
+ * @ORM\Column(type="integer")
+ */
+ private int $id;
+
+ /**
+ * @ORM\Column(type="text")
+ */
+ private string $message;
+
+ /**
+ * @ORM\Column(type="datetime_immutable")
+ */
+ private \DateTimeImmutable $date;
+
+ /**
+ * @ORM\ManyToOne(targetEntity=User::class)
+ * @ORM\JoinColumn(nullable=false)
+ */
+ private User $sender;
+
+ /**
+ * @ORM\ManyToMany(targetEntity=User::class)
+ * @ORM\JoinTable(name="chill_main_notification_addresses_user")
+ */
+ private Collection $addressees;
+
+ /**
+ * @ORM\Column(type="string", length=255)
+ */
+ private string $relatedEntityClass;
+
+ /**
+ * @ORM\Column(type="integer")
+ */
+ private int $relatedEntityId;
+
+ /**
+ * @ORM\Column(type="json")
+ */
+ private array $read;
+
+ public function __construct()
+ {
+ $this->addressees = new ArrayCollection();
+ }
+
+ public function getId(): ?int
+ {
+ return $this->id;
+ }
+
+ public function getMessage(): ?string
+ {
+ return $this->message;
+ }
+
+ public function setMessage(string $message): self
+ {
+ $this->message = $message;
+
+ return $this;
+ }
+
+ public function getDate(): ?\DateTimeImmutable
+ {
+ return $this->date;
+ }
+
+ public function setDate(\DateTimeImmutable $date): self
+ {
+ $this->date = $date;
+
+ return $this;
+ }
+
+ public function getSender(): ?User
+ {
+ return $this->sender;
+ }
+
+ public function setSender(?User $sender): self
+ {
+ $this->sender = $sender;
+
+ return $this;
+ }
+
+ /**
+ * @return Collection|User[]
+ */
+ public function getAddressees(): Collection
+ {
+ return $this->addressees;
+ }
+
+ public function addAddressee(User $addressee): self
+ {
+ if (!$this->addressees->contains($addressee)) {
+ $this->addressees[] = $addressee;
+ }
+
+ return $this;
+ }
+
+ public function removeAddressee(User $addressee): self
+ {
+ $this->addressees->removeElement($addressee);
+
+ return $this;
+ }
+
+ public function getRelatedEntityClass(): ?string
+ {
+ return $this->relatedEntityClass;
+ }
+
+ public function setRelatedEntityClass(string $relatedEntityClass): self
+ {
+ $this->relatedEntityClass = $relatedEntityClass;
+
+ return $this;
+ }
+
+ public function getRelatedEntityId(): ?int
+ {
+ return $this->relatedEntityId;
+ }
+
+ public function setRelatedEntityId(int $relatedEntityId): self
+ {
+ $this->relatedEntityId = $relatedEntityId;
+
+ return $this;
+ }
+
+ public function getRead(): array
+ {
+ return $this->read;
+ }
+
+ public function setRead(array $read): self
+ {
+ $this->read = $read;
+
+ return $this;
+ }
+}
diff --git a/src/Bundle/ChillMainBundle/Entity/PostalCode.php b/src/Bundle/ChillMainBundle/Entity/PostalCode.php
index 61527e422..910245680 100644
--- a/src/Bundle/ChillMainBundle/Entity/PostalCode.php
+++ b/src/Bundle/ChillMainBundle/Entity/PostalCode.php
@@ -54,6 +54,13 @@ class PostalCode
*/
private $country;
+ /**
+ * @var integer
+ *
+ * @ORM\Column(name="origin", type="integer", nullable=true)
+ * @groups({"write", "read"})
+ */
+ private $origin = 0;
/**
* Get id
@@ -65,6 +72,32 @@ class PostalCode
return $this->id;
}
+
+ /**
+ * Set origin
+ *
+ * @param int $origin
+ *
+ * @return PostalCode
+ */
+ public function setOrigin($origin)
+ {
+ $this->origin = $origin;
+
+ return $this;
+ }
+
+ /**
+ * Get origin
+ *
+ * @return int
+ */
+ public function getOrigin()
+ {
+ return $this->origin;
+ }
+
+
/**
* Set name
*
diff --git a/src/Bundle/ChillMainBundle/Repository/NotificationRepository.php b/src/Bundle/ChillMainBundle/Repository/NotificationRepository.php
new file mode 100644
index 000000000..844459f8b
--- /dev/null
+++ b/src/Bundle/ChillMainBundle/Repository/NotificationRepository.php
@@ -0,0 +1,66 @@
+
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+namespace Chill\MainBundle\Repository;
+
+use Chill\MainBundle\Entity\Notification;
+use Doctrine\ORM\EntityManagerInterface;
+use Doctrine\ORM\EntityRepository;
+use Doctrine\Persistence\ObjectRepository;
+
+final class NotificationRepository implements ObjectRepository
+{
+ private EntityRepository $repository;
+
+ public function __construct(EntityManagerInterface $entityManager)
+ {
+ $this->repository = $entityManager->getRepository(Notification::class);
+ }
+
+ public function find($id, $lockMode = null, $lockVersion = null): ?Notification
+ {
+ return $this->repository->find($id, $lockMode, $lockVersion);
+ }
+
+ public function findOneBy(array $criteria, array $orderBy = null): ?Notification
+ {
+ return $this->repository->findOneBy($criteria, $orderBy);
+ }
+
+ /**
+ * @return Notification[]
+ */
+ public function findAll(): array
+ {
+ return $this->repository->findAll();
+ }
+
+ /**
+ * @return Notification[]
+ */
+ public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null): array
+ {
+ return $this->repository->findBy($criteria, $orderBy, $limit, $offset);
+ }
+
+ public function getClassName() {
+ return Notification::class;
+ }
+
+}
diff --git a/src/Bundle/ChillMainBundle/Resources/public/scss/chillmain.scss b/src/Bundle/ChillMainBundle/Resources/public/scss/chillmain.scss
index cedc04e10..741dfb119 100644
--- a/src/Bundle/ChillMainBundle/Resources/public/scss/chillmain.scss
+++ b/src/Bundle/ChillMainBundle/Resources/public/scss/chillmain.scss
@@ -248,6 +248,9 @@ div.address_form {
display: flex;
flex-direction: column;
flex-grow: 1;
+ div.custom-address, div.custom-postcode {
+ padding: 12px;
+ }
}
div.address_form__select__map {
@@ -255,11 +258,19 @@ div.address_form {
div#address_map {
height:400px;
width:400px;
+ input {
+ border: 1px solid #999;
+ }
}
}
}
div.address_form__more {
-
+ & > div {
+ display: flex;
+ & > label {
+ width: 30%;
+ }
+ }
}
}
diff --git a/src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/App.vue b/src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/App.vue
index 37dd6aba4..c0d3271ef 100644
--- a/src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/App.vue
+++ b/src/Bundle/ChillMainBundle/Resources/public/vuejs/Address/App.vue
@@ -8,16 +8,12 @@
@addNewAddress="addNewAddress">
+
-
- {{ address.text }}
-
-
- {{ address.postcode.name }}
-
-
- {{ address.country.name }}
-
+
+
@@ -49,11 +45,13 @@
diff --git a/src/Bundle/ChillMainBundle/Serializer/Normalizer/AddressNormalizer.php b/src/Bundle/ChillMainBundle/Serializer/Normalizer/AddressNormalizer.php
index 9cebddfa0..362ed7b26 100644
--- a/src/Bundle/ChillMainBundle/Serializer/Normalizer/AddressNormalizer.php
+++ b/src/Bundle/ChillMainBundle/Serializer/Normalizer/AddressNormalizer.php
@@ -15,9 +15,14 @@ class AddressNormalizer implements NormalizerAwareInterface, NormalizerInterface
{
$data['address_id'] = $address->getId();
$data['text'] = $address->getStreet().', '.$address->getStreetNumber();
+ $data['street'] = $address->getStreet();
+ $data['streetNumber'] = $address->getStreetNumber();
$data['postcode']['name'] = $address->getPostCode()->getName();
+ $data['postcode']['code'] = $address->getPostCode()->getCode();
$data['country']['name'] = $address->getPostCode()->getCountry()->getName();
+ $data['country']['code'] = $address->getPostCode()->getCountry()->getCountryCode();
$data['floor'] = $address->getFloor();
+ $data['corridor'] = $address->getCorridor();
$data['steps'] = $address->getSteps();
$data['flat'] = $address->getBuildingName();
$data['buildingName'] = $address->getFlat();
diff --git a/src/Bundle/ChillMainBundle/migrations/Version20210610140248.php b/src/Bundle/ChillMainBundle/migrations/Version20210610140248.php
new file mode 100644
index 000000000..d54ff4634
--- /dev/null
+++ b/src/Bundle/ChillMainBundle/migrations/Version20210610140248.php
@@ -0,0 +1,42 @@
+addSql('CREATE SEQUENCE chill_main_notification_id_seq INCREMENT BY 1 MINVALUE 1 START 1');
+ $this->addSql('CREATE TABLE chill_main_notification (id INT NOT NULL, sender_id INT NOT NULL, message TEXT NOT NULL, date TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, relatedEntityClass VARCHAR(255) NOT NULL, relatedEntityId INT NOT NULL, read JSONB NOT NULL, PRIMARY KEY(id))');
+ $this->addSql('CREATE INDEX IDX_5BDC8067F624B39D ON chill_main_notification (sender_id)');
+ $this->addSql('CREATE UNIQUE INDEX UNIQ_5BDC8067567988B4440F6072 ON chill_main_notification (relatedEntityClass, relatedEntityId)');
+ $this->addSql('COMMENT ON COLUMN chill_main_notification.date IS \'(DC2Type:datetime_immutable)\'');
+ $this->addSql('CREATE TABLE chill_main_notification_addresses_user (notification_id INT NOT NULL, user_id INT NOT NULL, PRIMARY KEY(notification_id, user_id))');
+ $this->addSql('CREATE INDEX IDX_E52C5D2BEF1A9D84 ON chill_main_notification_addresses_user (notification_id)');
+ $this->addSql('CREATE INDEX IDX_E52C5D2BA76ED395 ON chill_main_notification_addresses_user (user_id)');
+ $this->addSql('ALTER TABLE chill_main_notification ADD CONSTRAINT FK_5BDC8067F624B39D FOREIGN KEY (sender_id) REFERENCES users (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
+ $this->addSql('ALTER TABLE chill_main_notification_addresses_user ADD CONSTRAINT FK_E52C5D2BEF1A9D84 FOREIGN KEY (notification_id) REFERENCES chill_main_notification (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+ $this->addSql('ALTER TABLE chill_main_notification_addresses_user ADD CONSTRAINT FK_E52C5D2BA76ED395 FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
+ }
+
+ public function down(Schema $schema): void
+ {
+ $this->addSql('ALTER TABLE chill_main_notification_addresses_user DROP CONSTRAINT FK_E52C5D2BEF1A9D84');
+ $this->addSql('DROP SEQUENCE chill_main_notification_id_seq CASCADE');
+ $this->addSql('DROP TABLE chill_main_notification');
+ $this->addSql('DROP TABLE chill_main_notification_addresses_user');
+ }
+}
diff --git a/src/Bundle/ChillMainBundle/migrations/Version20210616134328.php b/src/Bundle/ChillMainBundle/migrations/Version20210616134328.php
new file mode 100644
index 000000000..c54f0a183
--- /dev/null
+++ b/src/Bundle/ChillMainBundle/migrations/Version20210616134328.php
@@ -0,0 +1,29 @@
+addSql('ALTER TABLE chill_main_postal_code ADD origin INT DEFAULT NULL');
+ }
+
+ public function down(Schema $schema): void
+ {
+ $this->addSql('ALTER TABLE chill_main_postal_code DROP origin');
+ }
+}
diff --git a/src/Bundle/ChillPersonBundle/Controller/HouseholdController.php b/src/Bundle/ChillPersonBundle/Controller/HouseholdController.php
index 7fc96e8b9..bd70a5ed4 100644
--- a/src/Bundle/ChillPersonBundle/Controller/HouseholdController.php
+++ b/src/Bundle/ChillPersonBundle/Controller/HouseholdController.php
@@ -2,6 +2,7 @@
namespace Chill\PersonBundle\Controller;
+use Chill\MainBundle\Entity\Address;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
@@ -120,4 +121,26 @@ class HouseholdController extends AbstractController
]
);
}
+
+ /**
+ * @Route(
+ * "/{household_id}/address/edit",
+ * name="chill_person_household_address_edit",
+ * methods={"GET", "HEAD", "POST"}
+ * )
+ * @ParamConverter("household", options={"id" = "household_id"})
+ */
+ public function addressEdit(Request $request, Household $household)
+ {
+ // TODO ACL
+ //$address = $this->findAddressById($household, $address_id); //TODO
+
+
+ return $this->render('@ChillPerson/Household/address_edit.html.twig',
+ [
+ 'household' => $household,
+ //'address' => $address,
+ ]
+ );
+ }
}
diff --git a/src/Bundle/ChillPersonBundle/Controller/PersonAddressController.php b/src/Bundle/ChillPersonBundle/Controller/PersonAddressController.php
index f68e1ee9b..5dc6fea46 100644
--- a/src/Bundle/ChillPersonBundle/Controller/PersonAddressController.php
+++ b/src/Bundle/ChillPersonBundle/Controller/PersonAddressController.php
@@ -45,7 +45,7 @@ class PersonAddressController extends AbstractController
* @var ValidatorInterface
*/
protected $validator;
-
+
/**
* PersonAddressController constructor.
*
@@ -55,7 +55,7 @@ class PersonAddressController extends AbstractController
{
$this->validator = $validator;
}
-
+
public function listAction($person_id)
{
$person = $this->getDoctrine()->getManager()
diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdAddress/App.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdAddress/App.vue
index 0c989c310..e42564738 100644
--- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdAddress/App.vue
+++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdAddress/App.vue
@@ -8,12 +8,10 @@
-
- {{ newAddress.text }}
-
-
- {{ newAddress.postcode.name }}
-
+
+
@@ -45,14 +43,17 @@
+ {{ encore_entry_script_tags('household_address') }}
+ {% endblock %}
+
+{% endblock %}
diff --git a/src/Bundle/ChillPersonBundle/Resources/views/Household/addresses.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/Household/addresses.html.twig
index db682e6b1..fcc21765b 100644
--- a/src/Bundle/ChillPersonBundle/Resources/views/Household/addresses.html.twig
+++ b/src/Bundle/ChillPersonBundle/Resources/views/Household/addresses.html.twig
@@ -54,8 +54,10 @@
({{ address.postCode.country.name|localize_translatable_string }})
{% endif %}
+
{% endif %}
+
diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml
index cb4a5bfc7..922e43f24 100644
--- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml
+++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml
@@ -185,6 +185,7 @@ Pick a person: Choisir une personne
No address given: Pas d'adresse renseignée
The address has been successfully updated: L'adresse a été mise à jour avec succès
Update address for %name%: Mettre à jour une adresse pour %name%
+Modify address for %name%: Modifier une adresse pour %name%
Addresses'history for %name%: Historique des adresses de %name%
Addresses'history: Historique des adresses
New address for %name% : Nouvelle adresse pour %name%