<?phpnamespace App\Entity;use App\Repository\ProductRankingRepository;use Doctrine\DBAL\Types\Types;use Doctrine\ORM\Mapping as ORM;#[ORM\Entity(repositoryClass: ProductRankingRepository::class)]#[ORM\Table(name: 'product_rankings')]#[ORM\UniqueConstraint(name: 'unique_product_category_ranking', columns: ['product_id', 'category_id'])]class ProductRanking{ #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column] private ?int $id = null; #[ORM\ManyToOne(targetEntity: Product::class, inversedBy: 'rankings')] #[ORM\JoinColumn(nullable: false)] private ?Product $product = null; #[ORM\ManyToOne(targetEntity: Category::class)] #[ORM\JoinColumn(nullable: false)] private ?Category $category = null; #[ORM\Column(type: Types::INTEGER)] private ?int $rank = null; #[ORM\Column(type: Types::INTEGER)] private ?int $previousRank = null; #[ORM\Column(type: Types::FLOAT)] private ?float $score = null; #[ORM\Column(type: Types::JSON)] private ?array $rankingFactors = null; #[ORM\Column(type: Types::DATETIME_IMMUTABLE)] private ?\DateTimeImmutable $calculatedAt = null; #[ORM\Column(type: Types::DATETIME_IMMUTABLE)] private ?\DateTimeImmutable $updatedAt = null; public function __construct() { $this->calculatedAt = new \DateTimeImmutable(); $this->updatedAt = new \DateTimeImmutable(); $this->rankingFactors = []; } public function getId(): ?int { return $this->id; } public function getProduct(): ?Product { return $this->product; } public function setProduct(?Product $product): static { $this->product = $product; return $this; } public function getCategory(): ?Category { return $this->category; } public function setCategory(?Category $category): static { $this->category = $category; return $this; } public function getRank(): ?int { return $this->rank; } public function setRank(int $rank): static { $this->rank = $rank; return $this; } public function getPreviousRank(): ?int { return $this->previousRank; } public function setPreviousRank(?int $previousRank): static { $this->previousRank = $previousRank; return $this; } public function getScore(): ?float { return $this->score; } public function setScore(float $score): static { $this->score = $score; return $this; } public function getRankingFactors(): ?array { return $this->rankingFactors; } public function setRankingFactors(array $rankingFactors): static { $this->rankingFactors = $rankingFactors; return $this; } public function addRankingFactor(string $factor, float $value): static { $this->rankingFactors[$factor] = $value; return $this; } public function getCalculatedAt(): ?\DateTimeImmutable { return $this->calculatedAt; } public function setCalculatedAt(\DateTimeImmutable $calculatedAt): static { $this->calculatedAt = $calculatedAt; return $this; } public function getUpdatedAt(): ?\DateTimeImmutable { return $this->updatedAt; } public function setUpdatedAt(\DateTimeImmutable $updatedAt): static { $this->updatedAt = $updatedAt; return $this; } /** * Calculer le changement de rang */ public function getRankChange(): ?int { if ($this->previousRank === null) { return null; } return $this->previousRank - $this->rank; } /** * Obtenir le symbole de changement de rang */ public function getRankChangeSymbol(): string { $change = $this->getRankChange(); if ($change === null) { return 'new'; } elseif ($change > 0) { return 'up'; } elseif ($change < 0) { return 'down'; } else { return 'same'; } } /** * Obtenir la couleur du changement de rang */ public function getRankChangeColor(): string { $change = $this->getRankChange(); if ($change === null) { return 'info'; } elseif ($change > 0) { return 'success'; } elseif ($change < 0) { return 'danger'; } else { return 'secondary'; } }}