You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

328 lines
9.3KB

  1. <?php
  2. namespace domain\Producer\Producer;
  3. use common\helpers\GlobalParam;
  4. use domain\User\User\User;
  5. use domain\_\AbstractService;
  6. use domain\_\SolverInterface;
  7. use yii\helpers\Html;
  8. class ProducerSolver extends AbstractService implements SolverInterface
  9. {
  10. public function getFullAddressAsHtml(Producer $producer): string
  11. {
  12. $address = '<div class="name">'.$producer->name . '</div>';
  13. if (strlen($producer->address)) {
  14. $address .= $producer->address . '<br>';
  15. }
  16. if (strlen($producer->postcode) || strlen($producer->city)) {
  17. $address .= $producer->postcode . ' ' . $producer->city;
  18. }
  19. return $address;
  20. }
  21. public function getHtmlLogo(Producer $producer)
  22. {
  23. $html = '';
  24. if (strlen($producer->logo)) {
  25. $html = '<img src="' . $this->getUrlLogo($producer) . '" class="producer-logo" />';
  26. }
  27. return $html;
  28. }
  29. public function getUrlLogo(Producer $producer): string
  30. {
  31. return \Yii::$app->urlManagerProducer->getHostInfo() . '/' . \Yii::$app->urlManagerProducer->baseUrl . '/uploads/' . $producer->logo;
  32. }
  33. /**
  34. * @deprecated Déplacé dans MailerService
  35. */
  36. public function getProducerEmailPlatform(Producer $producer): string
  37. {
  38. return $producer->slug . '@souke.fr';
  39. }
  40. public function getMainContact(Producer $producer): ?User
  41. {
  42. if ($producer->contact) {
  43. foreach ($producer->contact as $contact) {
  44. if ($contact->is_main_contact) {
  45. return $contact;
  46. }
  47. }
  48. }
  49. return null;
  50. }
  51. public function getMainContactEmail(Producer $producer): ?string
  52. {
  53. $contact = $this->getMainContact($producer);
  54. if ($contact) {
  55. return $contact->email;
  56. }
  57. return null;
  58. }
  59. public function isUpToDateWithOpendistribVersion(Producer $producer): bool
  60. {
  61. return $producer->latest_version_opendistrib == GlobalParam::getSoukeVersion();
  62. }
  63. public function isBillingTypeClassic(Producer $producer): bool
  64. {
  65. return $producer->option_billing_type == Producer::BILLING_TYPE_CLASSIC;
  66. }
  67. public function isBillingTypeFreePrice(Producer $producer): bool
  68. {
  69. return $producer->option_billing_type == Producer::BILLING_TYPE_FREE_PRICE;
  70. }
  71. /**
  72. * Retourne le montant de l'abonnement à prix libre définit par
  73. * le producteur.
  74. */
  75. public function getFreePrice(Producer $producer, bool $format = true)
  76. {
  77. if (!is_null($producer->free_price)) {
  78. if ($format) {
  79. return number_format($producer->free_price, 2, ',', false) . ' €';
  80. } else {
  81. return $producer->free_price;
  82. }
  83. }
  84. }
  85. public function getSpecificDelays(Producer $producer): array
  86. {
  87. $array = [];
  88. $daysArray = [
  89. 'monday',
  90. 'tuesday',
  91. 'wednesday',
  92. 'thursday',
  93. 'friday',
  94. 'saturday',
  95. 'sunday'
  96. ];
  97. foreach ($daysArray as $day) {
  98. $fieldDelay = 'order_delay_' . $day;
  99. $fieldDeadline = 'order_deadline_' . $day;
  100. $delay = $producer->order_delay;
  101. $deadline = $producer->order_deadline;
  102. if ($producer->$fieldDelay) {
  103. $delay = $producer->$fieldDelay;
  104. }
  105. if ($producer->$fieldDeadline) {
  106. $deadline = $producer->$fieldDeadline;
  107. }
  108. $array[$day] = [
  109. 'order_delay' => $delay,
  110. 'order_deadline' => $deadline,
  111. ];
  112. }
  113. return $array;
  114. }
  115. public function hasSpecificDelays(Producer $producer): bool
  116. {
  117. $daysArray = [
  118. 'monday',
  119. 'tuesday',
  120. 'wednesday',
  121. 'thursday',
  122. 'friday',
  123. 'saturday',
  124. 'sunday'
  125. ];
  126. foreach ($daysArray as $day) {
  127. $fieldDelay = 'order_delay_' . $day;
  128. $fieldDeadline = 'order_deadline_' . $day;
  129. if ($producer->$fieldDelay || $producer->$fieldDeadline) {
  130. return true;
  131. }
  132. }
  133. return false;
  134. }
  135. public function getFilenamePrivateKeyApiStripe(Producer $producer): string
  136. {
  137. return '../../common/config/stripe/api-' . $producer->id . '.key';
  138. }
  139. public function getFilenamePrivateKeyEndpointStripe(Producer $producer): string
  140. {
  141. return '../../common/config/stripe/endpoint-' . $producer->id . '.key';
  142. }
  143. /**
  144. * Retourne la clé secrète d'API de Stripe.
  145. */
  146. public function getPrivateKeyStripe(string $filename): string
  147. {
  148. if (file_exists($filename)) {
  149. $handle = fopen($filename, "r");
  150. $filesize = filesize($filename);
  151. if ($handle && $filesize) {
  152. $secretKey = fread($handle, $filesize);
  153. fclose($handle);
  154. return $secretKey;
  155. }
  156. }
  157. return '';
  158. }
  159. public function getPrivateKeyApiStripe(Producer $producer): string
  160. {
  161. return $this->getPrivateKeyStripe($this->getFilenamePrivateKeyApiStripe($producer));
  162. }
  163. public function getPrivateKeyEndpointStripe(Producer $producer): string
  164. {
  165. return $this->getPrivateKeyStripe($this->getFilenamePrivateKeyEndpointStripe($producer));
  166. }
  167. public function isOnlinePaymentActive(Producer $producer, bool $checkModeTest = true): bool
  168. {
  169. $return = $producer->online_payment;
  170. if($checkModeTest) {
  171. $return = $return
  172. || ($producer->option_stripe_mode_test
  173. && !\Yii::$app->user->isGuest
  174. && \Yii::$app->user->identity->status > 10);
  175. }
  176. return (bool) $return;
  177. }
  178. public function isOnlinePaymentActiveAndTypeOrder(Producer $producer, bool $checkModeTest = true): bool
  179. {
  180. return $this->isOnlinePaymentActive($producer, $checkModeTest)
  181. && $producer->option_online_payment_type == 'order';
  182. }
  183. public function isBillingFrequencyMonthly(Producer $producer): bool
  184. {
  185. return $producer->option_billing_frequency == Producer::BILLING_FREQUENCY_MONTHLY;
  186. }
  187. public function isBillingFrequencyQuarterly(Producer $producer): bool
  188. {
  189. return $producer->option_billing_frequency == Producer::BILLING_FREQUENCY_QUARTERLY;
  190. }
  191. public function isBillingFrequencyBiannual(Producer $producer): bool
  192. {
  193. return $producer->option_billing_frequency == Producer::BILLING_FREQUENCY_BIANNUAL;
  194. }
  195. public function getPointSaleWording(Producer $producer)
  196. {
  197. if($producer->option_point_sale_wording && strlen($producer->option_point_sale_wording)) {
  198. return Html::encode($producer->option_point_sale_wording);
  199. }
  200. return 'Points de vente';
  201. }
  202. public function getConfig(string $config, Producer $producer = null): ?string
  203. {
  204. if(!$producer) {
  205. $producer = $this->getProducerContext();
  206. }
  207. return $producer->$config;
  208. }
  209. public function getLeavePeriodStartDateTime(Producer $producer): ?\DateTime
  210. {
  211. if(!$producer->option_leave_period_start) {
  212. return null;
  213. }
  214. return \DateTime::createFromFormat('Y-m-d', $producer->option_leave_period_start)->setTime(0,0);;
  215. }
  216. public function getLeavePeriodEndDateTime(Producer $producer): ?\DateTime
  217. {
  218. if(!$producer->option_leave_period_end) {
  219. return null;
  220. }
  221. return \DateTime::createFromFormat('Y-m-d', $producer->option_leave_period_end)->setTime(23,59);;
  222. }
  223. public function hasLeavePeriodDefined(Producer $producer): bool
  224. {
  225. return $producer->option_leave_period_start && $producer->option_leave_period_end;
  226. }
  227. public function isOnLeavePeriod(Producer $producer, \DateTime $date = null): bool
  228. {
  229. if(!$date) {
  230. $date = new \DateTime();
  231. }
  232. if(!$producer->option_leave_period_start || !$producer->option_leave_period_end) {
  233. return false;
  234. }
  235. $leavePeriodStart = $this->getLeavePeriodStartDateTime($producer);
  236. $leavePeriodEnd = $this->getLeavePeriodEndDateTime($producer);
  237. if($date >= $leavePeriodStart && $date <= $leavePeriodEnd) {
  238. return true;
  239. }
  240. return false;
  241. }
  242. public function getSponsorshipLink(Producer $producer): string
  243. {
  244. return \Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/signup', 'from' => $producer->getSponsorshipCode()]);
  245. }
  246. public function getDateEndFreeBillingPeriodSponsorship(Producer $producer): ?\DateTime
  247. {
  248. if($producer->getSponsoredBy()) {
  249. $dateStart = new \DateTime($producer->date_creation);
  250. return $dateStart
  251. ->modify('+4 months')
  252. ->modify('first day of this month');
  253. }
  254. return null;
  255. }
  256. public function isFreeBillingPeriodSponsorship(Producer $producer): bool
  257. {
  258. if($producer->getSponsoredBy()) {
  259. $dateNow = new \DateTime();
  260. $dateEndFreeBillingPeriodSponsorship = $this->getDateEndFreeBillingPeriodSponsorship($producer);
  261. if($dateNow < $dateEndFreeBillingPeriodSponsorship) {
  262. return true;
  263. }
  264. }
  265. return false;
  266. }
  267. }