Реализовали у себя отправку и прием факсов из Terrasoft. Версия Terrasoft 3.4.0.136, Oktell 111007.

Карточка звонка
Для этого:
1. В окно wnd_CallEdit в меню amToolbar добавляем два компонента ActionMenuItem:

  • amiFaxTransmit
  • amiFaxReceive

С подписью Отправить факс и Принять факс соответственно.
На событии onExecute amiFaxTransmit прописываем:

Connector.Attributes('CallClientObject').FaxStartTransmit();

На событии onExecute amiFaxReceive прописываем:
Connector.Attributes('CallClientObject').FaxStartReceive();

2. Открываем scr_OktellClientUtils и в функцию OktellCallClientObject() добавляем следующие строки:

         //------ Отправка факса -------//
        this.FaxStartTransmit = function() {                                                   
                OktellFaxStartTransmit();

        }
         //------ Получение факса -------//
        this.FaxStartReceive = function() {
            OktellFaxStartReceive();
        }

3. Открываем scr_OktellUtils и Добавляем функции:

//------------   Получение факсового сообщения -----------------
function OktellFaxStartReceive(){
        var date;
        date = new Date();
        CurrentDay = date.getDate();
        CurrentMonth = (date.getMonth() + 1);
        CurrentHours = date.getHours();
        CurrentMinutes = date.getMinutes();
        CurrentSeconds = date.getSeconds();
         
   FileName = String(CurrentDay) + '_' + String(CurrentMonth) + '   '
                        + String(CurrentHours) + '_' + String(CurrentMinutes) + '_' + String(CurrentSeconds);


        var wshshell = new ActiveXObject("wscript.shell");
        var FullName = wshshell.ExpandEnvironmentStrings("%HOMEPATH%") +
                                '\\Desktop\\Принятые_факсы\\fax_' + FileName + '.tiff';

        var CommandXml =
                '' +
                '' +
                '' +
                '' +
                '+ FullName +']]>' +
                '' +
                '' +
                '';
        Oktell.Instance.FaxStartReceive(CommandXml);

               
}
//------------   Отправка факсового сообщения -----------------
function OktellFaxStartTransmit(){
                var FileName = System.CreateObject('TSObjectLibrary.Value');
                var DialogCaption = "Выбор файла FAX";
        // Фильтр по расширению прикрепляемых файлов
                var DefaultExt = '*.jpg';              
                var IMGFilter = "Файл изображения" + ' (*.jpg)|*.jpg|(*.tif)|*.tif|(*.bmp)|*.bmp';              
                if (!(System.OpenDialog(FileName, IMGFilter , DefaultExt, DialogCaption, EmptyStr))) {
                return;
        }
        // Получаем полный путь к файлу с раширением
                var FullName = FileName.Value;
       
        var CommandXml =
                '' +
                '' +
                '' +
                '' +
                '+ FullName +']]>' +
                '' +
                '' +
                '';
        Oktell.Instance.FaxStartTransmit(CommandXml);
 }

4. Для того, чтобы увидеть ход процесса и получать информацию о возможных ошибках отправки и получения факсовых сообщений в функцию OnOktellCommunicate() скрипта scr_OktellUtils добавим:

case ocmFaxStopped:   //----- Событие АТС о завершении факс-сеанса
                OktellFaxStopped(RootNode);
                break;
case ocmFaxFilesReceived:   //----- Событие АТС о завершении файла по факс-сеансу
                OktellFaxFilesReceived(RootNode);         // -- Содержит признак успешности приема и ...
                break;
case ocmFaxStarted:   //----- Событие АТС о начале факс-сеанса
                OktellFaxStarted(RootNode);
                break;

5. В scr_OktellUtils добавим:

function OktellFaxStarted(){   //----- Событие АТС о начале факс-сеанса
                var wnd_Information = Services.GetSingleItemByUSI('wnd_FaxStartProgress');
                wnd_Information.Prepare();
                wnd_Information.Show();
}

function OktellFaxStopped(){   //----- Событие АТС о завершении факс-сеанса
        var wnd_Information = Services.GetSingleItemByUSI('wnd_FaxStartProgress');
        wnd_Information.Close();       
}

function OktellFaxFilesReceived(RootNode){ //----- Событие АТС о завершении приема файла по факс-сеансу
        var wnd_Information = Services.GetSingleItemByUSI('wnd_FaxStartProgress');
        wnd_Information.Close();

        // --- Успешно принято ? ---//
        var SuccessXML = MsxmlGetChildXmlNodeByAttributeValue(RootNode, 'key', 'success');
        var SuccessFax = MsxmlGetXmlAttributeValueByName(SuccessXML, 'value');

        // --- Текст ошибки ---//
        var ErrorXML = MsxmlGetChildXmlNodeByAttributeValue(RootNode, 'key', 'errortext');
        var ErrorFax = MsxmlGetXmlAttributeValueByName(ErrorXML, 'value');

        if (SuccessFax == 1){
                var Message = "Операция приема/отправки факсового сообщения успешно завершена."
        ShowInformationDialog(Message);
        }
                else if (SuccessFax == 0){
                var Message = FormatStr("Ошибка получения факса: '%1'", ErrorFax);
                ShowConfirmationDialog(Message);
        }

}

6. Сервис окна wnd_FaxStartProgress: wnd_faxstartprogress.7z
wnd_FaxStartProgress

7. Ну и сами картинки в карточку звонка il_call.7z

Принятые факсы сохраняются на рабочем столе пользователя в папке Принятые_факсы (папка создается автоматически) с расширением *.tiff. Для отправки подходят файлы изображений *.jpeg, *.bmp, *.tiff. Во время отправки и получения факса, пользователь Terrasoft слышит в трубке музыку из сценария Oktell (вместо служебных сигналов факса). Отправка других форматов файлов находится в стадии разработки :smile:

Документация Oktell для разработчиков rukovodstvo.7z

Очень интересно будет услышать Ваше мнения, а также предложения и замечания.

Нравится

Поделиться

6 комментариев

Вылетает ошибка "предполагается наличие объекта"
Скрипты во вложении

Добрый день, Алексей! Возможно эта ошибка возникает из-за отсутствия в wnd_CallEditScript прикрепленного скрипта scr_FileUtils. Для общей картины вот мои скрипты .

Скрипт прикрепил
Теперь в момент выбора файла для отправки вылетает сообщение (во вложении). При этом сервер Октелла факс не отправляет (т.е. скорее всего факс-сеанс не начинается)
Оно же вылетает и при приеме факса, (при старте приема и при окончании), но тем не менее факс приходит успешно и сохраняется на рабочем столе.

Да, спасибо. Все работает!

Скажите, удалось ли добавить отправку факсом doc и xls файлов?

"bayborodin" написал:

Скажите, удалось ли добавить отправку факсом doc и xls файлов?


Напрямую не удалось реализовать такую функцию, пришлось воспользоваться сторонней коммерческой разработкой Total Doc Converter, который в фоновом режиме конвертирует doc в jpeg. Очень полезная особенность Total Doc Converter - возможность "склеивать" несколько страниц doc в один "рулон" jpeg. С pdf файлами все намного сложнее из-за функции сжатия. При их конвертации иногда случаются проблемы с отображением символов.

Показать все комментарии

Всем привет. Продолжая свои изыскания, хотел бы запросить уважаемое сообщество на тему Факсов.

Собственно изжил ли себя факс или ещё используется?

Актуальна ли тема:   Ну скажем Факс на емайл?

Идея какая  стоит некий сервер на нём номер При дозвоне на него система просит ввести добавачный номер получателя факса, Отправитель вводит номер система принимает факс и конвертит его в файл, И отправляет на емайл сопоставленный данному добавочному номеру.

Просто сервис есть , можно потестить.

Я поставил у себя отладил, работает.

Если есть желание попробывать Пишите в личку . Дам тестовый аккуант на пару месяцев. Факсовый номер в москве код 495.
От вас нужен только емайл куда слать факсы. Добавочный я вам вышлю.

Нравится

Поделиться

10 комментариев

Александр, у меня вопрос: "А не проще ли взять и отправить e-mail без этого промежуточного сервера?"

Если есть электронная версия документа то да, проще мылом.
Но факсы на удивление живучи, любят их во многих местах по сей день))
И бумажку с подписями/печатями еще просканировать надо.

ООО "Лайнсервис"
www.ls-crm.ru

"Карло Сергей" написал:Александр, у меня вопрос: "А не проще ли взять и отправить e-mail без этого промежуточного сервера?"

Да сергей нам с тобой может и проше , Но есть много людей и фирм которые пользуются факсами . Вот собственно и хочу понять сколько их осталось и насколько актуальна тема.

Александр Ярмоленко
Лайнсервис
http://www.ls-crm.ru

Александр, могу ответить на твой вопрос однозначно. Их не просто много, их на сегодня очень много.
Особенно это востребовано в средних компаниях, где с утра секретарь передает почту Руководителю на "подносе". Просмотреть почту "с подноса", рассортрованную профессиональным секретарем намного проще, нежели тратитьвремя на сортировку пришедших сообщений по e-mail (Знаю компании, где директор получает до 200 писем в день.)

Так же знаю торговые точки (например, сеть элит салонов) где иннет отсутствует, а факс - нууууу очень активно используется.

Хотя для компаний, где факс приходит на ресепшен и ресепшеонистам приходится каким-то образом "переправлять" отсортированные факсы в приемные директоров - удобнее "перенаправить" факс на e-mail секретаря указанного директора.

Даже если есть все прелести электронной корреспонденции, зачастую без факса не обойтись.
Факс имеет большую юридическую силу, чем полученный e-mail.

Я так понимаю, что сервис именно отправляет на e-mail. На сколько это востребовано?

+1 востребовано!

--
www.it-sfera.com.ua
Terrasoft Solution Partner

"Карло Сергей" написал:Я так понимаю, что сервис именно отправляет на e-mail.

Да Именно. Итак Кому нибудь Требуется? Ещё Раз МОГУ ПРЕДОСТАВИТЬ УСЛУГУ 'ФАКС на ЕМАЙЛ' сроком на 2 месяца БЕСПЛАТНО.

Пока что востребовано...
порядка 40% контрагентов в нашей компании до сих пор пользуются факсом...
Но не единым неумением пользоваться имейлами живут факсы.
Как говорилось ранее

"Владимир Соколов" написал:Факс имеет большую юридическую силу, чем полученный e-mail.

не смотря на то что есть умельцы), которые в случае срочной надобности смогут любой документ подать в факсимильном виде.
К примеру приглашение на конференцию от зарубежного партнёра, для получения бизнес-визы...
Посольства принимают только оригиналы и факсимильные документы с номером и именем факса отправителя)
Наверно предполагают что факс подделать сложнее)

Сегодня как раз обсуждали этот вопрос.

В нашей компании уже и не помним, когда отправляли/получали последний факс. Вполне устраивают скан-копии документов.

Но уверен, что бОльшая часть фирм пока еще не представляют себе жизни без факса.

www.informicus.ru

Показать все комментарии

В продолжение темы http://community.terrasoft.ua/node/2743, об автоматизации отправки факсов из Terrasoft CRM.

К сожалению, WinFax не оправдал мои ожидания, в связи с нестабильностью работы.
Мы нашли альтернативу - ActFax http://www.actfax.com/en/ - работает намного стабильней.

К сожалению, не имеет привычного COM интерфейса - но имеет возможности интеграции с другими приложения http://www.actfax.com/en/installation.html#datafield

Вариантов реализации задачи отправки факсов много.
Приведу алгоритм того варианта, который я посчитал наиболее удобным, по причине:
- простоты;
- возможности отправки любых типов документов, используя установленное ПО ассоциированное с типом документа (MS Office, Adobe Reader и др.);

Итак:
1. Копируем необходимый для отправки файл во временную папку, включая в имя файла атрибуты (datafield) необходимые для отправки факса (номер телефона, тему, приоритет и др.). Атрибуты описаны в файле справки к приложению;
2. Запоминаем, какой принтер сейчас установлен по умолчанию;
3. Устанавливаем виртуальный принтер "ActFax" активным по умолчанию;
4. Отправляем файл на печать, используя ShellExecute. При желании, наслаждаемся видом предварительного просмотра факса в окне приложения;
5. Восстанавливаем принтер по умолчанию.

Удачи!

Нравится

Поделиться

3 комментария

Евгений!

Уверен что эта информация очень полезна для многих пользователей Community. Не могли бы Вы привести небольшой прмер кода, который делает все описаное?

"Карло Сергей" написал:Не могли бы Вы привести небольшой прмер кода, который делает все описаное?

По многочисленным просьбам, привожу ... :)

Примечание: необходимо установить DynamicWrapper (http://community.terrasoft.com.ua/node/2402), т.к., к сожалению, не удалось обойтись без него в реализации ф-ции SetDefaultPrinter. Если кто-нибудь предложит еще рабочий вариант - буду безмерно благодарен. В примере есть еще 2 - не рабочих.

// Use: scr_FileUtils
 
function GetActFaxDataField(Name, Value) {
	if (IsEmptyValue(Value)) {
		return '';
	}
	return '@F' + Name + Value + '@';
}
 
function GetActFaxDataFields(Number, To, Subject) {
	return GetActFaxDataField('211', Number) +
		GetActFaxDataField('201', To) +		
		GetActFaxDataField('307', Subject) +
		GetActFaxDataField('501', 2);
}
 
function SetDefaultPrinter(PrinterName) {
	var WinApi = new ActiveXObject('DynamicWrapper');
	WinApi.Register('winspool.drv', 'SetDefaultPrinter', 'i=s', 'f=s', 'r=l');
	WinApi.SetDefaultPrinter(PrinterName);
// 1.
//	var WshShell = new ActiveXObject('WScript.Shell');	
//	var RegPathWinNT = 
//		"HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\Device";		
//	WshShell.RegWrite(RegPathWinNT, PrinterName);	
 
// 2.
//	var WshNetwork = new ActiveXObject('WScript.Network');
//	WshNetwork.SetDefaultPrinter(PrinterName);	
}
 
function GetDefaultPrinter() {
	var RegPathWinNT = 
		"HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\Device";		
	var WshShell = new ActiveXObject('WScript.Shell');	
	var DefaultPrinter = WshShell.RegRead(RegPathWinNT);
	var CommaIndex = DefaultPrinter.indexOf(',');
	if (CommaIndex > 1) {
		DefaultPrinter = DefaultPrinter.substr(0, CommaIndex);
	}
	return DefaultPrinter;
}
 
function SendActFaxFromFile(Number, FileName, To, Subject) {
	if (IsEmptyValue(Number)) {
		return false;
	}
	if (IsEmptyValue(FileName)) {
		return false;
	}	
    if (!CheckFileExists(FileName)) {
    	return false;
	}
 
	// Получение параметров для отправки факса
	var DataFields = GetActFaxDataFields(Number, To, Subject);
 
	// Копирование файла во временную папку
	// В название включаются параметры для отправки факса
	var FileSystemObject = GetFileSystemObject();
	var FileBaseName = FileSystemObject.GetBaseName(FileName);
	var FileExtensionName = FileSystemObject.GetExtensionName(FileName);		
	var ParamFileName = System.GetTempFileName(FileBaseName + DataFields, 
		FileExtensionName);
	FileSystemObject.CopyFile(FileName, ParamFileName);		
 
	var DefaultPrinter = GetDefaultPrinter();
	SetDefaultPrinter('ActiveFax');	
	try {
	  	var Shell = new ActiveXObject('Shell.Application');			           
		Shell.ShellExecute(ParamFileName, '', '', 'print', 0);
		System.Sleep(100);
	} finally {
		SetDefaultPrinter(DefaultPrinter);
	}
 
	// TODO: Удалять временный файл после отправки
	// FileSystemObject.DeleteFile(ParamFileName, true);	
}

Евгений, а как можно не показывать само окно отправки факса (с его параметрами), которое показывает сам ActFax?

Показать все комментарии

Пример модуля с функцией отправки факсов, используя приложение от Symantec - WinFax.
Обратите внимание, что версия WinFax должна быть не ниже 10.0.4 если Вы планируете его устанавливать на XP SP2 и выше. Также рекомендую использовать только лицензионный софт.

В самом простом варианте:
SendFax('258', 'c:\\test.doc'), где '258' - номер телефона, 'c:\\test.doc' имя файла Word, который Вы хотите отправить.
В данном случае на локальной машине должен быть установлен Word (хотя возможно можно отправлять файлы и другого формата - проверьте!).

Удачи!

//-----------------------------------------------------------------------------
// scr_WinFaxUtils
// Uses: scr_FileUtils
//-----------------------------------------------------------------------------

var ErrorSendFaxText = "Ошибка отправки факса. ";
var SDKSend;

function CheckError(Result) {
        if (Result == 1) {
                Log.Write(2, ErrorSendFaxText + " Код ошибки: " + SDKSend.GetLastError())             
        }
}

function SendFax(Number, FileName, To, Company, Subject) {
        if (IsEmptyStr(Number)) {
                Log.Write(2, ErrorSendFaxText + "Номер не указан.");
                return false;
        }
        if (IsEmptyStr(FileName)) {
                Log.Write(2, ErrorSendFaxText + "Имя файла не указано.");
                return false;
        }
    if (!CheckFileExists(FileName)) {
                Log.Write(2, ErrorSendFaxText + "Файл '" + FileName + "' не найден.");    
        return false;
        }      
       
        SDKSend = new ActiveXObject('WinFax.SDKSend');
        // Set some properties to avoid WinFax to Show on the Screen.
        CheckError(SDKSend.EnableBillingCodeKeywords(0));
        CheckError(SDKSend.SetUseCreditCard(0));
        CheckError(SDKSend.ShowSendScreen(0));
        CheckError(SDKSend.SetQuickCover(0));
        CheckError(SDKSend.SetPreviewFax(0));
        // Not use cover       
        CheckError(SDKSend.SetUseCover(0));
        // Make sure WinFax shows it monitor window while sending the Fax.
        CheckError(SDKSend.ShowCallProgess(0));
        // Leave the Controller Running after procesing this fax.
        CheckError(SDKSend.LeaveRunning());
        // Check that the WinFax Printer is ready.
        if (SDKSend.IsReadyToPrint() != 1) {
                Log.Write(2, ErrorSendFaxText + "WinFax не готов к отправке.");
                return;
        }
        // Setup the Recipient information here.
        CheckError(SDKSend.SetTo(To));
        CheckError(SDKSend.SetSubject(Subject));
        CheckError(SDKSend.SetNumber(Number));
        CheckError(SDKSend.SetAreaCode(''));
        CheckError(SDKSend.SetCompany(Company));
        // Finish the WinFax Setup Commands.
        CheckError(SDKSend.AddRecipient());
        CheckError(SDKSend.AddAttachmentFile(FileName));
        CheckError(CheckError(SDKSend.Send(1)));
        SDKSend.Done();
        SDKSend = null;
    return true;
}

Нравится

Поделиться

0 комментариев
Показать все комментарии