<?php
namespace App\Entity;
use App\Repository\MarchePublicRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
#[ORM\Entity(repositoryClass: MarchePublicRepository::class)]
class MarchePublic
{
public const CHOICE_NATURE_MARCHE = ['Marché', 'Marché de partenariat', 'Marché de défense ou de sécurité'];
public const CHOICE_TYPE_LIEUX = ['Code postal', 'Code commune', 'Code arrondissement', 'Code canton', 'Code département', 'Code région', 'Code pays'];
public const CHOICE_TECHNIQUE = ['Accord-cadre', 'Concours', 'Système de qualification', 'Système d’acquisition dynamique', 'Catalogue électronique', 'Enchère électronique', 'Sans objet'];
public const CHOICE_MODALITE = ['Tranches', 'Bons de commande', 'Marchés subséquents', 'Sans objet'];
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 255)]
#[Assert\NotNull(message: "L'identifiant du marché public doit être renseigné.")]
#[Assert\Length(
max: 16,
maxMessage: "L'identifiant du marché public doit contenir au maximum {{ limit }} caractères."
)]
private ?string $marchePublicIdentifiant = null;
#[ORM\Column(length: 500)]
#[Assert\NotNull(message: "Le champ nom de l'acheteur doit être renseigné.")]
private ?string $acheteurNom = null;
#[ORM\Column]
#[Assert\Length(
exactly: 14,
exactMessage: 'L\'identifiant SIRET doit comporter exactement 14 chiffres.'
)]
#[Assert\NotNull(message: "Le champ SIRET doit être renseigné.")]
private ?string $acheteurId = null;
#[ORM\Column(length: 255)]
#[Assert\NotNull(message: "Le champ Nature du marché doit être renseigné.")]
#[Assert\Choice(choices: MarchePublic::CHOICE_NATURE_MARCHE, message: 'Choisissez une valeur valide pour la nature du marché public')]
private ?string $nature = null;
#[ORM\Column(length: 1050)]
#[Assert\NotNull(message: "Le champ Objet doit être renseigné.")]
#[Assert\Length(
max: 1000,
maxMessage: "Le champs Objet est limité à {{ limit }} caractères"
)]
private ?string $objet = null;
#[Assert\NotNull(message: "Le champ Code CPV doit être renseigné.")]
#[Assert\Regex(
pattern: '/^(\d{8}|\d{8}-\d{1})$/',
message: "Le format du code CPV doit être de 8 chiffres ou de 8 chiffres suivis d'un tiret et d'un chiffre."
)]
#[ORM\Column(length: 255)]
private ?string $codeCPV = null;
//s'appelle comme ça car "procedure" est un nom réservé par symfony
#[Assert\NotNull(message: "Le champ Procédure doit être renseigné.")]
#[ORM\Column(length: 1000)]
private ?string $marchePublicProcedure = null;
#[Assert\NotNull(message: "Le champ Lieu d'exécution doit être renseigné.")]
#[ORM\Column(length: 255)]
private ?string $lieuExecutionCode = null;
#[ORM\Column(length: 255)]
#[Assert\NotNull(message: "Le champs Type de lieu d'exécution doit être renseigné.")]
#[Assert\Choice(choices: MarchePublic::CHOICE_TYPE_LIEUX, message: 'Choisissez une valeur valide pour le type de code du lieu d’exécution.')]
private ?string $lieuExecutionTypeCode = null;
#[ORM\Column(length: 500)]
#[Assert\NotNull(message: "Le champ nom du lieu d'exécution doit être renseigné.")]
private ?string $lieuExecutionNom = null;
#[ORM\Column]
#[Assert\NotNull(message: "La durée en mois doit être renseignée.")]
#[Assert\Type(type: 'integer', message: "La durée doit être un nombre entier.")]
#[Assert\GreaterThanOrEqual(value: 1, message: "La durée doit être d'au moins 1 mois.")]
private ?int $dureeMois = null;
#[ORM\Column(type: Types::DATE_MUTABLE)]
#[Assert\NotNull(message: "La date de réception de la notification doit être renseignée.")]
private ?\DateTimeInterface $dateNotification = null;
#[ORM\Column(type: Types::DATE_MUTABLE)]
#[Assert\NotNull(message: "La date de publication des données est obligatoire.")]
private ?\DateTimeInterface $datePublicationDonnees = null;
#[ORM\Column(type: Types::DECIMAL, precision: 20, scale: 2)]
#[Assert\NotNull(message: "Le montant initial du marché est obligatoire.")]
#[Assert\Type(type: 'numeric', message: "Le montant doit être un nombre décimal.")]
private ?string $montant = null;
#[ORM\Column]
#[Assert\NotNull(message: "Le champ technique d'achat doit être renseigné.")]
#[Assert\Choice(choices: MarchePublic::CHOICE_TECHNIQUE, multiple: true, message: "Choisissez une ou plusieurs valeurs valides pour le champ technique.")]
private ?array $technique = [];
#[Assert\Choice(choices: MarchePublic::CHOICE_MODALITE, multiple: true, message: "Choisissez une ou plusieurs valeurs valides pour le champ modalité d'exécution.")]
#[Assert\NotNull(message: "Le champ Modalités d'exécution doit être renseigné.")]
#[ORM\Column]
private ?array $modaliteExecution = [];
#[ORM\Column(length: 255, nullable: true)]
private ?string $idAccordCadre = null;
#[ORM\Column(length: 255)]
#[Assert\NotNull(message: "Le champ type de prix doit être renseigné.")]
#[Assert\Choice(choices: ['Définitif ferme', 'Définitif actualisable', 'Définitif révisable', 'Provisoire'], multiple: true, message: "Choisissez un ou plusieurs types de prix valides.")]
private array $typePrix = [];
#[ORM\Column]
#[Assert\Type(type: 'bool', message: "La valeur doit être un booléen (oui ou non).")]
private ?bool $marcheInnovant = null;
#[ORM\Column(length: 255)]
#[Assert\NotNull(message: "Le champ CCAG doit être renseigné.")]
#[Assert\Choice(choices: ['Travaux', 'Maitrise d’œuvre', 'Fournitures courantes et services', 'Marchés industriels', 'Prestations intellectuelles', 'Techniques de l’information et de la communication', 'Pas de CCAG'], message: 'Choisissez une valeur valide pour le CCAG.')]
private ?string $ccag = null;
#[ORM\Column]
#[Assert\NotNull(message: "Le nombre d'offres reçues doit être renseigné.")]
#[Assert\Type(type: 'integer', message: "Le nombre d'offres reçues doit être un nombre entier.")]
#[Assert\GreaterThanOrEqual(value: 1, message: "Le nombre d'offres reçues doit être au moins 1.")]
private ?int $offresRecues = null;
#[ORM\Column]
#[Assert\Type(type: 'bool', message: "La valeur doit être un booléen (oui ou non).")]
private ?bool $attributionAvance = null;
#[ORM\Column(type: Types::DECIMAL, precision: 20, scale: 2, nullable: true)]
#[Assert\Type(type: 'numeric', message: "Le taux d'avance doit être un nombre décimal.")]
#[Assert\Range(notInRangeMessage: "Le taux d'avance dot être compris entre 0 et 100.", min: 0, max: 100)]
private ?string $tauxAvance = null;
#[ORM\Column(length: 255, nullable: true)]
#[Assert\Choice(choices: ['Conjoint', 'Solidaire', 'Pas de groupement'], message: 'Choisissez un type de groupement valide pour les opérateurs.')]
private ?string $typeGroupementOperateurs = null;
#[ORM\Column(type: Types::DECIMAL, precision: 20, scale: 2/* , nullable: true */)]
/* #[Assert\NotNull(message: "Le champ Origine UE doit être renseigné.")] */
#[Assert\Type(type: 'numeric', message: "La valeur doit être un nombre décimal.")]
#[Assert\Range(notInRangeMessage: "Le pourcentage des produits d'origine UE dot être compris entre 0 et 100.", min: 0, max: 100)]
private ?string $origineUe = null;
#[ORM\Column(type: Types::DECIMAL, precision: 20, scale: 2/* , nullable: true */)]
/* #[Assert\NotNull(message: "Le champ Origine France doit être renseigné.")] */
#[Assert\Type(type: 'numeric', message: "La valeur doit être un nombre décimal.")]
#[Assert\Range(notInRangeMessage: "Le pourcentage des produits d'origine UE dot être compris entre 0 et 100.", min: 0, max: 100)]
private ?string $origineFrance = null;
#[ORM\Column]
#[Assert\Type(type: 'bool', message: "La valeur doit être un booléen (oui ou non).")]
private ?bool $sousTraitanceDeclaree = null;
#[ORM\Column]
#[Assert\Choice(choices: ['Clause sociale', 'Critère social', 'Marché réservé', 'Pas de considération sociale'], multiple: true, message: "Choisissez une ou plusieurs valeurs valides pour les considérations sociales.")]
#[Assert\NotNull(message: "Le champ Considérations sociales doit être renseigné.")]
private array $considerationsSociales = [];
#[ORM\Column]
#[Assert\NotNull(message: "Le champ considérations environnementale doit être renseigné.")]
#[Assert\Choice(choices: ['Clause environnementale', 'Critère environnemental', 'Pas de considération environnementale'], multiple: true, message: "Choisissez une ou plusieurs valeurs valides pour les considérations environnementales.")]
private array $considerationsEnvironnementales = [];
#[ORM\Column(length: 255)]
#[Assert\NotNull(message: "Le champ forme du prix doit être renseigné.")]
#[Assert\Choice(choices: ['Unitaire', 'Forfaitaire', 'Mixte'], message: 'Choisissez une valeur valide pour la forme du prix.')]
private ?string $formePrix = null;
#[ORM\OneToMany(mappedBy: 'marchePublic', targetEntity: SousTraitance::class, cascade: ['persist'])]
private Collection $sousTraitance;
#[ORM\OneToMany(mappedBy: 'marchePublic', targetEntity: Modification::class, cascade: ['persist'])]
private Collection $modification;
#[ORM\OneToMany(mappedBy: 'marchePublic', targetEntity: ModificationActeSousTraitance::class, cascade: ['persist'])]
private Collection $modificationActeSousTraitance;
#[ORM\OneToMany(mappedBy: 'marchePublic', targetEntity: Titulaire::class, cascade: ['persist'])]
private Collection $titulaire;
#[ORM\Column(type: Types::DATE_MUTABLE)]
private ?\DateTimeInterface $dateMade = null;
#[ORM\ManyToOne(inversedBy: 'marchePublics')]
private ?User $user = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $apiId = null;
public function __construct()
{
$this->sousTraitance = new ArrayCollection();
$this->modification = new ArrayCollection();
$this->modificationActeSousTraitance = new ArrayCollection();
$this->titulaire = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getMarchePublicIdentifiant(): ?string
{
return $this->marchePublicIdentifiant;
}
public function setMarchePublicIdentifiant(string $marchePublicIdentifiant): static
{
$this->marchePublicIdentifiant = $marchePublicIdentifiant;
return $this;
}
public function getAcheteurNom(): ?string
{
return $this->acheteurNom;
}
public function setAcheteurNom(string $acheteurNom): static
{
$this->acheteurNom = $acheteurNom;
return $this;
}
public function getAcheteurId(): ?string
{
return $this->acheteurId;
}
public function setAcheteurId(string $acheteurId): static
{
$this->acheteurId = $acheteurId;
return $this;
}
public function getNature(): ?string
{
return $this->nature;
}
public function setNature(string $nature): static
{
$this->nature = $nature;
return $this;
}
public function getObjet(): ?string
{
return $this->objet;
}
public function setObjet(string $objet): static
{
$this->objet = $objet;
return $this;
}
public function getCodeCPV(): ?string
{
return $this->codeCPV;
}
public function setCodeCPV(string $codeCPV): static
{
$this->codeCPV = $codeCPV;
return $this;
}
public function getMarchePublicProcedure(): ?string
{
return $this->marchePublicProcedure;
}
public function setMarchePublicProcedure(string $marchePublicProcedure): static
{
$this->marchePublicProcedure = $marchePublicProcedure;
return $this;
}
public function getLieuExecutionCode(): ?string
{
return $this->lieuExecutionCode;
}
public function setLieuExecutionCode(string $lieuExecutionCode): static
{
$this->lieuExecutionCode = $lieuExecutionCode;
return $this;
}
public function getLieuExecutionTypeCode(): ?string
{
return $this->lieuExecutionTypeCode;
}
public function setLieuExecutionTypeCode(string $lieuExecutionTypeCode): static
{
$this->lieuExecutionTypeCode = $lieuExecutionTypeCode;
return $this;
}
public function getLieuExecutionNom(): ?string
{
return $this->lieuExecutionNom;
}
public function setLieuExecutionNom(string $lieuExecutionNom): static
{
$this->lieuExecutionNom = $lieuExecutionNom;
return $this;
}
public function getDureeMois(): ?int
{
return $this->dureeMois;
}
public function setDureeMois(int $dureeMois): static
{
$this->dureeMois = $dureeMois;
return $this;
}
public function getDateNotification(): ?\DateTimeInterface
{
return $this->dateNotification;
}
public function setDateNotification(\DateTimeInterface $dateNotification): static
{
$this->dateNotification = $dateNotification;
return $this;
}
public function getDatePublicationDonnees(): ?\DateTimeInterface
{
return $this->datePublicationDonnees;
}
public function setDatePublicationDonnees(\DateTimeInterface $datePublicationDonnees): static
{
$this->datePublicationDonnees = $datePublicationDonnees;
return $this;
}
public function getMontant(): ?string
{
return $this->montant;
}
public function setMontant(string $montant): static
{
$this->montant = $montant;
return $this;
}
public function getTechnique(): array
{
return $this->technique;
}
public function setTechnique(array $technique): static
{
$this->technique = $technique;
return $this;
}
public function getModaliteExecution(): ?array
{
return $this->modaliteExecution;
}
public function setModaliteExecution(array $modaliteExecution): static
{
$this->modaliteExecution = $modaliteExecution;
return $this;
}
public function getIdAccordCadre(): ?string
{
return $this->idAccordCadre;
}
public function setIdAccordCadre(?string $idAccordCadre): static
{
$this->idAccordCadre = $idAccordCadre;
return $this;
}
public function getTypePrix(): array
{
return $this->typePrix;
}
public function setTypePrix(array $typePrix): static
{
$this->typePrix = $typePrix;
return $this;
}
public function isMarcheInnovant(): ?bool
{
return $this->marcheInnovant;
}
public function setMarcheInnovant(bool $marcheInnovant): static
{
$this->marcheInnovant = $marcheInnovant;
return $this;
}
public function getCcag(): ?string
{
return $this->ccag;
}
public function setCcag(string $ccag): static
{
$this->ccag = $ccag;
return $this;
}
public function getOffresRecues(): ?int
{
return $this->offresRecues;
}
public function setOffresRecues(int $offresRecues): static
{
$this->offresRecues = $offresRecues;
return $this;
}
public function isAttributionAvance(): ?bool
{
return $this->attributionAvance;
}
public function setAttributionAvance(bool $attributionAvance): static
{
$this->attributionAvance = $attributionAvance;
return $this;
}
public function getTauxAvance(): ?string
{
return $this->tauxAvance;
}
public function setTauxAvance(?string $tauxAvance): static
{
$this->tauxAvance = $tauxAvance;
return $this;
}
public function getTypeGroupementOperateurs(): ?string
{
return $this->typeGroupementOperateurs;
}
public function setTypeGroupementOperateurs(string $typeGroupementOperateurs): static
{
$this->typeGroupementOperateurs = $typeGroupementOperateurs;
return $this;
}
public function getOrigineUe(): ?string
{
return $this->origineUe;
}
public function setOrigineUe(?string $origineUe): static
{
$this->origineUe = $origineUe;
return $this;
}
public function getOrigineFrance(): ?string
{
return $this->origineFrance;
}
public function setOrigineFrance(?string $origineFrance): static
{
$this->origineFrance = $origineFrance;
return $this;
}
public function isSousTraitanceDeclaree(): ?bool
{
return $this->sousTraitanceDeclaree;
}
public function setSousTraitanceDeclaree(bool $sousTraitanceDeclaree): static
{
$this->sousTraitanceDeclaree = $sousTraitanceDeclaree;
return $this;
}
public function getConsiderationsSociales(): array
{
return $this->considerationsSociales;
}
public function setConsiderationsSociales(array $considerationsSociales): static
{
$this->considerationsSociales = $considerationsSociales;
return $this;
}
public function getConsiderationsEnvironnementales(): array
{
return $this->considerationsEnvironnementales;
}
public function setConsiderationsEnvironnementales(array $considerationsEnvironnementales): static
{
$this->considerationsEnvironnementales = $considerationsEnvironnementales;
return $this;
}
public function getFormePrix(): ?string
{
return $this->formePrix;
}
public function setFormePrix(string $formePrix): static
{
$this->formePrix = $formePrix;
return $this;
}
/**
* @return Collection<int, SousTraitance>
*/
public function getSousTraitance(): Collection
{
return $this->sousTraitance;
}
public function addSousTraitance(SousTraitance $sousTraitance): static
{
if (!$this->sousTraitance->contains($sousTraitance)) {
$this->sousTraitance->add($sousTraitance);
$sousTraitance->setMarchePublic($this);
}
return $this;
}
public function removeSousTraitance(SousTraitance $sousTraitance): static
{
if ($this->sousTraitance->removeElement($sousTraitance)) {
// set the owning side to null (unless already changed)
if ($sousTraitance->getMarchePublic() === $this) {
$sousTraitance->setMarchePublic(null);
}
}
return $this;
}
/**
* @return Collection<int, Modification>
*/
public function getModification(): Collection
{
return $this->modification;
}
public function addModification(Modification $modification): static
{
if (!$this->modification->contains($modification)) {
$this->modification->add($modification);
$modification->setMarchePublic($this);
}
return $this;
}
public function removeModification(Modification $modification): static
{
if ($this->modification->removeElement($modification)) {
// set the owning side to null (unless already changed)
if ($modification->getMarchePublic() === $this) {
$modification->setMarchePublic(null);
}
}
return $this;
}
/**
* @return Collection<int, ModificationActeSousTraitance>
*/
public function getModificationActeSousTraitance(): Collection
{
return $this->modificationActeSousTraitance;
}
public function addModificationActeSousTraitance(ModificationActeSousTraitance $modificationActeSousTraitance): static
{
if (!$this->modificationActeSousTraitance->contains($modificationActeSousTraitance)) {
$this->modificationActeSousTraitance->add($modificationActeSousTraitance);
$modificationActeSousTraitance->setMarchePublic($this);
}
return $this;
}
public function removeModificationActeSousTraitance(ModificationActeSousTraitance $modificationActeSousTraitance): static
{
if ($this->modificationActeSousTraitance->removeElement($modificationActeSousTraitance)) {
// set the owning side to null (unless already changed)
if ($modificationActeSousTraitance->getMarchePublic() === $this) {
$modificationActeSousTraitance->setMarchePublic(null);
}
}
return $this;
}
/**
* @return Collection<int, Titulaire>
*/
public function getTitulaire(): Collection
{
return $this->titulaire;
}
public function addTitulaire(Titulaire $titulaire): static
{
if (!$this->titulaire->contains($titulaire)) {
$this->titulaire->add($titulaire);
$titulaire->setMarchePublic($this);
}
return $this;
}
public function removeTitulaire(Titulaire $titulaire): static
{
if ($this->titulaire->removeElement($titulaire)) {
// set the owning side to null (unless already changed)
if ($titulaire->getMarchePublic() === $this) {
$titulaire->setMarchePublic(null);
}
}
return $this;
}
public function getDateMade(): ?\DateTimeInterface
{
return $this->dateMade;
}
public function setDateMade(\DateTimeInterface $dateMade): static
{
$this->dateMade = $dateMade;
return $this;
}
public function getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): static
{
$this->user = $user;
return $this;
}
public function getApiId(): ?string
{
return $this->apiId;
}
public function setApiId(?string $apiId): static
{
$this->apiId = $apiId;
return $this;
}
}