*/ #[ORM\OneToMany(targetEntity: Place::class, mappedBy: 'stats', cascade: ['persist', 'remove'])] private Collection $places; // nombre de commerces dans la zone #[ORM\Column(type: Types::SMALLINT, nullable: true)] private ?int $places_count = null; // nombre de commerces avec horaires #[ORM\Column(type: Types::SMALLINT, nullable: true)] private ?int $avec_horaires = null; // nombre de commerces avec adresse #[ORM\Column(type: Types::SMALLINT, nullable: true)] private ?int $avec_adresse = null; // nombre de commerces avec site #[ORM\Column(type: Types::SMALLINT, nullable: true)] private ?int $avec_site = null; // nombre de commerces avec accessibilité #[ORM\Column(type: Types::SMALLINT, nullable: true)] private ?int $avec_accessibilite = null; // nombre de commerces avec note #[ORM\Column(type: Types::SMALLINT, nullable: true)] private ?int $avec_note = null; #[ORM\Column(length: 255, nullable: true)] private ?string $name = null; // nombre d'habitants dans la zone #[ORM\Column(type: Types::INTEGER, nullable: true)] private ?int $population = null; // calcule le pourcentage de complétion de la zone public function computeCompletionPercent(): ?int { $places_count = $this->places->count(); // Si aucun commerce, on retourne 0 if ($places_count === 0 || $places_count === null) { $this->setCompletionPercent(0); return 0; } // On réinitialise les compteurs $this->avec_horaires = 0; $this->avec_adresse = 0; $this->avec_site = 0; $this->avec_accessibilite = 0; $this->avec_note = 0; $somme_completions = 0; // On boucle sur chaque place pour compter les attributs renseignés foreach ($this->places as $place) { $place_completions = 0; if ($place->hasAddress()) { $this->avec_adresse++; $place_completions++; } if ($place->hasWebsite()) { $this->avec_site++; $place_completions++; } if ($place->hasWheelchair()) { $this->avec_accessibilite++; $place_completions++; } if ($place->hasOpeningHours()) { $this->avec_horaires++; $place_completions++; } if($place->hasNote()) { $this->avec_note++; } $somme_completions += $place_completions / 5; } $this->setPlacesCount($places_count); $this->setCompletionPercent(round($somme_completions / $places_count * 100)); return $this->completion_percent; } public function __construct() { $this->places = new ArrayCollection(); } public function getId(): ?int { return $this->id; } public function getZone(): ?string { return $this->zone; } public function setZone(string $zone): static { $this->zone = $zone; return $this; } public function getCompletionPercent(): ?int { return $this->completion_percent; } public function setCompletionPercent(int $completion_percent): static { $this->completion_percent = $completion_percent; return $this; } /** * @return Collection */ public function getPlaces(): Collection { return $this->places; } public function addPlace(Place $place): static { if (!$this->places->contains($place)) { $this->places->add($place); $place->setStats($this); } return $this; } public function removePlace(Place $place): static { if ($this->places->removeElement($place)) { // set the owning side to null (unless already changed) if ($place->getStats() === $this) { $place->setStats(null); } } return $this; } public function getPlacesCount(): ?int { return $this->places_count; } public function setPlacesCount(int $places_count): static { $this->places_count = $places_count; return $this; } public function getAvecHoraires(): ?int { return $this->avec_horaires; } public function setAvecHoraires(int $avec_horaires): static { $this->avec_horaires = $avec_horaires; return $this; } public function getAvecAdresse(): ?int { return $this->avec_adresse; } public function setAvecAdresse(int $avec_adresse): static { $this->avec_adresse = $avec_adresse; return $this; } public function getAvecSite(): ?int { return $this->avec_site; } public function setAvecSite(int $avec_site): static { $this->avec_site = $avec_site; return $this; } public function getAvecAccessibilite(): ?int { return $this->avec_accessibilite; } public function setAvecAccessibilite(int $avec_accessibilite): static { $this->avec_accessibilite = $avec_accessibilite; return $this; } public function getAvecNote(): ?int { return $this->avec_note; } public function setAvecNote(int $avec_note): static { $this->avec_note = $avec_note; return $this; } public function getName(): ?string { return $this->name; } public function setName(?string $name): static { $this->name = $name; return $this; } public function getPopulation(): ?int { return $this->population; } public function setPopulation(?int $population): static { $this->population = $population; return $this; } }