<?php
declare(strict_types=1);
namespace Croisiland\CommonBundle\Entity\Partner;
use Crea\ToolsBundle\Entity\Geographic\Address;
use Crea\ToolsBundle\Entity\LifecycleUserIdentifierTrait;
use Crea\ToolsBundle\Entity\StatefulTrait;
use Croisiland\CommonBundle\Annotation\Partner\CreatePartnerFormValidator;
use Croisiland\CommonBundle\Annotation\Partner\PartnerWebsiteManagementFormValidator;
use Croisiland\CommonBundle\Annotation\Partner\UpdatePartnerFormValidator;
use Croisiland\CommonBundle\Entity\Offer\Offer;
use Croisiland\CommonBundle\Enum\PartnerWebServiceCodeEnum;
use Croisiland\CommonBundle\Repository\Partner\PartnerRepository;
use DateTimeInterface;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* @ORM\Entity(repositoryClass=PartnerRepository::class)
* @PartnerWebsiteManagementFormValidator(groups={"partner_website_management_form_validator"})
* @CreatePartnerFormValidator(groups={"create_partner_form_validator"})
* @UpdatePartnerFormValidator(groups={"update_partner_form_validator"})
*/
class Partner
{
use LifecycleUserIdentifierTrait;
use StatefulTrait;
/**
* @ORM\Id
*
* @ORM\GeneratedValue
*
* @ORM\Column(type="integer")
*/
protected ?int $id = null;
/******** Propriété attenante a la DEFINITION DU PARTENAIRE ********/
/**
* Code d'identification programmatique du partenaire
* @ORM\Column(type="string", length=255, nullable=true)
*/
protected ?string $code = null;
/**
* Nom complet du partenaire
* @ORM\Column(type="string", length=255)
*/
protected ?string $name = null;
/**
* Nom court du partenaire
* @ORM\Column(type="string", length=25)
*/
protected ?string $shortName = null;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
protected ?string $logo = null;
/**
* Nombre de membres total du partenaire annoncé lors de la signature du contrat
* @ORM\Column(type="integer", nullable=true)
*/
protected ?int $size = null;
/**
* Nombre de membres ayant eu un contact avec Croisiland
* @ORM\Column(type="integer", nullable=true)
*/
protected ?int $currentSize = null;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
protected ?string $partnerSiteUrl = null;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
protected ?string $partnerSiteLogin = null;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
protected ?string $partnerSiteComment = null;
/**
* @ORM\Column(type="text", nullable=true)
*/
protected ?string $comment = null;
/******** Propriété attenante au CONTRAT ********/
/**
* TODO à convertir en Parameter
* @ORM\Column(type="string", length=255, nullable=true)
*/
protected ?string $type = null;
/**
* TODO à convertir en Parameter
* @ORM\Column(type="string", length=255, nullable=true)
*/
protected ?string $category = null;
/**
* Date de clôture du partenariat
* @ORM\Column(type="datetime", nullable=true)
*/
protected ?DateTimeInterface $closingDate = null;
/**
* Note de clôture du partenariat
* @ORM\Column(type="text", nullable=true)
*/
protected ?string $closingDateNote = null;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
protected ?DateTimeInterface $deactivationDate = null;
/**
* Propriété renommée de "payer" pour clarifier son utilité
* @ORM\Column(type="boolean", options={"default":0})
*/
protected bool $partnerPaysForBeneficiaries = false;
/**
* Comptabilité : CA N (année en cours)
* @ORM\Column(type="float", nullable=true)
*/
protected ?float $currentYearTurnover = null;
/**
* Comptabilité : CA N-1 (année précédente)
* @ORM\Column(type="float", nullable=true)
*/
protected ?float $previousYearTurnover = null;
/******** Propriété attenante à la RELATION avec le partenaire ********/
/**
* date de début du partenariat
* @ORM\Column(type="datetime", nullable=true)
*/
protected ?\DateTimeInterface $partnershipStartedAt = null;
/**
* Pour la datatable afin de pouvoir trier les partenaires en fonction de la présence ou non d'un contact
* @ORM\Column(type="boolean", options={"default":0})
*/
protected bool $hasContacts = false;
/**
* TODO Transferer sur SULU
* @ORM\Column(type="text", nullable=true)
*/
protected ?string $commercialDescription = null;
/**
* TODO Transferer sur SULU
* @ORM\Column(type="text", nullable=true)
*/
protected ?string $conditions = null;
/**
* TODO Transferer sur SULU
* @ORM\Column(type="text", nullable=true)
*/
protected ?string $presentation = null;
/**
* TODO Transferer sur SULU
* @ORM\Column(type="text", nullable=true)
*/
protected ?string $photoPresentation = null;
/**
* TODO Transferer sur SULU
* @ORM\Column(type="text", nullable=true)
*/
protected ?string $videoPresentation = null;
/**
* @ORM\Column(type="string", length=255, nullable=true, enumType=PartnerWebServiceCodeEnum::class)
*/
protected ?PartnerWebServiceCodeEnum $webService = null;
/******** Relations attenantes aux OFFRES ET REMISES ********/
/**
* @var Collection<int, Offer>
*
* @ORM\ManyToMany(targetEntity=Offer::class, mappedBy="partners")
*/
private Collection $offers;
/**
* @var Collection<int, PartnerCompanyDiscount>
*
* @ORM\OneToMany(targetEntity=PartnerCompanyDiscount::class, mappedBy="partner", orphanRemoval=true)
*/
private Collection $partnerCompanyDiscounts;
/**
* @ORM\OneToOne(targetEntity=PartnerWebsite::class, mappedBy="partner", cascade={"persist", "remove"}, orphanRemoval=true)
*/
private ?PartnerWebsite $website = null;
public function __construct()
{
$this->offers = new ArrayCollection();
$this->partnerCompanyDiscounts = new ArrayCollection();
}
public function getId(): int
{
return $this->id;
}
public function getCode(): ?string
{
return $this->code;
}
public function setCode(?string $code): self
{
$this->code = $code;
return $this;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(?string $name): self
{
$this->name = $name;
return $this;
}
public function getShortName(): ?string
{
return $this->shortName;
}
public function setShortName(?string $shortName): self
{
$this->shortName = $shortName;
return $this;
}
public function getLogo(): ?string
{
return $this->logo;
}
public function setLogo(?string $logo): self
{
$this->logo = $logo;
return $this;
}
public function getSize(): ?int
{
return $this->size;
}
public function setSize(?int $size): self
{
$this->size = $size;
return $this;
}
public function getCurrentSize(): ?int
{
return $this->currentSize;
}
public function setCurrentSize(?int $currentSize): self
{
$this->currentSize = $currentSize;
return $this;
}
public function getPartnerSiteUrl(): ?string
{
return $this->partnerSiteUrl;
}
public function setPartnerSiteUrl(?string $partnerSiteUrl): self
{
$this->partnerSiteUrl = $partnerSiteUrl;
return $this;
}
public function getPartnerSiteLogin(): ?string
{
return $this->partnerSiteLogin;
}
public function setPartnerSiteLogin(?string $partnerSiteLogin): self
{
$this->partnerSiteLogin = $partnerSiteLogin;
return $this;
}
public function getPartnerSiteComment(): ?string
{
return $this->partnerSiteComment;
}
public function setPartnerSiteComment(?string $partnerSiteComment): self
{
$this->partnerSiteComment = $partnerSiteComment;
return $this;
}
public function getComment(): ?string
{
return $this->comment;
}
public function setComment(?string $comment): self
{
$this->comment = $comment;
return $this;
}
public function getType(): ?string
{
return $this->type;
}
public function setType(?string $type): self
{
$this->type = $type;
return $this;
}
public function getCategory(): ?string
{
return $this->category;
}
public function setCategory(?string $category): self
{
$this->category = $category;
return $this;
}
public function getClosingDate(): ?DateTimeInterface
{
return $this->closingDate;
}
public function setClosingDate(?DateTimeInterface $closingDate): self
{
$this->closingDate = $closingDate;
return $this;
}
public function getClosingDateNote(): ?string
{
return $this->closingDateNote;
}
public function setClosingDateNote(?string $closingDateNote): self
{
$this->closingDateNote = $closingDateNote;
return $this;
}
public function getDeactivationDate(): ?DateTimeInterface
{
return $this->deactivationDate;
}
public function setDeactivationDate(?DateTimeInterface $deactivationDate): self
{
$this->deactivationDate = $deactivationDate;
return $this;
}
public function isPartnerPaysForBeneficiaries(): bool
{
return $this->partnerPaysForBeneficiaries;
}
public function setPartnerPaysForBeneficiaries(bool $partnerPaysForBeneficiaries): self
{
$this->partnerPaysForBeneficiaries = $partnerPaysForBeneficiaries;
return $this;
}
public function getCurrentYearTurnover(): ?float
{
return $this->currentYearTurnover;
}
public function setCurrentYearTurnover(?float $currentYearTurnover): self
{
$this->currentYearTurnover = $currentYearTurnover;
return $this;
}
public function getPreviousYearTurnover(): ?float
{
return $this->previousYearTurnover;
}
public function setPreviousYearTurnover(?float $previousYearTurnover): self
{
$this->previousYearTurnover = $previousYearTurnover;
return $this;
}
public function getPartnershipStartedAt(): ?DateTimeInterface
{
return $this->partnershipStartedAt;
}
public function setPartnershipStartedAt(?DateTimeInterface $partnershipStartedAt): self
{
$this->partnershipStartedAt = $partnershipStartedAt;
return $this;
}
public function isHasContacts(): bool
{
return $this->hasContacts;
}
public function setHasContacts(bool $hasContacts): self
{
$this->hasContacts = $hasContacts;
return $this;
}
public function getCommercialDescription(): ?string
{
return $this->commercialDescription;
}
public function setCommercialDescription(?string $commercialDescription): self
{
$this->commercialDescription = $commercialDescription;
return $this;
}
public function getConditions(): ?string
{
return $this->conditions;
}
public function setConditions(?string $conditions): self
{
$this->conditions = $conditions;
return $this;
}
public function getPresentation(): ?string
{
return $this->presentation;
}
public function setPresentation(?string $presentation): self
{
$this->presentation = $presentation;
return $this;
}
public function getPhotoPresentation(): ?string
{
return $this->photoPresentation;
}
public function setPhotoPresentation(?string $photoPresentation): self
{
$this->photoPresentation = $photoPresentation;
return $this;
}
public function getVideoPresentation(): ?string
{
return $this->videoPresentation;
}
public function setVideoPresentation(?string $videoPresentation): self
{
$this->videoPresentation = $videoPresentation;
return $this;
}
public function getWebService(): ?PartnerWebServiceCodeEnum
{
return $this->webService;
}
public function setWebService(?PartnerWebServiceCodeEnum $webService): self
{
$this->webService = $webService;
return $this;
}
/**
* @return Collection<int, Offer>
*/
public function getOffers(): Collection
{
return $this->offers;
}
public function addOffer(Offer $offer): self
{
if (!$this->offers->contains($offer)) {
$this->offers[] = $offer;
$offer->addPartner($this);
}
return $this;
}
public function removeOffer(Offer $offer): self
{
if ($this->offers->removeElement($offer)) {
$offer->removePartner($this);
}
return $this;
}
/**
* @return Collection<int, PartnerCompanyDiscount>
*/
public function getPartnerCompanyDiscounts(): Collection
{
return $this->partnerCompanyDiscounts;
}
public function addPartnerCompanyDiscount(PartnerCompanyDiscount $partnerCompanyDiscount): self
{
if (!$this->partnerCompanyDiscounts->contains($partnerCompanyDiscount)) {
$this->partnerCompanyDiscounts[] = $partnerCompanyDiscount;
$partnerCompanyDiscount->setPartner($this);
}
return $this;
}
public function removePartnerCompanyDiscount(PartnerCompanyDiscount $partnerCompanyDiscount): self
{
if ($this->partnerCompanyDiscounts->removeElement($partnerCompanyDiscount)) {
// set the owning side to null (unless already changed)
if ($partnerCompanyDiscount->getPartner() === $this) {
$partnerCompanyDiscount->setPartner(null);
}
}
return $this;
}
public function getWebsite(): ?PartnerWebsite
{
return $this->website;
}
public function setWebsite(?PartnerWebsite $website): self
{
if ($website !== null && $website->getPartner() !== $this) {
$website->setPartner($this);
}
$this->website = $website;
return $this;
}
}