1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
mail.php
См. документацию.
1<?php
2
4
9
10class Mail extends Service
11{
12 public const MEETING_STATUS_CREATED = 'created';
13 public const MEETING_STATUS_CANCELLED = 'cancelled';
14 public const STATUS_INVITE_LINK = 'invite_link';
15
25 public function notifyAboutMeetingStatus(string $to): bool
26 {
27 if ($this->doSendMeetingCancelled())
28 {
31
32 return $this->notifyAboutMeetingCancelled($to);
33 }
34
35 return false;
36 }
37
38 protected function doSendMeetingCancelled(): bool
39 {
40 $ownerStatus = $this->getOwner()['STATUS'];
41
42 return $ownerStatus === 'N';
43 }
44
45 public function notifyAboutMeetingCreated(string $to): bool
46 {
48
49 $subject = Loc::getMessage('EC_CALENDAR_SHARING_MAIL_SUBJECT_CREATED');
50 $ownerName = $this->getOwner()['NAME'];
51 $mailParams = $this->getBaseMailParams($ownerName);
52 $arParams = [
53 'STATUS' => self::MEETING_STATUS_CREATED,
54 'CANCEL_LINK' => $this->eventLink->getUrl() . Sharing\Helper::ACTION_CANCEL,
55 'ICS_LINK' => $this->eventLink->getUrl() . Sharing\Helper::ACTION_ICS,
56 'VIDEOCONFERENCE_LINK' => $this->eventLink->getUrl() . Sharing\Helper::ACTION_CONFERENCE,
57 ];
58 $arParams = array_merge($arParams, $mailParams);
59
60 $files = null;
61 if ($icsFileId = $this->getIcsFileId($ownerName, $arParams['EVENT_NAME']))
62 {
63 $files = [$icsFileId];
64 }
65
66 return $this->sendMessage($to, $arParams, $subject, $files);
67 }
68
69 public function notifyAboutMeetingCancelled(string $to): bool
70 {
71 if ($this->initiatorId === $this->eventLink->getHostId())
72 {
73 return false;
74 }
75
77
78 $ownerInfo = $this->getOwner();
79 $ownerName = (string)($ownerInfo['NAME'] ?? '');
80
81 $initiatorInfo = $this->getInitiator();
82 $initiatorName = (string)($initiatorInfo['NAME'] ?? '');
83
84 $baseMailParams = $this->getBaseMailParams($ownerName);
85 $mailParams = [
86 'STATUS' => self::MEETING_STATUS_CANCELLED,
87 'CALENDAR_LINK' => $this->getCalendarLink(),
88 'WHO_CANCELLED' => $initiatorName,
89 'WHEN_CANCELLED' => $this->getWhenCancelled(),
90 ];
91 $mailParams = array_merge($mailParams, $baseMailParams);
92
93 $subject = $this->getCancelMeetingSubject($initiatorInfo);
94
95 return $this->sendMessage($to, $mailParams, $subject);
96 }
97
98 protected function getCancelMeetingSubject(array $initiatorInfo): string
99 {
100 $initiatorName = (string)($initiatorInfo['NAME'] ?? '');
101 $initiatorGender = (string)($initiatorInfo['GENDER'] ?? '');
102
103 if ($initiatorGender === 'F')
104 {
105 return Loc::getMessage('EC_CALENDAR_SHARING_MAIL_SUBJECT_CANCELLED_F', ['#NAME#' => $initiatorName]);
106 }
107
108 return Loc::getMessage('EC_CALENDAR_SHARING_MAIL_SUBJECT_CANCELLED_M', ['#NAME#' => $initiatorName]);
109 }
110
111 public function sendInviteLink(string $to): bool
112 {
113 if ($this->crmDealLink === null)
114 {
115 return false;
116 }
117
119
120 $subject = $this->getInviteLinkSubject();
121 $arParams = $this->getInviteLinkParams($this->crmDealLink);
122
123 return $this->sendMessage($to, $arParams, $subject);
124 }
125
126 public function getInviteLinkSubject(): string
127 {
128 return Loc::getMessage('EC_CALENDAR_SHARING_MAIL_SUBJECT_INVITE_LINK');
129 }
130
132 {
133 $ownerId = $crmDealLink->getOwnerId();
134 $owner = Sharing\Helper::getOwnerInfo($ownerId);
135
136 return [
137 'STATUS' => self::STATUS_INVITE_LINK,
138 'OWNER_AVATAR' => $owner['photo'] ?? '',
139 'OWNER_NAME' => "{$owner['name']} {$owner['lastName']}",
140 'AVATARS' => $this->getAvatars($crmDealLink),
141 'CALENDAR_LINK' => $crmDealLink->getUrl() . Sharing\Helper::ACTION_OPENED,
142 'ABUSE_LINK' => Sharing\Helper::getEmailAbuseLink($ownerId, $crmDealLink->getUrl()),
143 'BITRIX24_LINK' => $this->getBitrix24Link(),
144 ];
145 }
146
147 public function notifyAboutSharingEventEdit(string $to): bool
148 {
149 //TODO waiting for mail template
151 $ownerName = $this->getOwner()['NAME'];
152
153 $gender = $this->getOwner()['GENDER'];
154 //TODO add REAL phrases
155 $subject = Loc::getMessage('EC_CALENDAR_SHARING_MAIL_SUBJECT_CANCELLED', ['#NAME#' => $ownerName]);
156 if ($gender === 'M')
157 {
158 $subject = Loc::getMessage('EC_CALENDAR_SHARING_MAIL_SUBJECT_CANCELLED_M', ['#NAME#' => $ownerName]);
159 }
160 else if ($gender === 'F')
161 {
162 $subject = Loc::getMessage('EC_CALENDAR_SHARING_MAIL_SUBJECT_CANCELLED_F', ['#NAME#' => $ownerName]);
163 }
164 $mailParams = $this->getBaseMailParams($ownerName);
165 $arParams = [
166 'STATUS' => self::MEETING_STATUS_CANCELLED,
167 'CALENDAR_LINK' => $this->getCalendarLink(),
168 'WHO_EDITED' => $ownerName,
169// 'WHEN_EDITED' => $this->getWhenCancelled(),
170 ];
171 $arParams = array_merge($arParams, $mailParams);
172
173 //TODO uncomment
174 return true;
175// return $this->sendMessage($to, $arParams, $subject);
176 }
177
178 protected function sendMessage(string $to, array $arParams, string $subject, ?array $files = null): bool
179 {
180 $fields = [
181 'EMAIL_TO' => $to,
182 'SUBJECT' => $subject,
183 ];
184
185 if (\CCalendar::IsBitrix24())
186 {
187 $fields['DEFAULT_EMAIL_FROM'] = Loc::getMessage('EC_CALENDAR_SHARING_MAIL_BITRIX24_FROM');
188 }
189
190 return \CEvent::SendImmediate(
191 'CALENDAR_SHARING',
192 SITE_ID,
193 array_merge($fields, $arParams),
194 'Y',
195 '',
196 $files,
197 ) === 'Y';
198 }
199
200 protected function getBaseMailParams(string $ownerName): array
201 {
202 $arParams = [
204 'IS_FULL_DAY' => $this->event->isFullDayEvent(),
205 'DATE_FROM' => $this->event->getStart()->format(),
206 'DATE_TO' => $this->event->getEnd()->format(),
207 'TZ_FROM' => $this->event->getStartTimeZone()?->getTimeZone()->getName(),
208 'TZ_TO' => $this->event->getEndTimeZone()?->getTimeZone()->getName(),
209 'ABUSE_LINK' => $this->getAbuseLink(),
210 'BITRIX24_LINK' => $this->getBitrix24Link(),
211 'AVATARS' => $this->getAvatars($this->getParentLink()),
212 ];
213
214 return $arParams;
215 }
216
217 protected function getAvatars(?Sharing\Link\Joint\JointLink $parentLink): array
218 {
219 $avatars = [];
220
221 if (!is_null($parentLink))
222 {
223 foreach ($parentLink->getMembers() as $member)
224 {
225 $avatars[] = empty($member->getAvatar()) ? '/bitrix/images/1.gif' : $member->getAvatar();
226 }
227 }
228
229 return $avatars;
230 }
231
232 protected function getParentLink(): ?Sharing\Link\Joint\JointLink
233 {
234 $link = Sharing\Link\Factory::getInstance()->getLinkByHash($this->eventLink->getParentLinkHash());
235 if ($link instanceof Sharing\Link\Joint\JointLink)
236 {
237 return $link;
238 }
239
240 return null;
241 }
242
243 protected function getWhenCancelled(): string
244 {
245 $timestamp = $this->eventLink->getCanceledTimestamp();
246
247 $culture = Main\Application::getInstance()->getContext()->getCulture();
248 $dayMonthFormat = Main\Type\Date::convertFormatToPhp($culture->get('DAY_MONTH_FORMAT'));
249 $timeFormat = $culture->get('SHORT_TIME_FORMAT');
250 $formatLong = "$dayMonthFormat $timeFormat";
251
252 return FormatDate($formatLong, $timestamp);
253 }
254
259 protected function getIcsFileId(string $organizerName, string $eventName): ?int
260 {
261 try
262 {
263 $icsManager = IcsManager::getInstance();
264 $fileId = $icsManager->createIcsFile($this->event->setName($eventName), [
265 'eventUrl' => Sharing\Helper::getShortUrl($this->eventLink->getUrl()),
266 'conferenceUrl' => Sharing\Helper::getShortUrl($this->eventLink->getUrl() . Sharing\Helper::ACTION_CONFERENCE),
267 'organizer' => [
268 'name' => $organizerName,
269 'email' => $this->getOrganizerEmail(),
270 ],
271 'attendees' => $this->getAttendees(),
272 ]);
273 }
274 catch (\Exception)
275 {
276 return null;
277 }
278
279 return $fileId;
280 }
281
282 protected function getOrganizerEmail(): string
283 {
284 $region = Main\Application::getInstance()->getLicense()->getRegion();
285 if ($region === 'ru')
286 {
287 return 'no-reply@bitrix24.ru';
288 }
289
290 return 'no-reply@bitrix24.com';
291 }
292
293 protected function getAttendees(): ?array
294 {
295 $sharingAttendee = $this->getSharingUserAttendee();
296
297 if (!empty($sharingAttendee))
298 {
299 return [$sharingAttendee];
300 }
301
302 return null;
303 }
304
305 protected function getSharingUserAttendee(): ?array
306 {
307 $attendeesCollection = $this->event->getAttendeesCollection();
308 $attendeesCodes = $attendeesCollection?->getAttendeesCodes();
309
310 $result = [];
311
312 if (!empty($attendeesCodes))
313 {
314 $userIds = \CCalendar::GetDestinationUsers($attendeesCodes);
315 if (empty($userIds))
316 {
317 return $result;
318 }
319
320 $usersResult = Main\UserTable::query()
321 ->setSelect(['PERSONAL_MAILBOX', 'EXTERNAL_AUTH_ID'])
322 ->whereIn('ID', array_map('intval', $userIds))
323 ->exec()
324 ;
325
326 while ($user = $usersResult->fetch())
327 {
328 $isSharingUser = ($user['EXTERNAL_AUTH_ID'] ?? '') === Sharing\SharingUser::EXTERNAL_AUTH_ID;
329
330 if ($isSharingUser && !empty($user['PERSONAL_MAILBOX']))
331 {
332 $result['email'] = $user['PERSONAL_MAILBOX'];
333 break;
334 }
335 }
336 }
337
338 return $result;
339 }
340
341 protected function getAbuseLink(): ?string
342 {
343 $ownerId = $this->eventLink->getOwnerId();
344 $calendarLink = $this->getCalendarLink() ?? $this->eventLink->getUrl();
345
346 return Sharing\Helper::getEmailAbuseLink($ownerId, $calendarLink);
347 }
348
349 protected function getBitrix24Link(): ?string
350 {
352 }
353}
$arParams
Определения access_dialog.php:21
const ACTION_CANCEL
Определения helper.php:34
const ACTION_OPENED
Определения helper.php:36
static getOwnerInfo(int $id)
Определения helper.php:139
static getEmailAbuseLink(int $ownerId, string $calendarLink)
Определения helper.php:383
static getBitrix24Link()
Определения helper.php:414
static setSiteLanguage()
Определения helper.php:432
const ACTION_CONFERENCE
Определения helper.php:35
const ACTION_ICS
Определения helper.php:33
notifyAboutMeetingCancelled(string $to)
Определения mail.php:69
const MEETING_STATUS_CANCELLED
Определения mail.php:13
sendMessage(string $to, array $arParams, string $subject, ?array $files=null)
Определения mail.php:178
getIcsFileId(string $organizerName, string $eventName)
Определения mail.php:259
notifyAboutMeetingCreated(string $to)
Определения mail.php:45
getInviteLinkParams(Sharing\Link\CrmDealLink $crmDealLink)
Определения mail.php:131
sendInviteLink(string $to)
Определения mail.php:111
getAvatars(?Sharing\Link\Joint\JointLink $parentLink)
Определения mail.php:217
notifyAboutSharingEventEdit(string $to)
Определения mail.php:147
notifyAboutMeetingStatus(string $to)
Определения mail.php:25
getBaseMailParams(string $ownerName)
Определения mail.php:200
getCancelMeetingSubject(array $initiatorInfo)
Определения mail.php:98
const MEETING_STATUS_CREATED
Определения mail.php:12
static setCanceledTimeOnSharedLink(int $eventId)
Определения sharingeventmanager.php:345
static getSharingEventNameByUserName(?string $userName)
Определения sharingeventmanager.php:264
static reSaveEventWithoutAttendeesExceptHostAndSharingLinkOwner(Sharing\Link\EventLink $eventLink)
Определения sharingeventmanager.php:885
static getInstance()
Определения application.php:98
static convertFormatToPhp($format)
Определения date.php:309
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$region
Определения .description.php:13
$culture
Определения include.php:61
FormatDate($format="", $timestamp=false, $now=false, ?string $languageId=null)
Определения tools.php:871
Определения address.php:8
$user
Определения mysql_to_pgsql.php:33
$files
Определения mysql_to_pgsql.php:30
const SITE_ID
Определения sonet_set_content_view.php:12
$fields
Определения yandex_run.php:501