Trial.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Service\Shop;
  4. use App\ApiResources\Shop\NewStructureArtistPremiumTrialRequest;
  5. use App\Entity\Organization\Organization;
  6. use App\Enum\Organization\SettingsProductEnum;
  7. use App\Service\Dolibarr\DolibarrApiService;
  8. use App\Service\Dolibarr\DolibarrUtils;
  9. use App\Service\Utils\DatesUtils;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. /**
  12. * Class Trial : Service contenant les manipulations associés aux périodes d'essai.
  13. */
  14. class Trial
  15. {
  16. public function __construct(
  17. private DatesUtils $datesUtils,
  18. private EntityManagerInterface $entityManager,
  19. private DolibarrApiService $dolibarrApiService,
  20. private DolibarrUtils $dolibarrUtils,
  21. ) {
  22. }
  23. /**
  24. * Retourne le décompte sur 30 jours du dernier lancement d'essai.
  25. *
  26. * @return int
  27. */
  28. public function getTrialCountdown(?\DateTimeInterface $trialStartDate)
  29. {
  30. if (empty($trialStartDate)) {
  31. return 0;
  32. }
  33. $daysSince = $this->datesUtils::daysSince($trialStartDate);
  34. if ($daysSince > 30) {
  35. return 0;
  36. }
  37. return 30 - $daysSince;
  38. }
  39. /**
  40. * Start an artist premium trial for an organization.
  41. *
  42. * @param Organization $organization The organization to start the trial for
  43. * @param NewStructureArtistPremiumTrialRequest $request The trial request data
  44. *
  45. * @throws \Doctrine\DBAL\Exception
  46. * @throws \JsonException
  47. */
  48. public function startArtistPremiumTrialForNewStructure(
  49. Organization $organization,
  50. NewStructureArtistPremiumTrialRequest $request
  51. ): void
  52. {
  53. // Update settings
  54. $settings = $organization->getSettings();
  55. $settings->setProductBeforeTrial($organization->getSettings()->getProduct());
  56. $settings->setTrialActive(true);
  57. $settings->setLastTrialStartDate(DatesUtils::new());
  58. $settings->setProduct(SettingsProductEnum::ARTIST_PREMIUM);
  59. $this->entityManager->persist($settings);
  60. $this->entityManager->flush();
  61. $dolibarrSocietyId = $this->dolibarrApiService->getSocietyId($organization->getId());
  62. // Create contract in dolibarr
  63. $dolibarrProductId = $this->dolibarrUtils->getProductId(
  64. SettingsProductEnum::ARTIST_PREMIUM, true
  65. );
  66. $contractId = $this->dolibarrApiService->createContract(
  67. $dolibarrSocietyId, $dolibarrProductId, true, 1
  68. );
  69. $this->dolibarrApiService->createContractLine($contractId, $dolibarrProductId, 1);
  70. // Maj le représentant commercial dans dolibarr
  71. $this->dolibarrUtils->updateSocietyCommercialsWithApi($dolibarrSocietyId);
  72. // Met à jour le produit dans Dolibarr
  73. $productName = $this->dolibarrUtils->getDolibarrProductName(SettingsProductEnum::ARTIST_PREMIUM, true);
  74. $this->dolibarrApiService->updateSocietyProduct($dolibarrSocietyId, $productName);
  75. // Ajoute une entrée aux actions commerciales dolibarr
  76. $message = sprintf(
  77. 'Action réalisé par : %s %s.<br>Fonction : %s<br>Mail:%s<br>Tel:%s',
  78. $request->getRepresentativeFirstName(),
  79. $request->getRepresentativeLastName(),
  80. $request->getRepresentativeFunction(),
  81. $request->getRepresentativeEmail(),
  82. $request->getRepresentativePhone()
  83. );
  84. $this->dolibarrUtils->addActionComm(
  85. $dolibarrSocietyId, 'Ouverture de la période d\'essai (nouvelle structure)', $message
  86. );
  87. }
  88. }