diff --git a/app/voicemails/app_languages.php b/app/voicemails/app_languages.php index 85c418f523..56023fad08 100644 --- a/app/voicemails/app_languages.php +++ b/app/voicemails/app_languages.php @@ -2258,6 +2258,32 @@ $text['button-toggle']['zh-cn'] = "切换"; $text['button-toggle']['ja-jp'] = "トグル"; $text['button-toggle']['ko-kr'] = "비녀장"; +$text['button-resend']['en-us'] = "Resend"; +$text['button-resend']['en-gb'] = "Resend"; +$text['button-resend']['ar-eg'] = "إعادة إرسال"; +$text['button-resend']['de-at'] = "Erneut senden"; +$text['button-resend']['de-ch'] = "Erneut senden"; +$text['button-resend']['de-de'] = "Erneut senden"; +$text['button-resend']['el-gr'] = "Εκ νέου αποστολή"; +$text['button-resend']['es-cl'] = "Reenviar"; +$text['button-resend']['es-mx'] = "Reenviar"; +$text['button-resend']['fr-ca'] = "Renvoyer"; +$text['button-resend']['fr-fr'] = "Renvoyer"; +$text['button-resend']['he-il'] = "שלח שוב"; +$text['button-resend']['it-it'] = "Invia nuovamente"; +$text['button-resend']['nl-nl'] = "Opnieuw versturen"; +$text['button-resend']['pl-pl'] = "Wysłać ponownie"; +$text['button-resend']['pt-br'] = "Reenviar"; +$text['button-resend']['pt-pt'] = "Reenviar"; +$text['button-resend']['ro-ro'] = "Retrimiteți"; +$text['button-resend']['ru-ru'] = "Отправить"; +$text['button-resend']['sv-se'] = "Skicka igen"; +$text['button-resend']['uk-ua'] = "Надіслати повторно"; +$text['button-resend']['tr-tr'] = "Yeniden gönder"; +$text['button-resend']['zh-cn'] = "重发"; +$text['button-resend']['ja-jp'] = "再送信"; +$text['button-resend']['ko-kr'] = "재전송"; + $text['button-settings']['en-us'] = "Settings"; $text['button-settings']['en-gb'] = "Settings"; $text['button-settings']['ar-eg'] = "إعدادات"; @@ -2310,4 +2336,134 @@ $text['button-greetings']['zh-cn'] = "问候"; $text['button-greetings']['ja-jp'] = "ご挨拶"; $text['button-greetings']['ko-kr'] = "인사말"; -?> +$text['modal_title-resend']['en-us'] = "Resend Email"; +$text['modal_title-resend']['en-gb'] = "Resend Email"; +$text['modal_title-resend']['ar-eg'] = "إعادة إرسال البريد الإلكتروني"; +$text['modal_title-resend']['de-at'] = "E-Mail zurücksenden"; +$text['modal_title-resend']['de-ch'] = "E-Mail zurücksenden"; +$text['modal_title-resend']['de-de'] = "E-Mail zurücksenden"; +$text['modal_title-resend']['el-gr'] = "Ξαναστείλτε ηλεκτρονικό μήνυμα"; +$text['modal_title-resend']['es-cl'] = "Reenviar email"; +$text['modal_title-resend']['es-mx'] = "Reenviar email"; +$text['modal_title-resend']['fr-ca'] = "Ré-envoyer l'email"; +$text['modal_title-resend']['fr-fr'] = "Ré-envoyer l'email"; +$text['modal_title-resend']['he-il'] = "שלח אימייל מחדש"; +$text['modal_title-resend']['it-it'] = "Rinvia l'e-mail"; +$text['modal_title-resend']['nl-nl'] = "Email opnieuw verzenden"; +$text['modal_title-resend']['pl-pl'] = "Ponownie wysłać wiadomość e-mail"; +$text['modal_title-resend']['pt-br'] = "Reenviar email"; +$text['modal_title-resend']['pt-pt'] = "Reenviar email"; +$text['modal_title-resend']['ro-ro'] = "Retrimiteți e-mailul"; +$text['modal_title-resend']['ru-ru'] = "Отправить письмо повторно"; +$text['modal_title-resend']['sv-se'] = "Skicka email igen"; +$text['modal_title-resend']['uk-ua'] = "Повторно надіслати електронний лист"; +$text['modal_title-resend']['tr-tr'] = "Elektronik postayı tekrar gönder"; +$text['modal_title-resend']['zh-cn'] = "重发电子邮件"; +$text['modal_title-resend']['ja-jp'] = "メールを再送"; +$text['modal_title-resend']['ko-kr'] = "이메일 재전송"; + +$text['modal_message-resend']['en-us'] = "You are about to resend email notifications for the selected voicemail message(s)."; +$text['modal_message-resend']['en-gb'] = "You are about to resend email notifications for the selected voicemail message(s)."; +$text['modal_message-resend']['ar-eg'] = "أنت على وشك إعادة إرسال إشعارات البريد الإلكتروني لرسالة (رسائل) البريد الصوتي المحددة."; +$text['modal_message-resend']['de-at'] = "Sie sind dabei, E-Mail-Benachrichtigungen für die ausgewählte(n) Voicemail-Nachricht(en) erneut zu senden."; +$text['modal_message-resend']['de-ch'] = "Sie sind dabei, E-Mail-Benachrichtigungen für die ausgewählte(n) Voicemail-Nachricht(en) erneut zu senden."; +$text['modal_message-resend']['de-de'] = "Sie sind dabei, E-Mail-Benachrichtigungen für die ausgewählte(n) Voicemail-Nachricht(en) erneut zu senden."; +$text['modal_message-resend']['el-gr'] = "Πρόκειται να στείλετε ξανά ειδοποιήσεις email για τα επιλεγμένα μηνύματα αυτόματου τηλεφωνητή."; +$text['modal_message-resend']['es-cl'] = "Está a punto de reenviar notificaciones por correo electrónico para los mensajes de correo de voz seleccionados."; +$text['modal_message-resend']['es-mx'] = "Está a punto de reenviar notificaciones por correo electrónico para los mensajes de correo de voz seleccionados."; +$text['modal_message-resend']['fr-ca'] = "Vous êtes sur le point de renvoyer des notifications par e-mail pour le(s) message(s) vocal(s) sélectionné(s)."; +$text['modal_message-resend']['fr-fr'] = "Vous êtes sur le point de renvoyer des notifications par e-mail pour le(s) message(s) vocal(s) sélectionné(s)."; +$text['modal_message-resend']['he-il'] = 'אתה עומד לשלוח שוב הודעות דוא"ל עבור הודעות הדואר הקולי שנבחרו.'; +$text['modal_message-resend']['it-it'] = "Stai per inviare nuovamente le notifiche e-mail per i messaggi di posta vocale selezionati."; +$text['modal_message-resend']['nl-nl'] = "U staat op het punt opnieuw e-mailmeldingen te verzenden voor de geselecteerde voicemailberichten."; +$text['modal_message-resend']['pl-pl'] = "Zamierzasz ponownie wysłać powiadomienia e-mail dotyczące wybranych wiadomości poczty głosowej."; +$text['modal_message-resend']['pt-br'] = "Você está prestes a reenviar notificações por e-mail para as mensagens de correio de voz selecionadas."; +$text['modal_message-resend']['pt-pt'] = "Está prestes a reenviar as notificações por e-mail para as mensagens de correio de voz selecionadas."; +$text['modal_message-resend']['ro-ro'] = "Sunteți pe cale să retrimiteți notificări prin e-mail pentru mesajele vocale selectate."; +$text['modal_message-resend']['ru-ru'] = "Вы собираетесь повторно отправить уведомления по электронной почте для выбранных сообщений голосовой почты."; +$text['modal_message-resend']['sv-se'] = "Du är på väg att skicka e-postmeddelanden igen för de valda röstmeddelandena."; +$text['modal_message-resend']['uk-ua'] = "Ви збираєтеся повторно надіслати сповіщення електронною поштою для вибраних повідомлень голосової пошти."; +$text['modal_message-resend']['tr-tr'] = "Seçilen sesli posta mesajları için e-posta bildirimlerini yeniden göndermek üzeresiniz."; +$text['modal_message-resend']['zh-cn'] = "您即将重新发送所选语音邮件的电子邮件通知。"; +$text['modal_message-resend']['ja-jp'] = "選択したボイスメール メッセージの電子メール通知を再送信しようとしています。"; +$text['modal_message-resend']['ko-kr'] = "선택한 음성 메일 메시지에 대한 이메일 알림을 다시 보내려고 합니다."; + +$text['label-voicemail_from']['en-us'] = "Voicemail from"; +$text['label-voicemail_from']['en-gb'] = "Voicemail from"; +$text['label-voicemail_from']['ar-eg'] = "- البريد الصوتي"; +$text['label-voicemail_from']['de-at'] = "Voicemail -"; +$text['label-voicemail_from']['de-ch'] = "Voicemail -"; +$text['label-voicemail_from']['de-de'] = "Voicemail -"; +$text['label-voicemail_from']['el-gr'] = "Τηλεφωνητής -"; +$text['label-voicemail_from']['es-cl'] = "Correo de Voz -"; +$text['label-voicemail_from']['es-mx'] = "Correo de Voz -"; +$text['label-voicemail_from']['fr-ca'] = "Messagerie vocale -"; +$text['label-voicemail_from']['fr-fr'] = "Messagerie vocale -"; +$text['label-voicemail_from']['he-il'] = " -תא קולי"; +$text['label-voicemail_from']['it-it'] = "Casella Vocale -"; +$text['label-voicemail_from']['nl-nl'] = "Voicemail -"; +$text['label-voicemail_from']['pl-pl'] = "Poczta głosowa -"; +$text['label-voicemail_from']['pt-br'] = "Correio de voz -"; +$text['label-voicemail_from']['pt-pt'] = "Correio de Voz -"; +$text['label-voicemail_from']['ro-ro'] = "Mesageria vocală -"; +$text['label-voicemail_from']['ru-ru'] = "Голосовая почта -"; +$text['label-voicemail_from']['sv-se'] = "Röstbrevlåda -"; +$text['label-voicemail_from']['uk-ua'] = "Голосова пошта -"; +$text['label-voicemail_from']['tr-tr'] = "Sesli mesaj -"; +$text['label-voicemail_from']['zh-cn'] = "语音信箱 -"; +$text['label-voicemail_from']['ja-jp'] = "ボイスメール -"; +$text['label-voicemail_from']['ko-kr'] = "음성사서함 -"; + +$text['label-attached']['en-us'] = "Attached"; +$text['label-attached']['en-gb'] = "Attached"; +$text['label-attached']['ar-eg'] = "مُرفَق"; +$text['label-attached']['de-at'] = "Beigefügt"; +$text['label-attached']['de-ch'] = "Beigefügt"; +$text['label-attached']['de-de'] = "Beigefügt"; +$text['label-attached']['el-gr'] = "Επισυνάπτεται"; +$text['label-attached']['es-cl'] = "Adjunto"; +$text['label-attached']['es-mx'] = "Adjunto"; +$text['label-attached']['fr-ca'] = "Ci-joint"; +$text['label-attached']['fr-fr'] = "Ci-joint"; +$text['label-attached']['he-il'] = "מְצוֹרָף"; +$text['label-attached']['it-it'] = "Allegato"; +$text['label-attached']['nl-nl'] = "Bijgevoegd"; +$text['label-attached']['pl-pl'] = "Przyłączony"; +$text['label-attached']['pt-br'] = "Apegado"; +$text['label-attached']['pt-pt'] = "Anexado"; +$text['label-attached']['ro-ro'] = "Atașat"; +$text['label-attached']['ru-ru'] = "Прикрепил"; +$text['label-attached']['sv-se'] = "Bifogad"; +$text['label-attached']['uk-ua'] = "Додається"; +$text['label-attached']['tr-tr'] = "Ekli"; +$text['label-attached']['zh-cn'] = "随附的"; +$text['label-attached']['ja-jp'] = "添付"; +$text['label-attached']['ko-kr'] = "첨부된"; + +$text['label-listen']['en-us'] = "Listen"; +$text['label-listen']['en-gb'] = "Listen"; +$text['label-listen']['ar-eg'] = "يستمع"; +$text['label-listen']['de-at'] = "Hören"; +$text['label-listen']['de-ch'] = "Hören"; +$text['label-listen']['de-de'] = "Hören"; +$text['label-listen']['el-gr'] = "Ακούω"; +$text['label-listen']['es-cl'] = "Escuchar"; +$text['label-listen']['es-mx'] = "Escuchar"; +$text['label-listen']['fr-ca'] = "Écouter"; +$text['label-listen']['fr-fr'] = "Écouter"; +$text['label-listen']['he-il'] = "להקשיב"; +$text['label-listen']['it-it'] = "Ascoltare"; +$text['label-listen']['nl-nl'] = "Luisteren"; +$text['label-listen']['pl-pl'] = "Słuchać"; +$text['label-listen']['pt-br'] = "Ouvir"; +$text['label-listen']['pt-pt'] = "Escutar"; +$text['label-listen']['ro-ro'] = "Asculta"; +$text['label-listen']['ru-ru'] = "Слушать"; +$text['label-listen']['sv-se'] = "Lyssna"; +$text['label-listen']['uk-ua'] = "Слухай"; +$text['label-listen']['tr-tr'] = "Dinlemek"; +$text['label-listen']['zh-cn'] = "听"; +$text['label-listen']['ja-jp'] = "聞く"; +$text['label-listen']['ko-kr'] = "듣다"; + +?> \ No newline at end of file diff --git a/app/voicemails/resources/classes/voicemail.php b/app/voicemails/resources/classes/voicemail.php index 661298cf0e..ac4acd135d 100644 --- a/app/voicemails/resources/classes/voicemail.php +++ b/app/voicemails/resources/classes/voicemail.php @@ -718,44 +718,309 @@ $this->message_waiting(); } + public function message_resend() { + + //check if for valid input + if (!is_uuid($this->voicemail_uuid) + || !is_uuid($this->domain_uuid) + || !is_uuid($this->voicemail_message_uuid) + ) { + return false; + } + + //add multi-lingual support + $language = new text; + $text = $language->get(); + + //add the settings object + $settings = new settings(["domain_uuid" => $_SESSION['domain_uuid'], "user_uuid" => $_SESSION['user_uuid']]); + $email_from = $settings->get('email', 'smtp_from', ''); + $email_from_name = $settings->get('email', 'smtp_from_name', 'PBX'); + $switch_scripts = $settings->get('switch', 'scripts', '/usr/share/freeswitch/scripts'); + $switch_voicemail = $settings->get('switch', 'voicemail', '/var/lib/freeswitch/storage/voicemail'); + $language_dialect = $settings->get('domain', 'language', 'en-us'); + $time_zone = $settings->get('domain', 'time_zone', 'UTC'); + $display_domain_name = $settings->get('voicemail', 'display_domain_name', 'false'); + + //get voicemail message details + $sql = "select "; + $sql .= " vm.*, "; + $sql .= " to_char(timezone(:time_zone, to_timestamp(vm.created_epoch)), 'Day DD Mon YYYY HH:MI:SS PM') as message_date, "; + $sql .= " v.voicemail_id, "; + $sql .= " v.voicemail_mail_to, "; + $sql .= " v.voicemail_description, "; + $sql .= " v.voicemail_file, "; + $sql .= " d.domain_name "; + $sql .= "from "; + $sql .= " v_voicemail_messages as vm "; + $sql .= " left join v_voicemails as v on vm.voicemail_uuid = v.voicemail_uuid "; + $sql .= " left join v_domains as d on vm.domain_uuid = d.domain_uuid "; + $sql .= "where "; + $sql .= " vm.voicemail_message_uuid = :voicemail_message_uuid "; + $sql .= "limit 1" ; + $parameters['time_zone'] = $time_zone; + $parameters['voicemail_message_uuid'] = $this->voicemail_message_uuid; + $database = new database; + $message = $database->select($sql, $parameters, 'row'); + unset($sql, $parameters); + + //retrieve appropriate email template + $sql = "select "; + $sql .= " template_subject, "; + $sql .= " template_body "; + $sql .= "from "; + $sql .= " v_email_templates "; + $sql .= "where "; + $sql .= " template_language = :template_language "; + $sql .= " and template_category = 'voicemail' "; + $sql .= " and template_subcategory = '".(!empty($message['message_transcription']) ? 'transcription' : 'default')."' "; + $sql .= " and template_type = 'html' "; + $sql .= " and template_enabled = 'true' "; + $sql .= " and (domain_uuid = :domain_uuid or domain_uuid is null) "; + $sql .= "limit 1 "; + $parameters['template_language'] = $language_dialect; + $parameters['domain_uuid'] = $this->domain_uuid; + $template = $database->select($sql, $parameters, 'row'); + unset($sql, $parameters); + + //determine formatted voicemail name + $voicemail_name_formatted = $message['voicemail_id']; + if ($display_domain_name == 'true') { + $voicemail_name_formatted = $message['voicemail_id'].'@'.$message['domain_name']; + } + if (!empty($message['voicemail_description'])) { + $voicemail_name_formatted .= ' ('.$message['voicemail_description'].')'; + } + + //replace subject variables + if (!empty($template['template_subject'])) { + $template['template_subject'] = str_replace('${caller_id_name}', $message['caller_id_name'], $template['template_subject']); + $template['template_subject'] = str_replace('${caller_id_number}', $message['caller_id_number'], $template['template_subject']); + $template['template_subject'] = str_replace('${message_date}', $message['message_date'], $template['template_subject']); + $template['template_subject'] = str_replace('${message_duration}', '0'.gmdate("G:i:s", ($message['message_length'] ?? 0)), $template['template_subject']); + $template['template_subject'] = str_replace('${account}', $voicemail_name_formatted, $template['template_subject']); + $template['template_subject'] = str_replace('${voicemail_id}', $message['voicemail_id'], $template['template_subject']); + $template['template_subject'] = str_replace('${voicemail_description}', $message['voicemail_description'], $template['template_subject']); + $template['template_subject'] = str_replace('${voicemail_name_formatted}', $voicemail_name_formatted, $template['template_subject']); + $template['template_subject'] = str_replace('${domain_name}', $message['domain_name'], $template['template_subject']); + } + else { + $template['template_subject'] = $text['label-voicemail_from'].' '.$message['caller_id_name'].' <'.$message['caller_id_number'].'> 0'.gmdate("G:i:s", ($message['message_length'] ?? 0)); + } + + //encode subject + $template['template_subject'] = trim(iconv_mime_encode(null, $template['template_subject'], ['scheme'=>'B','output-charset'=>'utf-8', 'line-break-chars'=>"\n"]), ': '); + + //determine voicemail message file path and type + $voicemail_message_path = $switch_voicemail.'/default/'.$message['domain_name'].'/'.$message['voicemail_id']; + if ( + !empty($message['message_base64']) && + !file_exists($voicemail_message_path.'/msg_'.$message['voicemail_message_uuid'].'.wav') && + !file_exists($voicemail_message_path.'/msg_'.$message['voicemail_message_uuid'].'.mp3') + ) { + $voicemail_message_decoded = base64_decode($message['message_base64']); + file_put_contents($voicemail_message_path.'/msg_'.$message['voicemail_message_uuid'].'.ext', $voicemail_message_decoded); + $finfo = finfo_open(FILEINFO_MIME_TYPE); + $voicemail_message_file_mime = finfo_file($finfo, $voicemail_message_path.'/msg_'.$message['voicemail_message_uuid'].'.ext'); + finfo_close($finfo); + unset($voicemail_message_decoded); + switch ($voicemail_message_file_mime) { + case 'audio/x-wav': + case 'audio/wav': + $voicemail_message_file_ext = 'wav'; + break; + case 'audio/mpeg': + case 'audio/mp3': + $voicemail_message_file_ext = 'mp3'; + break; + } + rename($voicemail_message_path.'/msg_'.$message['voicemail_message_uuid'].'.ext', $voicemail_message_path.'/msg_'.$message['voicemail_message_uuid'].'.'.$voicemail_message_file_ext); + $voicemail_message_file = 'msg_'.$message['voicemail_message_uuid'].'.'.$voicemail_message_file_ext; + } + else { + if (file_exists($voicemail_message_path.'/msg_'.$message['voicemail_message_uuid'].'.wav')) { $voicemail_message_file_ext = 'wav'; } + if (file_exists($voicemail_message_path.'/msg_'.$message['voicemail_message_uuid'].'.mp3')) { $voicemail_message_file_ext = 'mp3'; } + $voicemail_message_file = 'msg_'.$message['voicemail_message_uuid'].'.'.$voicemail_message_file_ext; + $voicemail_message_file_mime = mime_content_type($voicemail_message_path.'/msg_'.$message['voicemail_message_uuid'].'.'.$voicemail_message_file_ext); + } + + //replace body variables + if (!empty($template['template_body'])) { + $template['template_body'] = str_replace('${caller_id_name}', $message['caller_id_name'], $template['template_body']); + $template['template_body'] = str_replace('${caller_id_number}', $message['caller_id_number'], $template['template_body']); + $template['template_body'] = str_replace('${message_date}', $message['message_date'], $template['template_body']); + $template['template_body'] = str_replace('${message_text}', $message['message_transcription'], $template['template_body']); + $template['template_body'] = str_replace('${message_duration}', '0'.gmdate("G:i:s", ($message['message_length'] ?? 0)), $template['template_body']); + $template['template_body'] = str_replace('${account}', $voicemail_name_formatted, $template['template_body']); + $template['template_body'] = str_replace('${voicemail_id}', $message['voicemail_id'], $template['template_body']); + $template['template_body'] = str_replace('${voicemail_description}', $message['voicemail_description'], $template['template_body']); + $template['template_body'] = str_replace('${voicemail_name_formatted}', $voicemail_name_formatted, $template['template_body']); + $template['template_body'] = str_replace('${domain_name}', $message['domain_name'], $template['template_body']); + $template['template_body'] = str_replace('${sip_to_user}', $message['voicemail_id'], $template['template_body']); + $template['template_body'] = str_replace('${dialed_user}', $message['voicemail_id'], $template['template_body']); + if (!empty($message['voicemail_file'])) { + if ($message['voicemail_file'] == 'attach' && file_exists($voicemail_message_path.'/'.$voicemail_message_file)) { + $template['template_body'] = str_replace('${message}', $text['label-attached'], $template['template_body']); + } + else if ($message['voicemail_file'] == 'link') { + $template['template_body'] = str_replace('${message}', "".$text['label-download']."", $template['template_body']); + } + else { // listen + $template['template_body'] = str_replace('${message}', "".$text['label-listen']."", $template['template_body']); + } + } + } + else { + $template['template_body'] = "\n\n"; + if (!empty($message['caller_id_name']) && $message['caller_id_name'] != $message['caller_id_number']) { + $template['template_body'] .= $message['caller_id_name']."
\n"; + } + $template['template_body'] .= $message['caller_id_number']."
\n"; + $template['template_body'] .= $message['message_date']."
\n"; + if (!empty($message['voicemail_file'])) { + if ($message['voicemail_file'] == 'attach' && file_exists($voicemail_message_path.'/'.$voicemail_message_file)) { + $template['template_body'] .= "
\n".$text['label-attached']; + } + else if ($message['voicemail_file'] == 'link') { + $template['template_body'] .= "
\n".$text['label-download'].''; + } + else { // listen + $template['template_body'] .= "
\n".$text['label-listen'].''; + } + } + $template['template_body'] .= "\n\n"; + } + + //build message status update array + $array['email_queue'][0]['email_queue_uuid'] = $email_queue_uuid = uuid(); + $array['email_queue'][0]['domain_uuid'] = $this->domain_uuid; + $array['email_queue'][0]['hostname'] = gethostname(); + $array['email_queue'][0]['email_date'] = 'now()'; + $array['email_queue'][0]['email_from'] = $email_from_name.'<'.$email_from.'>'; + $array['email_queue'][0]['email_to'] = $message['voicemail_mail_to']; + $array['email_queue'][0]['email_subject'] = $template['template_subject']; + $array['email_queue'][0]['email_body'] = $template['template_body']; + $array['email_queue'][0]['email_status'] = 'waiting'; + $array['email_queue'][0]['email_uuid'] = $this->voicemail_message_uuid; + $array['email_queue'][0]['email_transcription'] = $message['message_transcription']; + $array['email_queue'][0]['insert_date'] = 'now()'; + $array['email_queue'][0]['insert_user'] = $_SESSION['user_uuid']; + + //add voicemail file details (and/or base64) to queue attachments + if (!empty($message['voicemail_file']) && $message['voicemail_file'] == 'attach' && file_exists($voicemail_message_path.'/'.$voicemail_message_file)) { + $array['email_queue_attachments'][0]['email_queue_attachment_uuid'] = uuid(); + $array['email_queue_attachments'][0]['domain_uuid'] = $this->domain_uuid; + $array['email_queue_attachments'][0]['email_queue_uuid'] = $email_queue_uuid; + $array['email_queue_attachments'][0]['email_attachment_type'] = $voicemail_message_file_ext; + $array['email_queue_attachments'][0]['email_attachment_path'] = $voicemail_message_path; + $array['email_queue_attachments'][0]['email_attachment_name'] = $voicemail_message_file; + $array['email_queue_attachments'][0]['email_attachment_base64'] = $message['message_base64']; + $array['email_queue_attachments'][0]['email_attachment_cid'] = !empty($message['message_base64']) ? uuid() : null; + $array['email_queue_attachments'][0]['email_attachment_mime_type'] = $voicemail_message_file_mime; + $array['email_queue_attachments'][0]['insert_date'] = 'now()'; + $array['email_queue_attachments'][0]['insert_user'] = $_SESSION['user_uuid']; + } + + //grant temporary permissions + $p = new permissions; + $p->add('email_queue_add', 'temp'); + $p->add('email_queue_attachment_add', 'temp'); + + //execute update + $database = new database; + $database->app_name = $this->app_name; + $database->app_name = $this->app_uuid; + $database->save($array); + unset($array); + + //revoke temporary permissions + $p->delete('email_queue_add', 'temp'); + $p->delete('email_queue_attachment_add', 'temp'); + + //remove temp file from base64 output + if (!empty($message['message_base64']) && file_exists($voicemail_message_path.'/'.$voicemail_message_file)) { + @unlink($voicemail_message_path.'/'.$voicemail_message_file); + } + + } + public function message_transcribe() { //get the voicemail id - $this->get_voicemail_id(); + $this->get_voicemail_id(); //check if for valid input - if (!is_numeric($this->voicemail_id) - || !is_uuid($this->voicemail_uuid) - || !is_uuid($this->domain_uuid) - || !is_uuid($this->voicemail_message_uuid) - ) { - return false; - } + if (!is_numeric($this->voicemail_id) + || !is_uuid($this->voicemail_uuid) + || !is_uuid($this->domain_uuid) + || !is_uuid($this->voicemail_message_uuid) + ) { + return false; + } //add the settings object $settings = new settings(["domain_uuid" => $_SESSION['domain_uuid'], "user_uuid" => $_SESSION['user_uuid']]); $transcribe_enabled = $settings->get('transcribe', 'enabled', 'false'); $transcribe_engine = $settings->get('transcribe', 'engine', ''); + $switch_voicemail = $settings->get('switch', 'voicemail', '/var/lib/freeswitch/storage/voicemail'); //transcribe multiple recordings if ($transcribe_enabled == 'true' && !empty($transcribe_engine)) { + //get voicemail message base64 + $sql = "select message_base64 from v_voicemail_messages where voicemail_message_uuid = :voicemail_message_uuid "; + $parameters['voicemail_message_uuid'] = $this->voicemail_message_uuid; + $database = new database; + $voicemail_message_base64 = $database->select($sql, $parameters, 'column'); + unset($sql, $parameters); + + //define voicemail message file path + $voicemail_message_path = $switch_voicemail.'/default/'.$_SESSION['domain_name'].'/'.$this->voicemail_id; + + //determine voicemail message file properties (decode if base64) + if ( + !empty($voicemail_message_base64) && + !file_exists($voicemail_message_path.'/msg_'.$this->voicemail_message_uuid.'.wav') && + !file_exists($voicemail_message_path.'/msg_'.$this->voicemail_message_uuid.'.mp3') + ) { + $voicemail_message_decoded = base64_decode($voicemail_message_base64); + file_put_contents($voicemail_message_path.'/msg_'.$this->voicemail_message_uuid.'.ext', $voicemail_message_decoded); + $finfo = finfo_open(FILEINFO_MIME_TYPE); + $voicemail_message_file_mime = finfo_file($finfo, $voicemail_message_path.'/msg_'.$this->voicemail_message_uuid.'.ext'); + finfo_close($finfo); + switch ($voicemail_message_file_mime) { + case 'audio/x-wav': + case 'audio/wav': + $voicemail_message_file_ext = 'wav'; + break; + case 'audio/mpeg': + case 'audio/mp3': + $voicemail_message_file_ext = 'mp3'; + break; + } + unset($voicemail_message_decoded, $voicemail_message_file_mime); + rename($voicemail_message_path.'/msg_'.$this->voicemail_message_uuid.'.ext', $voicemail_message_path.'/msg_'.$this->voicemail_message_uuid.'.'.$voicemail_message_file_ext); + $voicemail_message_file = 'msg_'.$this->voicemail_message_uuid.'.'.$voicemail_message_file_ext; + } + else { + if (file_exists($voicemail_message_path.'/msg_'.$this->voicemail_message_uuid.'.wav')) { $voicemail_message_file_ext = 'wav'; } + if (file_exists($voicemail_message_path.'/msg_'.$this->voicemail_message_uuid.'.mp3')) { $voicemail_message_file_ext = 'mp3'; } + $voicemail_message_file = 'msg_'.$this->voicemail_message_uuid.'.'.$voicemail_message_file_ext; + } + unset($voicemail_message_file_ext); + //add the transcribe object $transcribe = new transcribe($settings); - //get each voicemail message file - $file_path = $_SESSION['switch']['voicemail']['dir']."/default/".$_SESSION['domain_name']."/".$this->voicemail_id; - foreach (glob($file_path."/msg_".$this->voicemail_message_uuid.".*") as $file_name) { - //audio to text - get the transcription from the audio file - $transcribe->audio_path = $file_path; - $transcribe->audio_filename = basename($file_name); - $message_transcription = $transcribe->transcribe(); - //build voicemail message data array - if (!empty($message_transcription)) { - $array['voicemail_messages'][0]['voicemail_message_uuid'] = $this->voicemail_message_uuid; - $array['voicemail_messages'][0]['message_transcription'] = $message_transcription; - break; - } + //transcribe the voicemail message file + $transcribe->audio_path = $voicemail_message_path; + $transcribe->audio_filename = basename($voicemail_message_file); + $message_transcription = $transcribe->transcribe(); + + //build voicemail message data array + if (!empty($message_transcription)) { + $array['voicemail_messages'][0]['voicemail_message_uuid'] = $this->voicemail_message_uuid; + $array['voicemail_messages'][0]['message_transcription'] = $message_transcription; } //update the checked rows @@ -777,6 +1042,11 @@ } + //remove temp file from base64 output + if (!empty($voicemail_message_base64) && file_exists($voicemail_message_path.'/'.$voicemail_message_file)) { + @unlink($voicemail_message_path.'/'.$voicemail_message_file); + } + return !empty($message_transcription) ? true : false; } diff --git a/app/voicemails/voicemail_messages.php b/app/voicemails/voicemail_messages.php index a06caea906..3a5c8f0e9b 100644 --- a/app/voicemails/voicemail_messages.php +++ b/app/voicemails/voicemail_messages.php @@ -185,6 +185,28 @@ } } break; + case 'resend': + if (is_array($voicemail_messages) && @sizeof($voicemail_messages) != 0) { + $messages_resent = 0; + foreach ($voicemail_messages as $voicemail_message) { + if (!empty($voicemail_message['checked']) && $voicemail_message['checked'] == 'true' && is_uuid($voicemail_message['uuid']) && is_uuid($voicemail_message['voicemail_uuid'])) { + //resend (email) voicemail message + $voicemail = new voicemail; + $voicemail->domain_uuid = $_SESSION['domain_uuid']; + $voicemail->voicemail_uuid = $voicemail_message['voicemail_uuid']; + $voicemail->voicemail_message_uuid = $voicemail_message['uuid']; + $voicemail->message_resend(); + unset($voicemail); + //increment counter + $messages_resent++; + } + } + //set message + if ($messages_resent != 0) { + message::add($text['message-toggle'].': '.$messages_resent); + } + } + break; case 'delete': if (permission_exists('voicemail_message_delete')) { if (is_array($voicemail_messages) && @sizeof($voicemail_messages) != 0) { @@ -302,6 +324,8 @@ $margin_left = true; } if ($num_rows) { + echo button::create(['type'=>'button','label'=>$text['button-resend'],'icon'=>$_SESSION['theme']['button_icon_email'],'id'=>'btn_resend','name'=>'btn_resend','collapse'=>'hide-xs','style'=>'display: none;'.(!$margin_left ? 'margin-left: 15px;' : null),'onclick'=>"modal_open('modal-resend','btn_resend');"]); + $margin_left = true; echo button::create(['type'=>'button','label'=>$text['button-toggle'],'icon'=>$_SESSION['theme']['button_icon_toggle'],'id'=>'btn_toggle','name'=>'btn_toggle','collapse'=>'hide-xs','style'=>'display: none;'.(!$margin_left ? 'margin-left: 15px;' : null),'onclick'=>"modal_open('modal-toggle','btn_toggle');"]); $margin_left = true; } @@ -316,6 +340,14 @@ echo "\n"; if ($num_rows) { + echo modal::create([ + 'id'=>'modal-resend', + 'title'=>$text['modal_title-resend'], + 'message'=>$text['modal_message-resend'], + 'actions'=> + button::create(['type'=>'button','label'=>$text['button-cancel'],'icon'=>$_SESSION['theme']['button_icon_cancel'],'collapse'=>'hide-xs','onclick'=>'modal_close();']). + button::create(['type'=>'button','label'=>$text['button-continue'],'icon'=>'check','collapse'=>'never','style'=>'float: right;','onclick'=>"modal_close(); list_action_set('resend'); list_form_submit('form_list');"]) + ]); echo modal::create(['id'=>'modal-toggle','type'=>'toggle','actions'=>button::create(['type'=>'button','label'=>$text['button-continue'],'icon'=>'check','id'=>'btn_toggle','style'=>'float: right; margin-left: 15px;','collapse'=>'never','onclick'=>"modal_close(); list_action_set('toggle'); list_form_submit('form_list');"])]); } if (permission_exists('voicemail_message_delete') && $num_rows) { diff --git a/themes/default/template.php b/themes/default/template.php index f5474f829c..e1162fc76f 100644 --- a/themes/default/template.php +++ b/themes/default/template.php @@ -906,12 +906,14 @@ btn_delete = document.getElementById("btn_delete"); btn_download = document.getElementById("btn_download"); btn_transcribe = document.getElementById("btn_transcribe"); + btn_resend = document.getElementById("btn_resend"); if (checked == true) { if (btn_copy) { btn_copy.style.display = "inline"; } if (btn_toggle) { btn_toggle.style.display = "inline"; } if (btn_delete) { btn_delete.style.display = "inline"; } if (btn_download) { btn_download.style.display = "inline"; } if (btn_transcribe) { btn_transcribe.style.display = "inline"; } + if (btn_resend) { btn_resend.style.display = "inline"; } } else { if (btn_copy) { btn_copy.style.display = "none"; } @@ -919,6 +921,7 @@ if (btn_delete) { btn_delete.style.display = "none"; } if (btn_download) { btn_download.style.display = "none"; } if (btn_transcribe) { btn_transcribe.style.display = "none"; } + if (btn_resend) { btn_resend.style.display = "none"; } } } {/literal}