'ipartial', 'workNumber' => 'ipartial', 'bovineType.label' => 'ipartial', 'bovineType.code' => 'ipartial', 'sex' => 'exact', 'buildingCase' => 'exact', 'receivedWeight' => 'exact', ])] #[ApiFilter(DateFilter::class, properties: ['arrivalDate', 'birthDate', 'exitDate'])] #[ApiFilter(ExistsFilter::class, properties: ['exitedAt'])] #[ApiResource( order: ['birthDate' => 'ASC'], operations: [ new Get( requirements: ['id' => '\d+'], normalizationContext: ['groups' => ['bovine:read']], ), new GetCollection( normalizationContext: ['groups' => ['bovine:read']], ), new Post( normalizationContext: ['groups' => ['bovine:read']], denormalizationContext: ['groups' => ['bovine:write']], security: "is_granted('ROLE_ADMIN')", processor: BovineProcessor::class, ), new Patch( requirements: ['id' => '\d+'], normalizationContext: ['groups' => ['bovine:read']], denormalizationContext: ['groups' => ['bovine:write']], security: "is_granted('ROLE_ADMIN')", processor: BovineProcessor::class, ), ], security: "is_granted('ROLE_USER')", )] class Bovine { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column] #[Groups(['bovine:read', 'building_case:read'])] private ?int $id = null; #[ORM\Column(length: 50)] #[Groups(['bovine:read', 'bovine:write', 'building_case:read'])] private string $nationalNumber = ''; #[ORM\Column(nullable: true)] #[Groups(['bovine:read', 'bovine:write', 'building_case:read'])] private ?int $receivedWeight = null; #[ORM\Column(type: 'float', nullable: true)] #[Groups(['bovine:read', 'bovine:write', 'building_case:read'])] #[ApiProperty(security: "is_granted('ROLE_BUREAU')")] private ?float $pricePerKg = null; #[ORM\Column(type: 'date_immutable', nullable: true)] #[Groups(['bovine:read', 'bovine:write', 'building_case:read'])] #[Context([DateTimeNormalizer::FORMAT_KEY => 'Y-m-d'])] private ?DateTimeImmutable $arrivalDate = null; #[ORM\ManyToOne(inversedBy: 'bovines')] #[Groups(['bovine:read', 'bovine:write'])] #[ApiProperty(readableLink: true)] private ?BuildingCase $buildingCase = null; #[ORM\ManyToOne] #[Groups(['bovine:read'])] #[ApiProperty(readableLink: true)] private ?Building $building = null; #[ORM\ManyToOne] #[Groups(['bovine:read', 'bovine:write', 'building_case:read'])] private ?Supplier $supplier = null; #[ORM\Column(length: 50, nullable: true)] #[Groups(['bovine:read', 'building_case:read'])] private ?string $workNumber = null; #[ORM\Column(type: 'date_immutable', nullable: true)] #[Groups(['bovine:read', 'building_case:read'])] #[Context([DateTimeNormalizer::FORMAT_KEY => 'Y-m-d'])] private ?DateTimeImmutable $birthDate = null; #[ORM\ManyToOne] #[Groups(['bovine:read', 'building_case:read'])] #[ApiProperty(readableLink: true)] private ?BovineType $bovineType = null; #[ORM\Column(length: 1, nullable: true)] #[Groups(['bovine:read', 'building_case:read'])] private ?string $sex = null; #[ORM\Column(type: 'integer', nullable: true)] #[Groups(['bovine:read', 'building_case:read'])] private ?int $ageMonths = null; #[ORM\Column(type: 'date_immutable', nullable: true)] #[Groups(['bovine:read', 'building_case:read'])] #[Context([DateTimeNormalizer::FORMAT_KEY => 'Y-m-d'])] private ?DateTimeImmutable $exitDate = null; #[ORM\Column(type: 'datetime_immutable', nullable: true)] #[Groups(['bovine:read', 'building_case:read'])] #[Context([DateTimeNormalizer::FORMAT_KEY => 'Y-m-d'])] private ?DateTimeImmutable $exitedAt = null; public function getId(): ?int { return $this->id; } public function getNationalNumber(): string { return $this->nationalNumber; } public function setNationalNumber(string $nationalNumber): static { $this->nationalNumber = $nationalNumber; return $this; } public function getReceivedWeight(): ?int { return $this->receivedWeight; } public function setReceivedWeight(?int $receivedWeight): static { $this->receivedWeight = $receivedWeight; return $this; } public function getPricePerKg(): ?float { return $this->pricePerKg; } public function setPricePerKg(?float $pricePerKg): static { $this->pricePerKg = $pricePerKg; return $this; } #[Groups(['bovine:read', 'building_case:read'])] #[ApiProperty(security: "is_granted('ROLE_BUREAU')")] public function getFinalPrice(): ?float { if (null === $this->receivedWeight || null === $this->pricePerKg) { return null; } return $this->receivedWeight * $this->pricePerKg; } public function getArrivalDate(): ?DateTimeImmutable { return $this->arrivalDate; } public function setArrivalDate(?DateTimeImmutable $arrivalDate): static { $this->arrivalDate = $arrivalDate; return $this; } public function getBuildingCase(): ?BuildingCase { return $this->buildingCase; } public function setBuildingCase(?BuildingCase $buildingCase): static { $this->buildingCase = $buildingCase; return $this; } public function getBuilding(): ?Building { return $this->building; } public function setBuilding(?Building $building): static { $this->building = $building; return $this; } /** * Bâtiment effectif d'un bovin : la case affectée si elle existe (logique * historique), sinon le bâtiment direct (fed depuis l'XLSX initial). */ #[Groups(['bovine:read', 'building_case:read'])] public function getEffectiveBuilding(): ?Building { return $this->buildingCase?->getIdBuilding() ?? $this->building; } public function getSupplier(): ?Supplier { return $this->supplier; } public function setSupplier(?Supplier $supplier): static { $this->supplier = $supplier; return $this; } public function getWorkNumber(): ?string { return $this->workNumber; } public function setWorkNumber(?string $workNumber): static { $this->workNumber = $workNumber; return $this; } public function getBirthDate(): ?DateTimeImmutable { return $this->birthDate; } public function setBirthDate(?DateTimeImmutable $birthDate): static { $this->birthDate = $birthDate; return $this; } public function getBovineType(): ?BovineType { return $this->bovineType; } public function setBovineType(?BovineType $bovineType): static { $this->bovineType = $bovineType; return $this; } public function getSex(): ?string { return $this->sex; } public function setSex(?string $sex): static { $this->sex = $sex; return $this; } public function getExitDate(): ?DateTimeImmutable { return $this->exitDate; } public function setExitDate(?DateTimeImmutable $exitDate): static { $this->exitDate = $exitDate; return $this; } public function getExitedAt(): ?DateTimeImmutable { return $this->exitedAt; } public function setExitedAt(?DateTimeImmutable $exitedAt): static { $this->exitedAt = $exitedAt; return $this; } public function getAgeMonths(): ?int { return $this->ageMonths; } public function setAgeMonths(?int $ageMonths): static { $this->ageMonths = $ageMonths; return $this; } #[ORM\PrePersist] #[ORM\PreUpdate] public function refreshAgeMonths(): void { if (null === $this->birthDate) { $this->ageMonths = null; return; } $diff = $this->birthDate->diff(new DateTimeImmutable()); $this->ageMonths = ($diff->y * 12) + $diff->m; } }