* * @readonly * * @ORM\ManyToMany(targetEntity=GeographicalUnit::class) * * @ORM\JoinTable( * name="view_chill_main_address_geographical_unit", * joinColumns={@ORM\JoinColumn(name="address_id")}, * inverseJoinColumns={@ORM\JoinColumn(name="geographical_unit_id")} * ) */ private Collection $geographicalUnits; /** * @ORM\Id * * @ORM\Column(name="id", type="integer") * * @ORM\GeneratedValue(strategy="AUTO") * * @Groups({"write"}) * * @readonly */ private ?int $id = null; /** * True if the address is a "no address", aka homeless person, ... * * @Groups({"write"}) * * @ORM\Column(type="boolean", options={"default": false}) */ private bool $isNoAddress = false; /** * A ThirdParty reference for person's addresses that are linked to a third party. * * @ORM\ManyToOne(targetEntity="Chill\ThirdPartyBundle\Entity\ThirdParty") * * @Groups({"write"}) * * @ORM\JoinColumn(nullable=true, onDelete="SET NULL") */ private ?ThirdParty $linkedToThirdParty = null; /** * A geospatial field storing the coordinates of the Address. * * @ORM\Column(type="point", nullable=true) * * @Groups({"write"}) */ private ?Point $point = null; /** * @ORM\ManyToOne(targetEntity="Chill\MainBundle\Entity\PostalCode") * * @ORM\JoinColumn(nullable=false) * * @Groups({"write"}) */ private ?PostalCode $postcode = null; /** * @var self::ADDR_REFERENCE_STATUS_* * * @ORM\Column(type="text", nullable=false, options={"default": self::ADDR_REFERENCE_STATUS_MATCH}) */ private string $refStatus = self::ADDR_REFERENCE_STATUS_MATCH; /** * @ORM\Column(type="datetime_immutable", nullable=false, options={"default": "CURRENT_TIMESTAMP"}) */ private \DateTimeImmutable $refStatusLastUpdate; /** * @ORM\Column(type="text", nullable=false, options={"default": ""}) * * @Groups({"write"}) */ private string $steps = ''; /** * @ORM\Column(type="text", nullable=false, options={"default": ""}) * * @Groups({"write"}) */ private string $street = ''; /** * @ORM\Column(type="text", nullable=false, options={"default": ""}) * * @Groups({"write"}) */ private string $streetNumber = ''; /** * Indicates when the address starts validation. Used to build an history * of address. By default, the current date. * * @ORM\Column(type="date") * * @Groups({"write"}) */ private \DateTime $validFrom; /** * Indicates when the address ends. Used to build an history * of address. * * @ORM\Column(type="date", nullable=true) * * @Groups({"write"}) */ private ?\DateTime $validTo = null; public function __construct() { $this->validFrom = new \DateTime(); $this->refStatusLastUpdate = new \DateTimeImmutable('now'); $this->geographicalUnits = new ArrayCollection(); } public static function createFromAddress(Address $original): Address { return (new Address()) ->setAddressReference($original->getAddressReference()) ->setBuildingName($original->getBuildingName()) ->setConfidential($original->getConfidential()) ->setCorridor($original->getCorridor()) ->setDistribution($original->getDistribution()) ->setExtra($original->getExtra()) ->setFlat($original->getFlat()) ->setFloor($original->getFloor()) ->setIsNoAddress($original->getIsNoAddress()) ->setLinkedToThirdParty($original->getLinkedToThirdParty()) ->setPoint($original->getPoint()) ->setPostcode($original->getPostcode()) ->setSteps($original->getSteps()) ->setStreet($original->getStreet()) ->setStreetNumber($original->getStreetNumber()) ->setValidFrom($original->getValidFrom()) ->setValidTo($original->getValidTo()); } public static function createFromAddressReference(AddressReference $original): Address { return (new Address()) ->syncWithReference($original); } public function syncWithReference(AddressReference $addressReference): Address { $this ->setPoint($addressReference->getPoint()) ->setPostcode($addressReference->getPostcode()) ->setStreet($addressReference->getStreet()) ->setStreetNumber($addressReference->getStreetNumber()) ->setRefStatus(self::ADDR_REFERENCE_STATUS_MATCH) ->setAddressReference($addressReference); return $this; } public function getAddressReference(): ?AddressReference { return $this->addressReference; } public function getBuildingName(): string { return $this->buildingName; } public function getConfidential(): bool { return $this->confidential; } public function getCorridor(): string { return $this->corridor; } public function getDistribution(): string { return $this->distribution; } public function getExtra(): string { return $this->extra; } public function getFlat(): string { return $this->flat; } public function getFloor(): string { return $this->floor; } /** * @return Collection|GeographicalUnit[] */ public function getGeographicalUnits(): Collection { return $this->geographicalUnits; } /** * Get id. * * @return int */ public function getId() { return $this->id; } /** * Get IsNoAddress. * * Indicate true if the address is a fake address (homeless, ...) */ public function getIsNoAddress(): bool { return $this->isNoAddress; } public function getLinkedToThirdParty() { return $this->linkedToThirdParty; } public function getPoint(): ?Point { return $this->point; } /** * Get postcode. */ public function getPostcode(): ?PostalCode { return $this->postcode; } public function getRefStatus(): string { return $this->refStatus; } public function getRefStatusLastUpdate(): \DateTimeImmutable { return $this->refStatusLastUpdate; } public function getSteps(): string { return $this->steps; } public function getStreet(): string { return $this->street; } /** * Get streetAddress1 (legacy function). * * @return string * * @deprecated */ public function getStreetAddress1() { return $this->street; } /** * Get streetAddress2 (legacy function). * * @return string * * @deprecated */ public function getStreetAddress2() { return $this->streetNumber; } public function getStreetNumber(): string { return $this->streetNumber; } public function getValidFrom(): \DateTime { return $this->validFrom; } public function getValidTo(): ?\DateTimeInterface { return $this->validTo; } public function hasAddressReference(): bool { return null !== $this->getAddressReference(); } public function isNoAddress(): bool { return $this->getIsNoAddress(); } public function setAddressReference(?AddressReference $addressReference = null): Address { $this->addressReference = $addressReference; return $this; } public function setBuildingName(?string $buildingName): self { $this->buildingName = (string) $buildingName; return $this; } public function setConfidential(bool $confidential): self { $this->confidential = $confidential; return $this; } public function setCorridor(?string $corridor): self { $this->corridor = (string) $corridor; return $this; } public function setDistribution(?string $distribution): self { $this->distribution = (string) $distribution; return $this; } public function setExtra(?string $extra): self { $this->extra = (string) $extra; return $this; } public function setFlat(?string $flat): self { $this->flat = (string) $flat; return $this; } public function setFloor(?string $floor): self { $this->floor = (string) $floor; return $this; } /** * Set IsNoAddress. * * Indicate true if the address is a fake address (homeless, ...) * * @return $this */ public function setIsNoAddress(bool $isNoAddress): self { $this->isNoAddress = $isNoAddress; return $this; } public function setLinkedToThirdParty($linkedToThirdParty): self { $this->linkedToThirdParty = $linkedToThirdParty; return $this; } public function setPoint(?Point $point): self { $this->point = $point; return $this; } /** * Set postcode. * * @return Address */ public function setPostcode(?PostalCode $postcode = null) { $this->postcode = $postcode; return $this; } /** * Update the ref status. * * <<<<<<< HEAD * * @param Address::ADDR_REFERENCE_STATUS_* $refStatus * @param bool|null $updateLastUpdate Also update the "refStatusLastUpdate" * ======= * The refstatuslast update is also updated * >>>>>>> 31152616d (Feature: Provide api endpoint for reviewing addresses) */ public function setRefStatus(string $refStatus, ?bool $updateLastUpdate = true): self { $this->refStatus = $refStatus; if ($updateLastUpdate) { $this->setRefStatusLastUpdate(new \DateTimeImmutable('now')); } return $this; } public function setRefStatusLastUpdate(\DateTimeImmutable $refStatusLastUpdate): self { $this->refStatusLastUpdate = $refStatusLastUpdate; return $this; } public function setSteps(?string $steps): self { $this->steps = (string) $steps; return $this; } public function setStreet(?string $street): self { $this->street = (string) $street; return $this; } /** * Set streetAddress1 (legacy function). * * @deprecated */ public function setStreetAddress1(?string $streetAddress1): self { $this->street = (string) $streetAddress1; return $this; } /** * Set streetAddress2 (legacy function). * * @deprecated */ public function setStreetAddress2(?string $streetAddress2): self { $this->streetNumber = (string) $streetAddress2; return $this; } public function setStreetNumber(?string $streetNumber): self { $this->streetNumber = (string) $streetNumber; return $this; } /** * @return Address */ public function setValidFrom(\DateTime $validFrom) { $this->validFrom = $validFrom; return $this; } public function setValidTo(?\DateTimeInterface $validTo = null): self { $this->validTo = $validTo; return $this; } /** * Validate the address. * * Check that: * * * if the address is not home address: * * the postal code is present * * the valid from is not null * * the address street 1 is greater than 2 * * @param array $payload */ public function validate(ExecutionContextInterface $context, $payload) { if (!$this->getValidFrom() instanceof \DateTime) { $context ->buildViolation('address.date-should-be-set') ->atPath('validFrom') ->addViolation(); } if ($this->isNoAddress()) { return; } if ('' === $this->getStreet()) { $context ->buildViolation('address.street1-should-be-set') ->atPath('streetAddress1') ->addViolation(); } if (!$this->getPostcode() instanceof PostalCode) { $context ->buildViolation('address.postcode-should-be-set') ->atPath('postCode') ->addViolation(); } } }