diff --git a/src/Bundle/ChillMainBundle/Form/Type/CommentType.php b/src/Bundle/ChillMainBundle/Form/Type/CommentType.php index a6e664769..2e9a19717 100644 --- a/src/Bundle/ChillMainBundle/Form/Type/CommentType.php +++ b/src/Bundle/ChillMainBundle/Form/Type/CommentType.php @@ -51,7 +51,7 @@ class CommentType extends AbstractType $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) { $data = $event->getForm()->getData(); - $comment = $event->getData(); + $comment = $event->getData() ?? ['comment' => '']; if ($data->getComment() !== $comment['comment']) { $data->setDate(new \DateTime()); diff --git a/src/Bundle/ChillPersonBundle/DependencyInjection/Configuration.php b/src/Bundle/ChillPersonBundle/DependencyInjection/Configuration.php index 3ebe3ceb1..927612d5f 100644 --- a/src/Bundle/ChillPersonBundle/DependencyInjection/Configuration.php +++ b/src/Bundle/ChillPersonBundle/DependencyInjection/Configuration.php @@ -78,6 +78,7 @@ class Configuration implements ConfigurationInterface ->append($this->addFieldNode('address')) ->append($this->addFieldNode('accompanying_period')) ->append($this->addFieldNode('memo')) + ->append($this->addFieldNode('number_of_children')) ->arrayNode('alt_names') ->defaultValue([]) ->arrayPrototype() @@ -130,7 +131,7 @@ class Configuration implements ConfigurationInterface { $tree = new TreeBuilder($key,'enum'); $node = $tree->getRootNode($key); - + switch($key) { case 'accompanying_period': $info = "If the accompanying periods are shown"; diff --git a/src/Bundle/ChillPersonBundle/Entity/Person.php b/src/Bundle/ChillPersonBundle/Entity/Person.php index 7efbb3eca..3cd0eacd5 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Person.php +++ b/src/Bundle/ChillPersonBundle/Entity/Person.php @@ -23,13 +23,17 @@ namespace Chill\PersonBundle\Entity; */ use ArrayIterator; +use Chill\MainBundle\Doctrine\Model\TrackCreationInterface; +use Chill\MainBundle\Doctrine\Model\TrackUpdateInterface; use Chill\MainBundle\Entity\Center; use Chill\MainBundle\Entity\Country; +use Chill\MainBundle\Entity\User; use Chill\PersonBundle\Entity\Household\Household; use Chill\PersonBundle\Entity\MaritalStatus; use Chill\PersonBundle\Entity\Household\HouseholdMember; use Chill\MainBundle\Entity\HasCenterInterface; use Chill\MainBundle\Entity\Address; +use Chill\MainBundle\Entity\Embeddable\CommentEmbeddable; use DateTime; use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\Collection; @@ -53,7 +57,7 @@ use Chill\PersonBundle\Entity\Household\PersonHouseholdAddress; * "person"=Person::class * }) */ -class Person implements HasCenterInterface +class Person implements HasCenterInterface, TrackCreationInterface, TrackUpdateInterface { /** * The person's id @@ -100,6 +104,14 @@ class Person implements HasCenterInterface */ private $birthdate; //to change in birthdate + /** + * The person's deathdate + * @var \DateTimeImmutable + * + * @ORM\Column(type="date_immutable", nullable=true) + */ + private ?\DateTimeImmutable $deathdate; + /** * The person's place of birth * @var string @@ -143,6 +155,14 @@ class Person implements HasCenterInterface const MALE_GENDER = 'man'; const FEMALE_GENDER = 'woman'; const BOTH_GENDER = 'both'; + const NO_INFORMATION = 'unknown'; + + /** + * Comment on gender + * @var CommentEmbeddable + * @ORM\Embedded(class="Chill\MainBundle\Entity\Embeddable\CommentEmbeddable", columnPrefix="genderComment_") + */ + private CommentEmbeddable $genderComment; /** * The marital status of the person @@ -153,6 +173,21 @@ class Person implements HasCenterInterface */ private $maritalStatus; + /** + * The date of the last marital status change of the person + * @var \DateTime + * + * @ORM\Column(type="date", nullable=true) + */ + private $maritalStatusDate; + + /** + * Comment on marital status + * @var CommentEmbeddable + * @ORM\Embedded(class="Chill\MainBundle\Entity\Embeddable\CommentEmbeddable", columnPrefix="maritalStatusComment_") + */ + private CommentEmbeddable $maritalStatusComment; + /** * Contact information for contacting the person * @var string @@ -240,6 +275,54 @@ class Person implements HasCenterInterface */ private $memo = ''; // TO-CHANGE in remark + + /** + * Accept short text message (aka SMS) + * @var boolean + * + * @ORM\Column(type="boolean", options={"default" : false}) + */ + private ?bool $acceptSMS = false; + + /** + * Accept receiving email + * @var boolean + * + * @ORM\Column(type="boolean", options={"default" : false}) + */ + private ?bool $acceptEmail = false; + + /** + * Number of children + * @var int + * + * @ORM\Column(type="integer", nullable=true) + */ + private ?int $numberOfChildren = null; + + /** + * @ORM\ManyToOne(targetEntity=User::class) + * @ORM\JoinColumn(nullable=true) + */ + private $createdBy; + + /** + * @ORM\Column(type="datetime", nullable=true, options={"default": NULL}) + */ + private \DateTimeInterface $createdAt; + + /** + * @ORM\ManyToOne( + * targetEntity=User::class + * ) + */ + private User $updatedBy; + + /** + * @ORM\Column(type="datetime", nullable=true, options={"default": NULL}) + */ + private \DateTimeInterface $updatedAt; + /** * @var boolean * @deprecated @@ -316,8 +399,10 @@ class Person implements HasCenterInterface } $this->open(new AccompanyingPeriod($opening)); + $this->genderComment = new CommentEmbeddable(); + $this->maritalStatusComment = new CommentEmbeddable(); } - + /** * This private function scan accompanyingPeriodParticipations Collection, * searching for a given AccompanyingPeriod @@ -329,10 +414,10 @@ class Person implements HasCenterInterface if ($accompanyingPeriod === $participation->getAccompanyingPeriod()) { return $participation; }} - + return null; } - + /** * This public function is the same but return only true or false */ @@ -340,7 +425,7 @@ class Person implements HasCenterInterface { return ($this->participationsContainAccompanyingPeriod($accompanyingPeriod)) ? false : true; } - + /** * Add AccompanyingPeriodParticipation * @@ -350,7 +435,7 @@ class Person implements HasCenterInterface { $participation = new AccompanyingPeriodParticipation($accompanyingPeriod, $this); $this->accompanyingPeriodParticipations->add($participation); - + return $this; } @@ -360,7 +445,7 @@ class Person implements HasCenterInterface public function removeAccompanyingPeriod(AccompanyingPeriod $accompanyingPeriod) : void { $participation = $this->participationsContainAccompanyingPeriod($accompanyingPeriod); - + if (! null === $participation) { $participation->setEndDate(\DateTimeImmutable::class); $this->accompanyingPeriodParticipations->removeElement($participation); @@ -438,7 +523,7 @@ class Person implements HasCenterInterface } return $accompanyingPeriods; } - + /** * Get AccompanyingPeriodParticipations Collection */ @@ -447,7 +532,7 @@ class Person implements HasCenterInterface return $this->accompanyingPeriodParticipations; } - /** + /** * Return a collection of participation, where the participation * is still opened, not a draft, and the period is still opened */ @@ -465,9 +550,9 @@ class Person implements HasCenterInterface ->filter(function (AccompanyingPeriodParticipation $app) { $period = $app->getAccompanyingPeriod(); return ( - NULL === $period->getClosingDate() + NULL === $period->getClosingDate() || new \DateTime('now') < $period->getClosingDate() - ) + ) && AccompanyingPeriod::STEP_DRAFT !== $period->getStep(); }); } @@ -1195,12 +1280,12 @@ class Person implements HasCenterInterface return true; } - + public function getFullnameCanonical() : string { return $this->fullnameCanonical; } - + public function setFullnameCanonical($fullnameCanonical) : Person { $this->fullnameCanonical = $fullnameCanonical; @@ -1341,4 +1426,122 @@ class Person implements HasCenterInterface return null; } } + + public function getGenderComment(): CommentEmbeddable + { + return $this->genderComment; + } + + public function setGenderComment(CommentEmbeddable $genderComment): self + { + $this->genderComment = $genderComment; + + return $this; + } + + public function getMaritalStatusComment(): CommentEmbeddable + { + return $this->maritalStatusComment; + } + + public function setMaritalStatusComment(CommentEmbeddable $maritalStatusComment): self + { + $this->maritalStatusComment = $maritalStatusComment; + + return $this; + } + + public function getDeathdate(): ?\DateTimeInterface + { + return $this->deathdate; + } + + public function setDeathdate(?\DateTimeInterface $deathdate): self + { + $this->deathdate = $deathdate; + + return $this; + } + + public function getMaritalStatusDate(): ?\DateTimeInterface + { + return $this->maritalStatusDate; + } + + public function setMaritalStatusDate(?\DateTimeInterface $maritalStatusDate): self + { + $this->maritalStatusDate = $maritalStatusDate; + + return $this; + } + + public function getAcceptSMS(): ?bool + { + return $this->acceptSMS; + } + + public function setAcceptSMS(bool $acceptSMS): self + { + $this->acceptSMS = $acceptSMS; + + return $this; + } + + public function getAcceptEmail(): ?bool + { + return $this->acceptEmail; + } + + public function setAcceptEmail(bool $acceptEmail): self + { + $this->acceptEmail = $acceptEmail; + + return $this; + } + + public function getNumberOfChildren(): ?int + { + return $this->numberOfChildren; + } + + public function setNumberOfChildren(int $numberOfChildren): self + { + $this->numberOfChildren = $numberOfChildren; + + return $this; + } + + public function getCreatedBy(): ?User + { + return $this->createdBy; + } + + public function setCreatedBy(User $createdBy): self + { + $this->createdBy = $createdBy; + + return $this; + } + + public function setCreatedAt(\DateTimeInterface $datetime): self + { + $this->createdAt = $datetime; + + return $this; + } + + public function setUpdatedBy(User $user): self + { + $this->updatedBy = $user; + + return $this; + } + + public function setUpdatedAt(\DateTimeInterface $datetime): self + { + $this->updatedAt = $datetime; + + return $this; + } + } diff --git a/src/Bundle/ChillPersonBundle/Form/PersonType.php b/src/Bundle/ChillPersonBundle/Form/PersonType.php index 42c625baa..376310965 100644 --- a/src/Bundle/ChillPersonBundle/Form/PersonType.php +++ b/src/Bundle/ChillPersonBundle/Form/PersonType.php @@ -34,9 +34,13 @@ use Chill\PersonBundle\Entity\PersonPhone; use Chill\PersonBundle\Form\Type\Select2MaritalStatusType; use Symfony\Component\Form\AbstractType; use Chill\MainBundle\Form\Type\ChillDateType; +use Chill\MainBundle\Form\Type\CommentType; use Symfony\Component\Form\Extension\Core\Type\EmailType; use Symfony\Component\Form\Extension\Core\Type\TelType; use Symfony\Component\Form\Extension\Core\Type\TextType; +use Symfony\Component\Form\Extension\Core\Type\IntegerType; +use Symfony\Component\Form\Extension\Core\Type\CheckboxType; +use Symfony\Component\Form\Extension\Core\Type\DateType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; @@ -82,8 +86,19 @@ class PersonType extends AbstractType ->add('birthdate', ChillDateType::class, [ 'required' => false, ]) + ->add('deathdate', DateType::class, [ + 'required' => false, + 'input' => 'datetime_immutable', + 'widget' => 'single_text' + ]) ->add('gender', GenderType::class, array( 'required' => true + )) + ->add('genderComment', CommentType::class, array( + 'required' => false + )) + ->add('numberOfChildren', IntegerType::class, array( + 'required' => false )); if ($this->configAltNamesHelper->hasAltNames()) { @@ -111,7 +126,12 @@ class PersonType extends AbstractType } if ($this->config['mobilenumber'] === 'visible') { - $builder->add('mobilenumber', TelType::class, array('required' => false)); + $builder + ->add('mobilenumber', TelType::class, array('required' => false)) + ->add('acceptSMS', CheckboxType::class, array( + 'value' => false, + 'required' => true + )); } $builder->add('otherPhoneNumbers', ChillCollectionType::class, [ @@ -130,7 +150,9 @@ class PersonType extends AbstractType ]); if ($this->config['email'] === 'visible') { - $builder->add('email', EmailType::class, array('required' => false)); + $builder + ->add('email', EmailType::class, array('required' => false)) + ->add('acceptEmail', CheckboxType::class, array('required' => false)); } if ($this->config['country_of_birth'] === 'visible') { @@ -153,9 +175,16 @@ class PersonType extends AbstractType } if ($this->config['marital_status'] === 'visible'){ - $builder->add('maritalStatus', Select2MaritalStatusType::class, array( - 'required' => false - )); + $builder + ->add('maritalStatus', Select2MaritalStatusType::class, array( + 'required' => false + )) + ->add('maritalStatusDate', ChillDateType::class, array( + 'required' => false + )) + ->add('maritalStatusComment', CommentType::class, array( + 'required' => false + )); } if($options['cFGroup']) { diff --git a/src/Bundle/ChillPersonBundle/Resources/public/js/person.js b/src/Bundle/ChillPersonBundle/Resources/public/js/person.js new file mode 100644 index 000000000..da40dddc7 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Resources/public/js/person.js @@ -0,0 +1,57 @@ +import { ShowHide } from 'ShowHide/show_hide.js'; + +const maritalStatus = document.getElementById("maritalStatus"); +const maritalStatusDate = document.getElementById("maritalStatusDate"); +const personEmail = document.getElementById("personEmail"); +const personAcceptEmail = document.getElementById("personAcceptEmail"); +const personPhoneNumber = document.getElementById("personPhoneNumber"); +const personAcceptSMS = document.getElementById("personAcceptSMS"); + + +new ShowHide({ + froms: [maritalStatus], + container: [maritalStatusDate], + test: function(froms) { + for (let f of froms.values()) { + for (let input of f.querySelectorAll('select').values()) { + if (input.value) { + return true + } + } + } + return false; + }, + event_name: 'change' +}); + +new ShowHide({ + froms: [personEmail], + container: [personAcceptEmail], + test: function(froms) { + for (let f of froms.values()) { + for (let input of f.querySelectorAll('input').values()) { + if (input.value) { + return true + } + } + } + return false; + }, + event_name: 'input' +}); + +new ShowHide({ + froms: [personPhoneNumber], + container: [personAcceptSMS], + test: function(froms) { + for (let f of froms.values()) { + for (let input of f.querySelectorAll('input').values()) { + if (input.value) { + return true + } + } + } + return false; + }, + event_name: 'input' +}); diff --git a/src/Bundle/ChillPersonBundle/Resources/views/Person/edit.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/Person/edit.html.twig index a69253695..549025429 100644 --- a/src/Bundle/ChillPersonBundle/Resources/views/Person/edit.html.twig +++ b/src/Bundle/ChillPersonBundle/Resources/views/Person/edit.html.twig @@ -43,6 +43,7 @@ {{ form_widget(form.altNames, { 'label': 'Alternative names'}) }} {% endif %} {{ form_row(form.gender, {'label' : 'Gender'}) }} + {{ form_row(form.genderComment, { 'label' : 'Comment on the gender'} ) }}
-{%- if form.nationality is defined or form.spokenLanguages is defined or form.maritalStatus is defined -%} +{%- if form.nationality is defined or form.spokenLanguages is defined -%} +{%- endif -%} + +{%- if form.numberOfChildren is defined or form.maritalStatus is defined -%} + {%- endif -%} @@ -75,13 +92,24 @@