src/Entity/ChannelUserData/AdminChannelUserData.php line 57

Open in your IDE?
  1. <?php
  2. namespace App\Entity\ChannelUserData;
  3. use App\Entity\Channel\ChannelUserRole;
  4. use App\Entity\Channel\Company;
  5. use App\Entity\Channel\CompanyChannelUserData;
  6. use App\Entity\Channel\Organization;
  7. use App\Entity\Channel\Place;
  8. use App\Entity\Channel\Training;
  9. use App\Entity\ChannelUserData\Activity\ActivityFeed;
  10. use App\Entity\ChannelUserData\AdminChannelUserData\AdminChannelUserDataOrganization;
  11. use App\Entity\ChannelUserData\AdminChannelUserData\AdminChannelUserDataPlace;
  12. use App\Entity\ChannelUserData\AdminChannelUserData\AdminChannelUserDataPrice;
  13. use App\Entity\ChannelUserData\AdminChannelUserData\AdminChannelUserDataSkill;
  14. use App\Entity\ChannelUserData\AdminChannelUserData\Document\AdminChannelUserDataAgreement;
  15. use App\Entity\ChannelUserData\AdminChannelUserData\Document\AdminChannelUserDataCertificate;
  16. use App\Entity\ChannelUserData\AdminChannelUserData\Document\AdminChannelUserDataDocument;
  17. use App\Entity\ChannelUserData\Cursus\Internship;
  18. use App\Enum\ChannelUserData\Activity\AdminChannelUserDataActivityTagEnum;
  19. use App\Enum\ChannelUserData\AdminChannelUserDataActivityStatusEnum;
  20. use App\Enum\ChannelUserData\AdminChannelUserStatusEnum;
  21. use App\Repository\ChannelUserData\ChannelUserDataRepository;
  22. use DateTimeInterface;
  23. use Doctrine\Common\Collections\ArrayCollection;
  24. use Doctrine\Common\Collections\Collection;
  25. use Doctrine\ORM\Mapping as ORM;
  26. use Drosalys\Bundle\ApiBundle\Serializer\Attributes\IdGroups;
  27. use Nellapp\Bundle\SDKBundle\Channel\Entity\ChannelUserData\AdminChannelUserDataInterface;
  28. use Nellapp\Bundle\SDKBundle\Channel\Entity\ChannelUserData\AdminChannelUserDataMethodTrait;
  29. use Nellapp\Bundle\SDKBundle\Enum\ChannelUserData\AdminChannelUserTypeEnum;
  30. use Nellapp\Bundle\SDKBundle\TrackData\Attribute\TrackEntity;
  31. use Nellapp\Bundle\SDKBundle\TrackData\Attribute\TrackField;
  32. use Symfony\Component\Serializer\Annotation as Serial;
  33. use Symfony\Component\Validator\Constraints as Assert;
  34. #[
  35. ORM\Entity(repositoryClass: ChannelUserDataRepository::class),
  36. ORM\Table(name: 'channel_user_data_admin'),
  37. TrackEntity(
  38. fieldGroups: [
  39. 'informations' => [
  40. 'tags' => [AdminChannelUserDataActivityTagEnum::INFORMATIONS],
  41. ],
  42. 'skills' => [
  43. 'tags' => [AdminChannelUserDataActivityTagEnum::SKILLS],
  44. ],
  45. 'files' => [
  46. 'tags' => [AdminChannelUserDataActivityTagEnum::FILES]
  47. ],
  48. 'prices' => [
  49. 'tags' => [AdminChannelUserDataActivityTagEnum::PRICES],
  50. ]
  51. ]
  52. ),
  53. ]
  54. class AdminChannelUserData extends ChannelUserData implements AdminChannelUserDataInterface
  55. {
  56. use AdminChannelUserDataMethodTrait;
  57. #[ORM\Column(type: 'date', nullable: true)]
  58. #[Assert\GreaterThanOrEqual(
  59. propertyPath: 'startAt',
  60. groups: ['admin_channel_user_profile']
  61. )]
  62. #[Serial\Groups(['Sync'])]
  63. private ?DateTimeInterface $expireAt = null;
  64. #[ORM\Column(type: 'date', nullable: true)]
  65. #[Assert\LessThanOrEqual(
  66. propertyPath: 'expireAt',
  67. groups: ['admin_channel_user_profile'])
  68. ]
  69. #[Serial\Groups(['Sync'])]
  70. private ?DateTimeInterface $startAt = null;
  71. #[ORM\ManyToOne(targetEntity: ChannelUserRole::class)]
  72. #[ORM\JoinColumn(nullable: true, onDelete: 'SET NULL')]
  73. #[IdGroups(['Sync'])]
  74. private ?ChannelUserRole $channelUserRole = null;
  75. #[ORM\Column(type: 'string', nullable: true)]
  76. #[Assert\Choice(
  77. callback: [AdminChannelUserTypeEnum::class, 'getChoices'],
  78. message: 'adminChannelUser.role.Choice.message',
  79. )]
  80. #[Serial\Groups(['Sync'])]
  81. private ?string $adminChannelUserType = null;
  82. #[ORM\Column(type: 'simple_array', nullable: true)]
  83. #[Serial\Groups(['Sync'])]
  84. private ?array $displayedMenu = null;
  85. #[ORM\OneToMany(mappedBy: 'adminChannelUserData', targetEntity: CompanyChannelUserData::class, cascade: ['persist', 'remove'], fetch: 'LAZY', orphanRemoval: true)]
  86. private Collection $companyChannelUserDatas;
  87. #[ORM\OneToMany(mappedBy: 'tutor', targetEntity: Internship::class, fetch: 'LAZY')]
  88. private Collection $internships;
  89. #[ORM\OneToMany(mappedBy: 'channelUserData', targetEntity: AdminChannelUserDataOrganization::class, cascade: ['persist', 'remove'], fetch: 'LAZY', orphanRemoval: true)]
  90. private Collection $adminChannelUserDataOrganizations;
  91. #[ORM\OneToMany(mappedBy: 'channelUserData', targetEntity: AdminChannelUserDataPlace::class, cascade: ['persist', 'remove'], fetch: 'LAZY', orphanRemoval: true)]
  92. private Collection $adminChannelUserDataPlaces;
  93. #[ORM\Column(type: 'string', nullable: true)]
  94. #[TrackField(name: 'page.admin_channel_user_data.entity.status.label', fieldKey: 'informations', callable: 'getStatusKey', callableClass: AdminChannelUserStatusEnum::class)]
  95. private ?string $status = null;
  96. #[ORM\Column(type: 'string', nullable: true)]
  97. #[TrackField(name: 'page.admin_channel_user_data.entity.activity_status.label', fieldKey: 'informations', callable: 'getStatusKey', callableClass: AdminChannelUserDataActivityStatusEnum::class)]
  98. private ?string $activityStatus = null;
  99. #[ORM\OneToOne(targetEntity: ActivityFeed::class, cascade: ['remove', 'persist'], orphanRemoval: true)]
  100. #[ORM\JoinColumn(nullable: false)]
  101. private ?ActivityFeed $activityFeed = null;
  102. #[ORM\OneToMany(mappedBy: 'channelUserData', targetEntity: AdminChannelUserDataPrice::class, cascade: ['persist', 'remove'], fetch: 'LAZY', orphanRemoval: true)]
  103. #[ORM\OrderBy(['sortOrder' => 'ASC'])]
  104. private Collection $adminChannelUserDataPrices;
  105. #[ORM\OneToMany(mappedBy: 'channelUserData', targetEntity: AdminChannelUserDataSkill::class, cascade: ['persist', 'remove'], fetch: 'LAZY', orphanRemoval: true)]
  106. private Collection $adminChannelUserDataSkills;
  107. #[ORM\OneToMany(mappedBy: 'channelUserData', targetEntity: AdminChannelUserDataDocument::class, cascade: ['persist', 'remove'], fetch: 'LAZY', orphanRemoval: true)]
  108. private Collection $documents;
  109. public function __construct()
  110. {
  111. parent::__construct();
  112. $this->companyChannelUserDatas = new ArrayCollection();
  113. $this->internships = new ArrayCollection();
  114. $this->adminChannelUserDataOrganizations = new ArrayCollection();
  115. $this->adminChannelUserDataPlaces = new ArrayCollection();
  116. }
  117. public function getMainPrice(): ?AdminChannelUserDataPrice
  118. {
  119. $price = $this->getAdminChannelUserDataPrices()->first();
  120. return $price !== false ? $price : null;
  121. }
  122. public function removeDisplayedMenuLinks(array $links): static
  123. {
  124. $this->displayedMenu = array_diff($this->displayedMenu, $links);
  125. return $this;
  126. }
  127. public function addDisplayedMenuLinks(array $links): static
  128. {
  129. $this->displayedMenu = array_unique(array_merge($this->displayedMenu, $links));
  130. return $this;
  131. }
  132. public function getCompanyChannelUserDataFor(?Company $company): ?CompanyChannelUserData
  133. {
  134. foreach ($this->getCompanyChannelUserDatas() as $companyChannelUserData) {
  135. if ($companyChannelUserData->getCompany() === $company) {
  136. return $companyChannelUserData;
  137. }
  138. }
  139. return null;
  140. }
  141. /**
  142. * @return Collection<int, CompanyChannelUserData>
  143. */
  144. public function getCompanyChannelUserDatas(): Collection
  145. {
  146. return $this->companyChannelUserDatas;
  147. }
  148. public function addCompany(Company $company, ?string $job = null): self
  149. {
  150. if (!$companyChannelUserData = $this->getCompanyChannelUserDataFor($company)) {
  151. $company->addChannelUserData($this, $job);
  152. }
  153. return $this;
  154. }
  155. public function removeCompany(Company $company): self
  156. {
  157. if (!$companyChannelUserData = $this->getCompanyChannelUserDataFor($company)) {
  158. return $this;
  159. }
  160. $company->removeChannelUserData($this);
  161. return $this;
  162. }
  163. public function getInternships(): Collection
  164. {
  165. return $this->internships;
  166. }
  167. public function getInternshipsCursuses(): Collection
  168. {
  169. return new ArrayCollection(array_unique($this->internships->map(function (Internship $internship) {
  170. return $internship->getCursus();
  171. })->toArray()));
  172. }
  173. public function getActiveInternships(Company $company): Collection
  174. {
  175. return $this->getInternships()->filter(function (Internship $internship) use ($company) {
  176. return $internship->isActive() && (!$company || $internship->getCompany() === $company);
  177. });
  178. }
  179. public function addInternship(Internship $internship): self
  180. {
  181. if (!$this->internships->contains($internship)) {
  182. $internship->setTutor($this);
  183. $this->internships->add($internship);
  184. }
  185. return $this;
  186. }
  187. public function removeInternship(Internship $internship): self
  188. {
  189. if ($this->internships->contains($internship)) {
  190. $internship->setTutor(null);
  191. $this->internships->removeElement($internship);
  192. }
  193. return $this;
  194. }
  195. public function getAdminChannelUserDataOrganizations(): Collection
  196. {
  197. return $this->adminChannelUserDataOrganizations;
  198. }
  199. public function addAdminChannelUserDataOrganization(AdminChannelUserDataOrganization $link): static
  200. {
  201. if (!$this->adminChannelUserDataOrganizations->contains($link)) {
  202. $this->adminChannelUserDataOrganizations->add($link);
  203. $link->setChannelUserData($this);
  204. }
  205. return $this;
  206. }
  207. public function removeAdminChannelUserDataOrganization(AdminChannelUserDataOrganization $link): static
  208. {
  209. $this->adminChannelUserDataOrganizations->removeElement($link);
  210. return $this;
  211. }
  212. public function setAdminChannelUserDataOrganizations(Collection $links): static
  213. {
  214. foreach ($this->adminChannelUserDataOrganizations as $link) {
  215. if (!$links->contains($link) && $link->getChannelUserData() === $this) {
  216. $link->setChannelUserData(null);
  217. }
  218. }
  219. $this->adminChannelUserDataOrganizations = $links;
  220. foreach ($this->adminChannelUserDataOrganizations as $link) {
  221. if ($link->getChannelUserData() !== $this) {
  222. $link->setChannelUserData($this);
  223. }
  224. }
  225. return $this;
  226. }
  227. public function getOrganizations(): array
  228. {
  229. return $this->adminChannelUserDataOrganizations
  230. ->map(fn(AdminChannelUserDataOrganization $link) => $link->getOrganization())
  231. ->filter(fn(?Organization $organization) => null !== $organization)
  232. ->toArray();
  233. }
  234. public function addOrganization(Organization $organization): static
  235. {
  236. foreach ($this->adminChannelUserDataOrganizations as $link) {
  237. if ($link->getOrganization() === $organization) {
  238. return $this;
  239. }
  240. }
  241. $link = new AdminChannelUserDataOrganization();
  242. $link->setChannelUserData($this);
  243. $link->setOrganization($organization);
  244. $this->adminChannelUserDataOrganizations->add($link);
  245. return $this;
  246. }
  247. public function removeOrganization(Organization $organization): static
  248. {
  249. foreach ($this->adminChannelUserDataOrganizations as $link) {
  250. if ($link->getOrganization() === $organization) {
  251. $this->removeAdminChannelUserDataOrganization($link);
  252. break;
  253. }
  254. }
  255. return $this;
  256. }
  257. public function setOrganizations(Collection $organizations): static
  258. {
  259. foreach ($this->adminChannelUserDataOrganizations as $link) {
  260. if (null !== $link->getOrganization() && !$organizations->contains($link->getOrganization())) {
  261. $this->removeAdminChannelUserDataOrganization($link);
  262. }
  263. }
  264. foreach ($organizations as $organization) {
  265. $this->addOrganization($organization);
  266. }
  267. return $this;
  268. }
  269. public function getAdminChannelUserDataPlaces(): Collection
  270. {
  271. return $this->adminChannelUserDataPlaces;
  272. }
  273. public function addAdminChannelUserDataPlace(AdminChannelUserDataPlace $link): static
  274. {
  275. if (!$this->adminChannelUserDataPlaces->contains($link)) {
  276. $this->adminChannelUserDataPlaces->add($link);
  277. $link->setChannelUserData($this);
  278. }
  279. return $this;
  280. }
  281. public function removeAdminChannelUserDataPlace(AdminChannelUserDataPlace $link): static
  282. {
  283. $this->adminChannelUserDataPlaces->removeElement($link);
  284. return $this;
  285. }
  286. public function setAdminChannelUserDataPlaces(Collection $links): static
  287. {
  288. foreach ($this->adminChannelUserDataPlaces as $link) {
  289. if (!$links->contains($link) && $link->getChannelUserData() === $this) {
  290. $link->setChannelUserData(null);
  291. }
  292. }
  293. $this->adminChannelUserDataPlaces = $links;
  294. foreach ($this->adminChannelUserDataPlaces as $link) {
  295. if ($link->getChannelUserData() !== $this) {
  296. $link->setChannelUserData($this);
  297. }
  298. }
  299. return $this;
  300. }
  301. public function getPlaces(): array
  302. {
  303. return $this->adminChannelUserDataPlaces
  304. ->map(fn(AdminChannelUserDataPlace $link) => $link->getPlace())
  305. ->filter(fn(?Place $place) => null !== $place)
  306. ->toArray();
  307. }
  308. public function addPlace(Place $place): static
  309. {
  310. foreach ($this->adminChannelUserDataPlaces as $link) {
  311. if ($link->getPlace() === $place) {
  312. return $this;
  313. }
  314. }
  315. $link = new AdminChannelUserDataPlace();
  316. $link->setChannelUserData($this);
  317. $link->setPlace($place);
  318. $this->adminChannelUserDataPlaces->add($link);
  319. return $this;
  320. }
  321. public function removePlace(Place $place): static
  322. {
  323. foreach ($this->adminChannelUserDataPlaces as $link) {
  324. if ($link->getPlace() === $place) {
  325. $this->removeAdminChannelUserDataPlace($link);
  326. break;
  327. }
  328. }
  329. return $this;
  330. }
  331. public function setPlaces(Collection $places): static
  332. {
  333. foreach ($this->adminChannelUserDataPlaces as $link) {
  334. if (null !== $link->getPlace() && !$places->contains($link->getPlace())) {
  335. $this->removeAdminChannelUserDataPlace($link);
  336. }
  337. }
  338. foreach ($places as $place) {
  339. $this->addPlace($place);
  340. }
  341. return $this;
  342. }
  343. public function getStatus(): ?string
  344. {
  345. return $this->status;
  346. }
  347. public function setStatus(?string $status): AdminChannelUserData
  348. {
  349. $this->status = $status;
  350. return $this;
  351. }
  352. public function getActivityFeed(): ?ActivityFeed
  353. {
  354. return $this->activityFeed;
  355. }
  356. public function setActivityFeed(?ActivityFeed $activityFeed): static
  357. {
  358. $this->activityFeed = $activityFeed;
  359. return $this;
  360. }
  361. public function getAdminChannelUserDataPrices(): Collection
  362. {
  363. return $this->adminChannelUserDataPrices;
  364. }
  365. public function addAdminChannelUserDataPrice(AdminChannelUserDataPrice $price): static
  366. {
  367. if (!$this->adminChannelUserDataPrices->contains($price)) {
  368. $this->adminChannelUserDataPrices->add($price);
  369. }
  370. return $this;
  371. }
  372. public function removeAdminChannelUserDataPrice(AdminChannelUserDataPrice $price): static
  373. {
  374. if ($this->adminChannelUserDataPrices->contains($price)) {
  375. $this->adminChannelUserDataPrices->removeElement($price);
  376. }
  377. return $this;
  378. }
  379. public function setAdminChannelUserDataPrices(Collection $adminChannelUserDataPrices): AdminChannelUserData
  380. {
  381. $this->adminChannelUserDataPrices = $adminChannelUserDataPrices;
  382. return $this;
  383. }
  384. public function getAdminChannelUserDataSkills(): Collection
  385. {
  386. return $this->adminChannelUserDataSkills;
  387. }
  388. public function addAdminChannelUserDataSkill(AdminChannelUserDataSkill $skill): static
  389. {
  390. if (!$this->adminChannelUserDataSkills->contains($skill)) {
  391. $this->adminChannelUserDataSkills->add($skill);
  392. }
  393. return $this;
  394. }
  395. public function removeAdminChannelUserDataSkill(AdminChannelUserDataSkill $skill): static
  396. {
  397. if ($this->adminChannelUserDataSkills->contains($skill)) {
  398. $this->adminChannelUserDataSkills->removeElement($skill);
  399. }
  400. return $this;
  401. }
  402. public function setAdminChannelUserDataSkills(Collection $adminChannelUserDataSkills): AdminChannelUserData
  403. {
  404. $this->adminChannelUserDataSkills = $adminChannelUserDataSkills;
  405. return $this;
  406. }
  407. public function getTrainings(): array
  408. {
  409. return $this->adminChannelUserDataSkills
  410. ->map(fn(AdminChannelUserDataSkill $skill) => $skill->getTraining())
  411. ->toArray();
  412. }
  413. public function addTraining(Training $training): static
  414. {
  415. foreach ($this->adminChannelUserDataSkills as $skill) {
  416. if ($skill->getTraining() === $training) {
  417. return $this;
  418. }
  419. }
  420. $link = (new AdminChannelUserDataSkill())
  421. ->setTraining($training)
  422. ->setChannelUserData($this);
  423. $this->adminChannelUserDataSkills->add($link);
  424. return $this;
  425. }
  426. public function removeTraining(Training $training): static
  427. {
  428. foreach ($this->adminChannelUserDataSkills as $skill) {
  429. if ($skill->getTraining() === $training) {
  430. $this->removeAdminChannelUserDataSkill($skill);
  431. break;
  432. }
  433. }
  434. return $this;
  435. }
  436. public function setTrainings(Collection $trainings): static
  437. {
  438. foreach ($this->adminChannelUserDataSkills as $skill) {
  439. $this->removeAdminChannelUserDataSkill($skill);
  440. }
  441. foreach ($trainings as $training) {
  442. $this->addTraining($training);
  443. }
  444. return $this;
  445. }
  446. public function getDocuments(): Collection
  447. {
  448. return $this->documents;
  449. }
  450. public function setDocuments(Collection $documents): AdminChannelUserData
  451. {
  452. $this->documents = $documents;
  453. return $this;
  454. }
  455. public function getActivityStatus(): ?string
  456. {
  457. return $this->activityStatus;
  458. }
  459. public function setActivityStatus(?string $activityStatus): AdminChannelUserData
  460. {
  461. $this->activityStatus = $activityStatus;
  462. return $this;
  463. }
  464. public function getCertificates(): Collection
  465. {
  466. return $this->documents->filter(
  467. fn(AdminChannelUserDataDocument $document) => $document instanceof AdminChannelUserDataCertificate
  468. );
  469. }
  470. public function getAgreement(): ?AdminChannelUserDataAgreement
  471. {
  472. foreach ($this->documents as $document) {
  473. if ($document instanceof AdminChannelUserDataAgreement) {
  474. return $document;
  475. }
  476. }
  477. return null;
  478. }
  479. }