Utils.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Service\Organization;
  4. use App\Entity\Organization\Organization;
  5. use App\Enum\Organization\OrganizationIdsEnum;
  6. use App\Enum\Organization\SettingsProductEnum;
  7. use App\Service\Utils\UrlBuilder;
  8. use App\Test\Service\Organization\UtilsTest;
  9. use Doctrine\Common\Collections\Criteria;
  10. /**
  11. * Class OrganizationUtils : service rassemblant des fonctions d'aides pour les questions se rapportant à l'organisation
  12. * @package App\Service\Resource
  13. */
  14. class Utils
  15. {
  16. const START_DATE_KEY = 'dateStart';
  17. const END_DATE_KEY = 'dateEnd';
  18. /**
  19. * Test si l'organisation est considérée comme une structure == n'a pas un produit manager
  20. * @param Organization $organization
  21. * @return bool
  22. * @see UtilsTest::testIsStructureTest()
  23. */
  24. public function isStructure(Organization $organization): bool{
  25. return $organization->getSettings()->getProduct() != SettingsProductEnum::MANAGER()
  26. && $organization->getSettings()->getProduct() != SettingsProductEnum::MANAGER_PREMIUM();
  27. }
  28. /**
  29. * Test si l'organisation est considérée comme un manager == a un produit manager standard
  30. * @param Organization $organization
  31. * @return bool
  32. * @see UtilsTest::testIsManagerTest()
  33. */
  34. public function isManager(Organization $organization): bool{
  35. return $organization->getSettings()->getProduct() == SettingsProductEnum::MANAGER();
  36. }
  37. /**
  38. * Test si l'organisation est la structure 2iOpenservice
  39. * @param Organization $organization
  40. * @return bool
  41. * @see UtilsTest::testIsOrganizationIs2ios()
  42. */
  43. public function isOrganizationIs2ios(Organization $organization): bool{
  44. return $this->isOrganizationIdIs($organization, OrganizationIdsEnum::_2IOS());
  45. }
  46. /**
  47. * Test si l'organisation est la structure CMF
  48. * @param Organization $organization
  49. * @return bool
  50. * @see UtilsTest::testIsOrganizationIsCMF()
  51. */
  52. public function isOrganizationIsCMF(Organization $organization): bool{
  53. return $this->isOrganizationIdIs($organization, OrganizationIdsEnum::CMF());
  54. }
  55. /**
  56. * Test si l'id de l'organisation est celui passé en paramètre (doit faire partit des OrganizationIdsEnum)
  57. * @param Organization $organization
  58. * @param OrganizationIdsEnum $organizationIdsEnum
  59. * @return bool
  60. */
  61. private function isOrganizationIdIs(Organization $organization, OrganizationIdsEnum $organizationIdsEnum){
  62. return $organization->getId() === $organizationIdsEnum->getValue();
  63. }
  64. /**
  65. * Retourne dans quelles année d'activité on se situe aujourd'hui
  66. * @param Organization $organization
  67. * @return int
  68. * @throws \Exception
  69. * @see UtilsTest::testGetOrganizationCurrentActivityYear()
  70. */
  71. public static function getOrganizationCurrentActivityYear(Organization $organization): int{
  72. $today = new \DateTime();
  73. $year = intval($today->format('Y'));
  74. $musicalDate = $organization->getParameters()->getMusicalDate();
  75. if(empty($musicalDate)) $musicalDate = new \DateTime($year.'-08-31');
  76. $base_date = new \DateTime($musicalDate->format($year.'-m-d'));
  77. $dateStart = new \DateTime($year . '-01-01');
  78. if($today >= $dateStart && $today < $base_date)
  79. return $year - 1;
  80. else return $year;
  81. }
  82. /**
  83. * Fonction permettant de récupérer les dates de début et de fin d'activité d'une structure selon une année
  84. * @param Organization $organization
  85. * @param int $year
  86. * @return \DateTime[]
  87. * @throws \Exception
  88. * @see UtilsTest::testGetActivityPeriodsSwitchYear()
  89. */
  90. public static function getActivityPeriodsSwitchYear(Organization $organization, int $year): array
  91. {
  92. $musicalDate = $organization->getParameters()->getMusicalDate();
  93. if (empty($musicalDate)) {
  94. $dateStart = new \DateTime($year . "-09-01");
  95. $dateEnd = new \DateTime(($year + 1) . "-08-31");
  96. } else {
  97. $dateStart = new \DateTime($year . "-" . $musicalDate->format('m') . "-" . $musicalDate->format('d'));
  98. $dateEnd = clone($dateStart);
  99. $dateEnd->add(new \DateInterval('P1Y'))->sub(new \DateInterval('P1D'));
  100. }
  101. return [
  102. self::START_DATE_KEY => $dateStart->format('Y-m-d'),
  103. self::END_DATE_KEY => $dateEnd->format('Y-m-d')
  104. ];
  105. }
  106. /**
  107. * Permet de retrouver quelle sera la date d'activité correspondant à une date précise de l'année
  108. * @param Organization $organization
  109. * @param \DateTimeInterface $date
  110. * @return int
  111. * @throws \Exception
  112. * @see UtilsTest::testgetActivityYearSwitchDate()
  113. */
  114. public static function getActivityYearSwitchDate(Organization $organization, \DateTimeInterface $date): int
  115. {
  116. $year = $date->format('Y');
  117. $musicalDate = $organization->getParameters()->getMusicalDate();
  118. if (empty($musicalDate)) {
  119. $startDate = new \DateTime($year.'-08-31');
  120. }else{
  121. $startDate = new \DateTime($musicalDate->format($year.'-m-d'));
  122. }
  123. $pivotDate = new \DateTime($year . '-01-01');
  124. if($date >= $pivotDate && $date < $startDate)
  125. return (int) ($year - 1);
  126. else return (int) $year;
  127. }
  128. /**
  129. * Return the active subdomain of an organization as a string, or null
  130. *
  131. * @param Organization $organization
  132. * @return string | null
  133. */
  134. public static function getOrganizationActiveSubdomain(Organization $organization): ?string {
  135. foreach ($organization->getSubdomains() as $subdomain) {
  136. if ($subdomain->isActive()) {
  137. return $subdomain->getSubdomain();
  138. }
  139. }
  140. return null;
  141. }
  142. /**
  143. * Get the URL of the current website of the organization
  144. *
  145. * @see https://ressources.opentalent.fr/display/SPEC/Preferences#Preferences-Siteinternet
  146. *
  147. * @param Organization $organization
  148. * @return string | null
  149. */
  150. public static function getOrganizationWebsite(Organization $organization): ?string {
  151. $parameters = $organization->getParameters();
  152. if ($parameters->getDesactivateOpentalentSiteWeb()) {
  153. if ($parameters->getOtherWebsite()) {
  154. return UrlBuilder::prependHttps($parameters->getOtherWebsite());
  155. }
  156. return null;
  157. }
  158. if (!empty($parameters->getCustomDomain())) {
  159. return UrlBuilder::prependHttps($parameters->getCustomDomain());
  160. }
  161. $subdomain = self::getOrganizationActiveSubdomain($organization);
  162. if (!$subdomain) {
  163. return null;
  164. }
  165. return 'https://' . $subdomain . '.opentalent.fr';
  166. }
  167. /**
  168. * Update the admin username to match the pattern 'admin{subdomain}'
  169. *
  170. * @param Organization $organization
  171. */
  172. public static function updateAdminUsername(Organization $organization): void {
  173. $subdomain = self::getOrganizationActiveSubdomain($organization);
  174. if (!$subdomain) {
  175. throw new \RuntimeException('Organization has no active subdomain : ' . $organization->getId());
  176. }
  177. $criteria = Criteria::create()
  178. ->andWhere(Criteria::expr()->eq('adminAccess', 1));
  179. $admin = $organization->getAccesses()->matching($criteria)->first();
  180. if (!$admin) {
  181. throw new \RuntimeException('no admin found for organization ' . $organization->getId());
  182. }
  183. $admin->getPerson()->setUsername('admin' . $subdomain);
  184. }
  185. }