<?php
namespace App\Entity;
use App\Service\MissionService;
use App\Enum\Role;
use App\Enum\ProductType;
use App\Repository\CampaignRepository;
use App\Service\CampaignService;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Uid\Uuid;
use Symfony\Component\Validator\Constraints as Assert;
#[ORM\Entity(repositoryClass: CampaignRepository::class)]
#[ORM\Table(name: 'campaigns')]
class Campaign
{
#[ORM\Id]
#[ORM\Column(type: 'string', length: 22, unique: true)]
#[Groups(['campaign', 'mission_list', 'mission_read','message_read'])]
private string $id;
#[ORM\Column(type: 'string')]
#[Assert\NotBlank(message: 'Merci de remplir ce champs')]
#[Groups(['campaign', 'mission_list', 'mission_read'])]
private ?string $name = '';
#[ORM\Column(type: 'string')]
#[Groups(['campaign','mission_list','mission_read'])]
private string $state = 'provisional';
#[ORM\Column(type: 'datetime', nullable: true)]
private ?\DateTimeInterface $dateClosed = null;
#[ORM\Column(type: 'boolean', nullable: true)]
private $isNew;
#[ORM\Column(type: 'boolean', nullable: true)]
private $disabled;
#[ORM\Column(type: 'boolean', nullable: true)]
private $confidentiality;
#[ORM\Column(type: 'datetime_immutable')]
#[Groups(['campaign'])]
private \DateTimeImmutable $createdAt;
#[ORM\ManyToOne(targetEntity: Company::class, inversedBy: 'campaigns', cascade: ["persist"])]
#[Groups(['campaign', 'mission_read','mission_list'])]
private ?Company $company = null;
#[ORM\OneToMany(mappedBy: 'campaign', targetEntity: Mission::class, cascade: ['persist'], orphanRemoval: true)]
#[Groups(['campaign'])]
private Collection $missions;
#[ORM\ManyToOne(targetEntity: User::class, inversedBy: 'campaigns')]
private ?User $orderedBy = null;
#[ORM\Column(type: 'boolean', nullable: true)]
private ?bool $invoiced = false;
#[ORM\Column(type: 'boolean', nullable: true)]
private ?bool $activeFrequency = false;
#[ORM\OneToMany(mappedBy: 'campaign', targetEntity: Invoice::class, cascade: ['persist'])]
private ?Collection $invoices;
#[ORM\OneToOne(targetEntity: RecurringService::class,cascade: ['persist'])]
private $frequency;
#[ORM\OneToMany(mappedBy: 'campaign', targetEntity: Message::class)]
#[Groups(['mission_read'])]
private ?Collection $messages;
#[ORM\Column(type: 'string', length: 255, nullable: true)]
private ?string $totalCostCampaign = null;
#[ORM\Column(type: 'text', nullable: true)]
private ?string $cancelReason = null;
#[ORM\Column(type: 'text', nullable: true)]
private ?string $brief = null;
#[ORM\Column(type: 'boolean', nullable: true)]
private $isPaidOnCredit;
#[ORM\Column(type: 'string', length: 255, nullable: true)]
private $paymentMethod;
#[ORM\Column(type: 'datetime_immutable', nullable: true)]
private $activatedAt;
#[ORM\Column(type: 'string', length: 255, nullable: true)]
private $clientStatus;
#[ORM\Column(type: 'boolean', nullable: true)]
private $isToBeinvoiced;
#[ORM\Column(type: 'float', nullable: true)]
private $discountForCompany;
#[ORM\Column(type: 'boolean', nullable: true)]
private $reSendToClient;
#[ORM\OneToMany(mappedBy: 'campaign', targetEntity: FileMission::class, cascade: ["persist", "remove"], orphanRemoval: true)]
private ?Collection $fileMissions;
/**
* This property is not persited because there are a problème in the commande
*
* @var string
*/
private ?string $errorCommand = null;
#[ORM\Column(type: 'string', length: 255, nullable: true)]
private $numberInitialOfMissions;
#[ORM\Column(type: 'string', length: 255, nullable: true)]
private $lastState;
#[ORM\ManyToOne(targetEntity: CreditHistory::class, inversedBy: 'campaigns')]
private $creditHistory;
#[ORM\Column(type: 'text', nullable: true)]
private $deleteReason;
#[ORM\Column(type: 'boolean')]
private $isOrdoredByAdmin;
#[ORM\Column(type: 'array', nullable: true)]
private $defautObserver = [];
#[ORM\Column(type: 'array', nullable: true)]
private $defaultValidator = [];
#[ORM\Column(type: 'array', nullable: true)]
private $defaultValidatorExternal = [];
#[ORM\Column(type: 'array', nullable: true)]
private $defautObserverExternal = [];
#[ORM\Column(nullable: true)]
private ?\DateTimeImmutable $statusModifyAt = null;
#[ORM\Column(nullable: true)]
private ?bool $isRecurrent = null;
#[ORM\Column(length: 255,nullable: true)]
private ?string $recurringState = null;
#[ORM\OneToMany(mappedBy: 'campaign', targetEntity: CampaignPendingToSend::class)]
private $campaignPendingToSends;
#[ORM\Column(type: 'integer', nullable: true)]
private $lastStepWp;
#[ORM\Column(type: 'integer', nullable: true)]
private $frontWpId;
#[ORM\Column(type: 'string', length: 255, nullable: true)]
private $wpSlug;
#[ORM\Column(type: 'array', nullable: true)]
#[Groups(['campaign', 'mission_list', 'mission_read'])]
private $stateHistory = [];
#[ORM\Column(type: 'integer', nullable: true)]
private $typeInitiation;
#[ORM\Column(type: 'boolean', nullable: true)]
private $emailSentInsuffBudget;
#[ORM\Column(type: 'array', nullable: true)]
private $user_writing = [];
#[ORM\Column(type: 'string', length: 255, nullable: true)]
private $cloningSourceId;
#[ORM\Column(nullable: true)]
private ?int $isActivated = 0;
#[Groups(['mission_read'])]
private $isAlreadyStart=false;
#[ORM\Column(nullable: true)]
private ?bool $newForLivrable = null;
public function __construct()
{
$this->id = Uuid::v4()->toBase58();
$this->createdAt = new \DateTimeImmutable();
$this->activatedAt = new \DateTimeImmutable();
$this->statusModifyAt = new \DateTimeImmutable();
$this->missions = new ArrayCollection();
$this->invoices = new ArrayCollection();
$this->messages = new ArrayCollection();
$this->isToBeinvoiced = false;
$this->reSendToClient= false;
$this->clientStatus="";
$this->isOrdoredByAdmin = false;
$this->activeFrequency = false;
$this->recurringState = null;
$this->fileMissions = new ArrayCollection();
$this->confidentiality = false;
$this->campaignPendingToSends = new ArrayCollection();
$this->stateHistory = [];
$this->emailSentInsuffBudget = false;
$this->wpSlug = "";
$this->newForLivrable = false;
}
public function __clone()
{
$this->cloningSourceId = $this->getId();
$this->id = Uuid::v4()->toBase58();
$this->missions = new ArrayCollection();
$this->messages = new ArrayCollection();
$this->createdAt = new \DateTimeImmutable();
$this->activatedAt = new \DateTimeImmutable();;
$this->invoices = clone $this->invoices;
$this->frequency = null;
}
public function getId(): ?string
{
return $this->id;
}
public function generateNewId():self{
$this->id = Uuid::v4()->toBase58() ;
return $this;
}
/**
* @return string
*/
public function getName(): string
{
return $this->name;
}
/**
* @param string $name
* @return Campaign
*/
public function setName(?string $name): Campaign
{
$this->name = $name;
return $this;
}
/**
* @return \DateTimeImmutable|null
*/
public function getCreatedAt(): ?\DateTimeInterface
{
return $this->createdAt;
}
/**
* @param \DateTimeImmutable|null $createdAt
* @return Campaign
*/
public function setCreatedAt(?\DateTimeImmutable $createdAt): Campaign
{
$this->createdAt = $createdAt;
return $this;
}
public function getCompany(): ?Company
{
return $this->company;
}
public function setCompany(?Company $company): self
{
$this->company = $company;
return $this;
}
/**
* @return Collection|Mission[]
*/
public function getMissions(): Collection
{
return $this->missions;
}
public function addMission(Mission $mission): self
{
if (!$this->missions->contains($mission)) {
$this->missions[] = $mission;
$mission->setCampaign($this);
}
return $this;
}
public function removeMission(Mission $mission): self
{
if ($this->missions->removeElement($mission)) {
// set the owning side to null (unless already changed)
if ($mission->getCampaign() === $this) {
$mission->setCampaign(null);
}
}
return $this;
}
/**
* @return string
*/
public function getState(): string
{
return $this->state;
}
/**
* @param string $state
* @return Campaign
*/
public function setState(string $state): Campaign
{
$this->statusModifyAt = new \DateTimeImmutable();
$notActivated = $this->getCreatedAt() == $this->getActivatedAt() ? true : false;
$isCampaignNotActivated = is_null($this->getIsActivated()) || $this->getIsActivated() == 0 ? true : false;
if ($this->getState() !== "in_progress" && ($state == "in_progress" || $state == "archived") && $notActivated && $isCampaignNotActivated){
$this->setActivatedAt(new \DateTimeImmutable());
$this->setIsActivated(1);
}
$this->setLastState($this->state);
$stateHistory = $this->getStateHistory()!=null ? $this->getStateHistory() : [];
$this->setStateHistory([...$stateHistory, [
[
'date'=> date('d/M/Y h:i:s'),
'state'=>$this->state
]
]]);
$this->state = $state;
//modify date closed
if ($state == "closed") {
$this->dateClosed = new \DateTimeImmutable();
}
//end modification
return $this;
}
public function getOrderedBy(): ?User
{
return $this->orderedBy;
}
public function setOrderedBy(?User $orderedBy): self
{
$this->orderedBy = $orderedBy;
return $this;
}
public function getProgress(): int
{
$progress = 0;
foreach ($this->getMissionsWithoutEspaceDeDiscussion() as $mission) {
if (!empty($mission->getWorkflow())) {
if ($mission->getState() == "finalized") {
$progress +=100;
}else{
$progress += $mission->getWorkflow()->getProgress();
}
}
}
$count = 0;
foreach ($this->getMissionsWithoutEspaceDeDiscussion() as $mission) {
if ($mission->getProduct()->getName() != "Espace de discussion") {
$count++;
}
}
if ($progress > 0) {
return $progress / $count;
}
// $progress = $progress > 100 ? 100 : $progress;
return round($progress);
}
public function getTotalCost(): float
{
$cost = 0;
foreach ($this->getMissions() as $mission) {
if($mission->getState() != "cancelled"){
$cost += $mission->getPrice() * $mission->getQuantity();
}
}
return $cost;
}
public function getInvoiced(): ?bool
{
return $this->invoiced;
}
public function setInvoiced(?bool $invoiced): self
{
$this->invoiced = $invoiced;
return $this;
}
/**
* @return Collection|Invoice[]
*/
public function getInvoices(): Collection
{
return $this->invoices;
}
public function addInvoice(Invoice $invoice): self
{
if (!$this->invoices->contains($invoice)) {
$this->invoices[] = $invoice;
$invoice->setCampaign($this);
}
return $this;
}
public function removeInvoice(Invoice $invoice): self
{
if ($this->invoices->removeElement($invoice)) {
// set the owning side to null (unless already changed)
if ($invoice->getCampaign() === $this) {
$invoice->setCampaign(null);
}
}
return $this;
}
/**
* @return Collection|Message[]
*/
public function getMessages(): Collection
{
return $this->messages;
}
public function addMessage(Message $message): self
{
if (!$this->messages->contains($message)) {
$this->messages[] = $message;
$message->setCampaign($this);
}
return $this;
}
public function subcontractorActivatedForfait($idUser){
foreach ($this->getMissions() as $mission) {
foreach ($mission->getParticipants() as $key => $participant) {
if ($idUser == $participant->getUser()->getId() and $participant->isActivated()) {
return true;
}
}
}
return false;
}
public function allProductIsForfait(){
foreach ($this->getMissions() as $mission) {
if ($mission->getProduct()->getType() != ProductType::AU_FORFAIT) {
return false;
}
}
return true;
}
public function removeMessage(Message $message): self
{
if ($this->messages->removeElement($message)) {
// set the owning side to null (unless already changed)
if ($message->getCampaign() === $this) {
$message->setCampaign(null);
}
}
return $this;
}
public function getTotalCostCampaign(): ?string
{
return $this->totalCostCampaign;
}
public function setTotalCostCampaign(?string $totalCostCampaign): self
{
$this->totalCostCampaign = $totalCostCampaign;
return $this;
}
/**
* @return string|null
*/
public function getCancelReason(): ?string
{
return $this->cancelReason;
}
/**
* @param string|null $cancelReason
*/
public function setCancelReason(?string $cancelReason): void
{
$this->cancelReason = $cancelReason;
}
/**
* @return string|null
*/
public function getBrief(): ?string
{
return $this->addTargetBlankToBriefLink($this->brief);
}
/**
* @param string|null $brief
*/
public function setBrief(?string $brief):void
{
$this->brief = $this->addTargetBlankToBriefLink($brief);
}
/**
* @param string|null $brief
* @return string|null $brief
*/
private function addTargetBlankToBriefLink(?string $brief): ?string {
$regex = '/<a\s+(?:[^>]*?\s+)?href="([^"]*)"(?:[^>]*?\s+)?(target="_blank")?>([^<]*)<\/a>/i';
if(!is_null($brief)){
preg_match_all($regex,$brief,$matches,PREG_SET_ORDER);
foreach ($matches as $match){
// $match[1] est l'URL du lien
// $match[2] est l'attribut target si présent
// $match[3] est le contenu du lien
if (!empty($match[1]) && empty($match[2])) {
// Ajoutez l'attribut target="_blank" si l'URL n'est pas vide et que l'attribut target n'est pas présent
$brief = str_replace($match[0], '<a href="'.$match[1].'" target="_blank">'.$match[3].'</a>', $brief);
}
}
}
return $brief;
}
public function canActivate(bool $isAdmin = false, bool $isSubContractor = false): bool
{
if ($this->getMissions()->count() === 0) {
return false;
}
if (!$isSubContractor && !$isAdmin) {
return false;
}
$subcontractors = [];
foreach ($this->getMissions() as $mission) {
if (!$mission->canActivate()) {
return false;
}
foreach ($mission->getParticipants() as $participant) {
if ($participant->getRole() === Role::ROLE_SUBCONTRACTOR && !in_array($participant->getUser()->getId(), $subcontractors)) {
$subcontractors[] = $participant->getUser()->getId();
}
}
}
if (!$isAdmin && count($subcontractors) > 1) {
return false;
}
return true;
}
public function canShowPriceInClient(){
$show = true;
foreach ($this->getMissions() as $mission) {
//product forfaitaire pas pris en compte
if ($mission->getProduct()->getType()->value == 1) {
continue;
}
//end
//first test is determine all mission already have a complete subcontrator
$jobNotExists = array_diff($this->getJobInMission($mission), $this->getJobSubcontractorInMission($mission));
if (!empty($jobNotExists)) {
return false;
}
if($mission->getProduct()->getType()->value == 3 ){
continue;
}
//second test is determine all subcontrator is evaluated
foreach ($mission->getParticipants() as $participant) {
if($mission->getPriceSale()!=null){
continue;
}
if ($participant->getRole()->value =="ROLE_SUBCONTRACTOR" ) {
if (is_null($participant->getEstimatedIncome()))
{
return false;
}
}
}
}
return $show;
}
/**
* get all job in mission
* @param Mission $mission
* @return Array
*/
public function getJobInMission(Mission $mission)
{
$listJobInMission = [];
foreach ($mission->getProduct()->getJobs() as $job) {
$listJobInMission[] = $job->getName();
}
return $listJobInMission;
}
/**
* get all job participant in mission
* @param Mission $mission
* @return Array
*/
public function getJobSubcontractorInMission(Mission $mission)
{
$listAllJobSub = [];
foreach ($mission->getParticipants() as $participant) {
if (!is_null($participant) && !is_null($participant->getJob()))
$listAllJobSub[] = $participant->getJob()->getName();
}
return $listAllJobSub;
}
/**
* Get content of campaign and returned this content
*
* 1 : if content of campaign is a product forfaitaire only
*
* 2 : if content of campaign is a product to evaluate only
*
* 3 : if content of campaign is a product mixed only
*
* @return int
*/
public function getTypeOfProduct():int
{
$nombreProductForfaitaire = 0 ;
$nombreProductAEvaluer = 0 ;
$nombreOfMissions = sizeof($this->getMissions());
foreach ($this->getMissions() as $key => $mission) {
if($mission->getProduct()->getType()->value == 1 || $mission->getProduct()->getType()->value == 3 ){
$nombreProductForfaitaire++;
}
else{
$nombreProductAEvaluer ++;
}
}
if($nombreProductForfaitaire==$nombreOfMissions){
return 1;
}
elseif($nombreProductAEvaluer==$nombreOfMissions){
return 2;
}
else {
return 3;
}
}
/**
* This method show if one subcontrator is in an all mission
*
* @return bool true if one subcontractor for all mission in campaign, and false for contrary
*/
public function isOneSubcontractorForAllMission():bool
{
$userId= null;
foreach ($this->getMissions() as $mission) {
foreach ($mission->getParticipants() as $participant) {
if($participant->getRole()->value =="ROLE_SUBCONTRACTOR" && !in_array('ROLE_BOT',$participant->getUser()->getRoles())){
if($userId == null){
$userId = $participant->getUser()->getId();
}
else{
if($userId !== $participant->getUser()->getId()){
return false;
}
}
}
}
}
return true;
}
public function haveBot(){
foreach ($this->getMissions() as $mission) {
foreach ($mission->getParticipants() as $participant) {
if (in_array('ROLE_BOT',$participant->getUser()->getRoles())) {
return true;
}
}
}
return false;
}
/**
* Get all mission no subcontractor
*
* @return array
*/
public function getMissionNoSubContractor(): array
{
$missionNoSubContractor = [];
foreach ($this->getMissions() as $mission) {
if(!$this->missionHaveSubcontractor($mission)){
$missionNoSubContractor=[...$missionNoSubContractor, $mission];
}
}
return $missionNoSubContractor;
}
public function canResendMail()
{
foreach ($this->getMissions() as $mission) {
if ($mission->getWorkflow() !== null)
foreach ($mission->getWorkflow()->getSteps() as $step) {
if ($step->isActive()) {
return true;
}
}
}
return false;
}
/**
* For know if a campain is payed by credit
*
* @return bool|null
*/
public function getIsPaidOnCredit(): ?bool
{
return $this->isPaidOnCredit;
}
/**
* @param bool|null $isPaidOnCredit
*
* @return self
*/
public function setIsPaidOnCredit(?bool $isPaidOnCredit): self
{
$this->isPaidOnCredit = $isPaidOnCredit;
return $this;
}
public function getPaymentMethod(): ?string
{
return $this->paymentMethod;
}
public function setPaymentMethod(?string $paymentMethod): self
{
$this->paymentMethod = $paymentMethod;
return $this;
}
public function canActivateEveryMission()
{
$verifisAllMissionisDefined = true;
foreach ($this->getMissions() as $mission) {
if ( $mission->getStateProvider() != "cancelled" ) {
if ($mission->canActivate() === false) {
return false;
}
if (!$this->missionHaveSubcontractor($mission)) {
return false;
}
if (is_null($mission->getWorkflow())) {
return false;
}
}
}
return $verifisAllMissionisDefined;
}
public function missionHaveSubcontractor($mission)
{
//1 = temps passé izy de tsy ilaina.
$haveSubcontractor = false;
foreach ($mission->getParticipants() as $participant) {
if (($participant->getRole() === Role::ROLE_SUBCONTRACTOR and $participant->getUser()->getBillingMethod() == 2 and !in_array('ROLE_BOT', $participant->getUser()->getRoles()))
or
($participant->getRole() === Role::ROLE_SUBCONTRACTOR and $participant->getUser()->getBillingMethod() == 1 and !in_array('ROLE_BOT', $participant->getUser()->getRoles()))
) {
$haveSubcontractor = true;
}
}
return $haveSubcontractor;
}
public function getActivatedAt(): ?\DateTimeImmutable
{
return $this->activatedAt;
}
public function setActivatedAt(?\DateTimeImmutable $activatedAt): self
{
$this->activatedAt = $activatedAt;
return $this;
}
public function getClientStatus(): ?string
{
return $this->clientStatus;
}
public function setClientStatus(?string $clientStatus): self
{
$this->clientStatus = $clientStatus;
return $this;
}
public function isToBeinvoiced(): ?bool
{
return $this->isToBeinvoiced;
}
public function setIsToBeinvoiced(?bool $isToBeinvoiced): self
{
$this->isToBeinvoiced = $isToBeinvoiced;
return $this;
}
public function getDiscountForCompany(): ?float
{
return $this->discountForCompany;
}
public function setDiscountForCompany(?float $discountForCompany): self
{
$this->discountForCompany = $discountForCompany;
return $this;
}
public function getReSendToClient(): ?bool
{
return $this->reSendToClient;
}
public function setReSendToClient(?bool $reSendToClient): self
{
$this->reSendToClient = $reSendToClient;
return $this;
}
/**
* To get a error if a commande have an error
*
* @return string
*/
public function getErrorCommand():?string{
return $this->errorCommand;
}
/**
* set a error command manually because this is not persisted
*
* @param string $errorCommand
*
* @return void
*/
public function setErrorCommand(?string $errorCommand):void
{
$this->errorCommand= $errorCommand;
}
public function getNumberInitialOfMissions(): ?string
{
return $this->numberInitialOfMissions;
}
public function setNumberInitialOfMissions(?string $numberInitialOfMissions): self
{
$this->numberInitialOfMissions = $numberInitialOfMissions;
return $this;
}
public function getLastState(): ?string
{
return $this->lastState;
}
public function setLastState(?string $lastState): self
{
$this->lastState = $lastState;
return $this;
}
public function getDiscountValueForCredit(): float
{
return 220*(1-$this->getDiscountForCompany()/100);
}
public function getCreditHistory(): ?CreditHistory
{
return $this->creditHistory;
}
public function setCreditHistory(?CreditHistory $creditHistory): self
{
$this->creditHistory = $creditHistory;
return $this;
}
public function canClosedCampaing(){
$missions = $this->missions;
//connaitre les delais des participant s'il ont deja ajouté leur delais
foreach ($missions as $mission) {
//si tout les participants ont remplies leurs delais
foreach ($mission->getParticipants() as $participant) {
if ($participant->getRole() === Role::ROLE_SUBCONTRACTOR){
if (
(is_null($participant->getInitialTime()) ||
is_null($participant->getEstimatedIncome())
)
||
($participant->getInitialTime() == 0 || $participant->getEstimatedIncome() == 0 )
) {
return false;
}
}
}
// $jobNotExists = array_diff($this->missionService->getJobInMission($mission), $this->missionService->getJobSubcontractorInMission($mission));
}
return true;
}
public function getDeleteReason(): ?string
{
return $this->deleteReason;
}
public function setDeleteReason(?string $deleteReason): self
{
$this->deleteReason = $deleteReason;
return $this;
}
public function isOrdoredByAdmin(): ?bool
{
return $this->isOrdoredByAdmin;
}
public function setIsOrdoredByAdmin(bool $isOrdoredByAdmin): self
{
$this->isOrdoredByAdmin = $isOrdoredByAdmin;
return $this;
}
public function getDefautObserver(): ?array
{
return $this->defautObserver;
}
public function setDefautObserver(array $defautObserver): self
{
$this->defautObserver = $defautObserver;
return $this;
}
public function getDefaultValidator(): ?array
{
return $this->defaultValidator;
}
public function setDefaultValidator(?array $defaultValidator): self
{
$this->defaultValidator = $defaultValidator;
return $this;
}
public function getStatusModifyAt(): ?\DateTimeImmutable
{
return $this->statusModifyAt;
}
public function setStatusModifyAt(?\DateTimeImmutable $statusModifyAt): static
{
$this->statusModifyAt = $statusModifyAt;
return $this;
}
public function getIsToBeinvoiced(): ?bool
{
return $this->isToBeinvoiced;
}
public function getIsOrdoredByAdmin(): ?bool
{
return $this->isOrdoredByAdmin;
}
public function getFrequency(): ?RecurringService
{
return $this->frequency;
}
public function setFrequency(?RecurringService $frequency): self
{
$this->frequency = $frequency;
return $this;
}
public function getActiveFrequency(): ?bool
{
return $this->activeFrequency;
}
public function setActiveFrequency(?bool $activeFrequency): self
{
$this->activeFrequency = $activeFrequency;
return $this;
}
public function isRecurrent(): ?bool
{
return $this->isRecurrent;
}
public function setIsRecurrent(?bool $isRecurrent): static
{
$this->isRecurrent = $isRecurrent;
return $this;
}
public function __toString(){
return $this->getName();
}
public function getRecurringState(): ?string
{
return $this->recurringState;
}
public function setRecurringState(?string $recurringState): static
{
$this->recurringState = $recurringState;
return $this;
}
public function getIsRecurrent(): ?bool
{
return $this->isRecurrent;
}
/**
* @return Collection|FileMission[]
*/
public function getFileMissions(): Collection
{
return $this->fileMissions;
}
public function addFileMission(FileMission $fileMission): self
{
if (!$this->fileMissions->contains($fileMission)) {
$this->fileMissions[] = $fileMission;
$fileMission->setCampaign($this);
}
return $this;
}
public function removeFileMission(FileMission $fileMission): self
{
if ($this->fileMissions->removeElement($fileMission)) {
// set the owning side to null (unless already changed)
if ($fileMission->getCampaign() === $this) {
$fileMission->setCampaign(null);
}
}
return $this;
}
public function getIsNew(): ?bool
{
return $this->isNew;
}
public function setIsNew(?bool $isNew): self
{
$this->isNew = $isNew;
return $this;
}
public function getConfidentiality(): ?bool
{
return $this->confidentiality;
}
public function setConfidentiality(?bool $confidentiality): self
{
$this->confidentiality = $confidentiality;
return $this;
}
public function getDisabled(): ?bool
{
return $this->disabled;
}
public function setDisabled(?bool $disabled): self
{
$this->disabled = $disabled;
return $this;
}
/**
* @return Collection|CampaignPendingToSend[]
*/
public function getCampaignPendingToSends(): Collection
{
return $this->campaignPendingToSends;
}
public function addCampaignPendingToSend(CampaignPendingToSend $campaignPendingToSend): self
{
if (!$this->campaignPendingToSends->contains($campaignPendingToSend)) {
$this->campaignPendingToSends[] = $campaignPendingToSend;
$campaignPendingToSend->setCampaign($this);
}
return $this;
}
public function removeCampaignPendingToSend(CampaignPendingToSend $campaignPendingToSend): self
{
if ($this->campaignPendingToSends->removeElement($campaignPendingToSend)) {
// set the owning side to null (unless already changed)
if ($campaignPendingToSend->getCampaign() === $this) {
$campaignPendingToSend->setCampaign(null);
}
}
return $this;
}
public function getDefaultValidatorExternal(): ?array
{
return $this->defaultValidatorExternal;
}
public function setDefaultValidatorExternal(?array $defaultValidatorExternal): self
{
$this->defaultValidatorExternal = $defaultValidatorExternal;
return $this;
}
public function getDefautObserverExternal(): ?array
{
return $this->defautObserverExternal;
}
public function setDefautObserverExternal(?array $defautObserverExternal): self
{
$this->defautObserverExternal = $defautObserverExternal;
return $this;
}
public function getLastStepWp(): ?int
{
return $this->lastStepWp;
}
public function setLastStepWp(?int $lastStepWp): self
{
$this->lastStepWp = $lastStepWp;
return $this;
}
public function getFrontWpId(): ?int
{
return $this->frontWpId;
}
public function setFrontWpId(?int $frontWpId): self
{
$this->frontWpId = $frontWpId;
return $this;
}
public function getWpSlug(): ?string
{
return $this->wpSlug;
}
public function setWpSlug(?string $wpSlug): self
{
$this->wpSlug = $wpSlug;
return $this;
}
public function getStateHistory(): ?array
{
return $this->stateHistory;
}
public function setStateHistory(?array $stateHistory): self
{
$this->stateHistory = $stateHistory;
return $this;
}
public function getTypeInitiation(): ?int
{
return $this->typeInitiation;
}
public function setTypeInitiation(?int $typeInitiation): self
{
$this->typeInitiation = $typeInitiation;
return $this;
}
public function getEmailSentInsuffBudget(): ?bool
{
return $this->emailSentInsuffBudget;
}
public function setEmailSentInsuffBudget(?bool $emailSentInsuffBudget): self
{
$this->emailSentInsuffBudget = $emailSentInsuffBudget;
return $this;
}
public function getAllUserExternal(){
$allUserExternal = [];
foreach ($this->getMissions() as $mission) {
foreach ($mission->getParticipants() as $participant) {
if (in_array($participant->getRole()->value, ['ROLE_OBSERVER_EXTERNAL','ROLE_VALIDATOR_EXTERNAL']) and $participant->getUser()->getDeleted() == 0) {
$allUserExternal = [...$allUserExternal,$participant->getUser()];
}
}
}
return $allUserExternal;
}
public function getAllUserInCampaing(){
$allUser = [];
foreach ($this->getMissions() as $mission) {
foreach ($mission->getParticipants() as $participant) {
$allUser = [...$allUser,$participant->getUser()->getId()];
}
}
return $allUser;
}
public function getAllUserInCampaingWithoutValidatorAndSubcontractor(){
$allUser = [];
$noRepeatIds = [];
foreach ($this->getMissions() as $mission) {
foreach ($mission->getParticipants() as $participant) {
if (!in_array($participant->getUser()->getId(), $noRepeatIds) and $participant->getRole() !== Role::ROLE_VALIDATOR and $participant->getRole() !== Role::ROLE_OBSERVER) {
$allUser = [...$allUser,$participant];
$noRepeatIds[] = $participant->getUser()->getId();
}
}
}
return $allUser;
}
public function getUserWriting(): ?array
{
return $this->user_writing;
}
public function setUserWriting(?array $user_writing): self
{
$this->user_writing = $user_writing;
return $this;
}
public function getMissionsWithoutEspaceDeDiscussion(){
$missions = $this->getMissions();
$tempMissions = [];
foreach ($missions as $mission) {
if($mission->getProduct()->getName() != "Espace de discussion"){
$tempMissions = [...$tempMissions, $mission];
}
}
return new ArrayCollection($tempMissions);
}
public function getMissionsWithoutTempPasse(){
$missions = $this->getMissions();
$missonWithoutTempPasse = [];
foreach ($missions as $mission) {
if ($mission->getProduct()->getType() != ProductType::AU_TEMPS_PASSE) {
$tempMissions = [...$missonWithoutTempPasse, $mission];
}
}
return new ArrayCollection($missonWithoutTempPasse);
}
public function isAlreadyStart(){
if($this->state == 'in_progress'){
return true;
}
elseif($this->getStateHistory() != null ){
foreach ($this->getStateHistory() as $history) {
if($history[0] == 'in_progress'){
return true;
}
}
}
return false;
}
// For api only, not persisted
public function getIsAlreadyStart(){
return $this->isAlreadyStart();
}
public function setIsAlreadyStart($isAlreadyStart){
$this->isAlreadyStart = $isAlreadyStart;
return $this;
}
//
public function getCloningSourceId(): ?string
{
return $this->cloningSourceId;
}
public function setCloningSourceId(?string $cloningSourceId): self
{
$this->cloningSourceId = $cloningSourceId;
}
public function getIsActivated(): ?int
{
return $this->isActivated;
}
public function setIsActivated(?int $isActivated): static
{
$this->isActivated = $isActivated;
return $this;
}
public function getContactProject(){
$contactProject = [];
foreach ($this->getMissions() as $key => $mission) {
foreach ($mission->getParticipants() as $participant) {
if ($participant->getRole() === Role::PROJECT_CONTACT) {
$contactProject[] = $participant->getUser();
}
}
if ($key > 1) {
break;
}
}
return $contactProject;
}
public function getDateClosed(): ?\DateTimeInterface
{
return $this->dateClosed;
}
public function setDateClosed(?\DateTimeInterface $dateClosed): static
{
$this->dateClosed = $dateClosed;
return $this;
}
public function isIsNew(): ?bool
{
return $this->isNew;
}
public function isDisabled(): ?bool
{
return $this->disabled;
}
public function isConfidentiality(): ?bool
{
return $this->confidentiality;
}
public function isInvoiced(): ?bool
{
return $this->invoiced;
}
public function isActiveFrequency(): ?bool
{
return $this->activeFrequency;
}
public function isIsPaidOnCredit(): ?bool
{
return $this->isPaidOnCredit;
}
public function isIsToBeinvoiced(): ?bool
{
return $this->isToBeinvoiced;
}
public function isReSendToClient(): ?bool
{
return $this->reSendToClient;
}
public function isIsOrdoredByAdmin(): ?bool
{
return $this->isOrdoredByAdmin;
}
public function isIsRecurrent(): ?bool
{
return $this->isRecurrent;
}
public function isEmailSentInsuffBudget(): ?bool
{
return $this->emailSentInsuffBudget;
}
public function isNewForLivrable(): ?bool
{
return $this->newForLivrable;
}
public function setNewForLivrable(?bool $newForLivrable): static
{
$this->newForLivrable = $newForLivrable;
return $this;
}
}