Здравствуйте.
Где и как можно настроить уведомление о новых сообщениях. Сообщения приходят, но в боковой панели не показывается уведомление. Возможно ли настройка уведомления?
Спасибо

Нравится

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

Здравствуйте!
Следует проверить доступ Вашего пользователя или роли, в которую он входит к объектам - "Уведомление", "Уведомление ленты" (раздел Администрирование: Доступ к объектам).
Также просьба уточнить название и версию Вашего продукта.

"Зарицкий Олег Васильевич" написал:

Здравствуйте!

Следует проверить доступ Вашего пользователя или роли, в которую он входит к объектам - "Уведомление", "Уведомление ленты" (раздел Администрирование: Доступ к объектам).

Также просьба уточнить название и версию Вашего продукта.

Здравствуйте.
bpm'online sales enterprise 7.6
Когда открываешь боковую панель с письмами, там показываются новые сообщения. Однако, уведомление о том, что пришло новое письмо или же изменения в ленте не показывается. Допустим, как приходит уведомление о новой визе или же обычные уведомления.
Спасибо.

Здравствуйте!

На коммуникационной панели стоит разделять "Лента" и "Уведомления".
В Ленте отображается сообщения раздела ЛЕНТА (например, другой пользователь оставил Вам комментарий или "лайкнул" существующий, созданный Вами)
В Уведомлениях отображается системная информация (например - Импортированы новые записи),
напоминания по активностям. Уведомления о новом входящем письме не приходят, т.к. достаточно открыть рядом стоящую панель "Email".
Более детальную информацию Вы можете найти в документации.
http://academy.terrasoft.ru/documents/docs/product/bpm'online%20sales/e…?

Добрый день!
Возобновлю тему.
Подскажите, как при создании визы по БП сделать так, чтобы сразу появлялись и исчезали уведомления.?

Здравствуйте!

Вам необходимо сразу после создания визы запускать процесс "Получить количество уведомлений". Точно также нужно сделать поле визирования.

Алексей, а с какими параметрами нужно запускать этот процесс?

Александр, в процесс необходимо передать параметры, которые есть у процесса. В процессе параметров нет, соответственно, туда ничего передавать не надо.
Элемент "Задание-сценарий" определяет userConnection пользователя, который инициировал процесс.

Алексей, спасибо. Все работает.

А почему может быть такое, что уведомление появляется (если открыть и посмотреть панель), но красной цифры на иконке не появляется?

Здравствуйте, Владимир!

"Владимир Соколов" написал:

А почему может быть такое, что уведомление появляется (если открыть и посмотреть панель), но красной цифры на иконке не появляется?

Уточните, пожалуйста, версию, на которой наблюдается такое поведение.

Задаю поля в Add Data (для Notification): To = ответственный, Title, Time = current date/time, Object = Document, Source = Owner, Unique caption Id = Record Id (из сигнала)
После этого запускаю Get number of reminders

В итоге само уведомление есть, а красная цифра не загорается.
Версия omnichannel English 7.6.0.938

Здравствуйте, Владимир!

Это зависит от часовых поясов на сервере, в профиле пользователя и на локальной машине пользователя. В версии 7.7.0. данное поведение поправили. Попробуйте убрать в профиле пользователя значение в поле "Часовой пояс".

"Демьяник Алексей" написал:Это зависит от часовых поясов на сервере, в профиле пользователя и на локальной машине пользователя. В версии 7.7.0. данное поведение поправили. Попробуйте убрать в профиле пользователя значение в поле "Часовой пояс".

Проверил в 7.10 - то же самое... Может, что-то забыл указать при создании Notification?

Владимир, здравствуйте!

В версии 7.10 система показывает, что появились новые сообщения без доработок.

Что касается уведомлений, то необходимо проверить подключения по websocket. Также для корректного получения уведомлений, при создании уведомления необходимо заполнять следующие поля:

  • NotificationType
  • Время
  • Заголовок
  • Кому
  • Объект
  • Уникальный идентификатор заголовка

Здравствуйте, подскажите , пожалуйста: пользователь создает активность на другого человека: указывает все необходимые параметры (тип уведомления, время начала , завершения, заголовок, кому, объект), но уведомление не отображается на боковой панели другого пользователя, хотя в активности время напоминания ответственному указано. Часовые пояса у пользователей не указаны. Уведомления то приходят ,то нет (в основном нет). В чем может быть проблема?

Медведева Анастасия Дмитриевна,

Данное поведение может быть вызвано следующими причинами:

1. Сначала была установлена галочка "Напоминать автору" и сохранена активность, а уже после этого установлено время напоминания;

2. У Вас часовой пояс в профиле пользователя не совпадает с часовым поясом на ПК. 

3. У Вас не установлен Формат даты и времени.

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

Здравствуйте! При внесении каких-либо изменений в контрагенте или контакте, в частности, при добавлении(изменении) комментария на детали «Описание» хотелось бы настроить автоматическое отправление ответственному за этого контрагента или контакта уведомления об этом. Уведомление желательно как внутреннее, так и внешнее - на почту. Можно ли это сделать? И какой порядок действий, если можно?

Нравится

1 комментарий

Добрый день, Александр!
Необхрдимо привязать обработчик на событие OnDatasetAfterPost невизуального элемента dlData d сервисе Common\Details\Description\wnd_Description

Для этого откройте указанный сервис, перейдите к его невизуальным элементам, сфокусируйтесь на dlData. Ниже выберите закладку "События", найдите и встаньте на OnDatasetAfterPost. Оно по умолчанию не задано. Встаньте в поле Значение события (Value) и сделайте двойной клик. В результате этого действия Вы перейдете в сервису Common\Details\Description\wnd_DescriptionScript в котором каретка курсора уже будет стоять в новом обработчикие события:

function dlDataOnDatasetAfterPost(Dataset) {
	//TODO
}

Здесь реализуйте логику отправки уведомления сообщения.
Например: если нужно отправлять оповещения только в случае изменения описания добавьте условие:

var ParentWindow = Self.ParentContainer.ParentWindow;
if (ExtractUSICodeEx(ParentWindow.USI) == "wnd_AccountsWorkspace") {
	//TODO
}

Получить ID Контрагента и Ответственного можно из датасета

var AccountDataset = ParentWindow.ComponentsByName('dlAccounts').Dataset;

Отправить сообщение ответсвенному можно воспользовавшись базовой функцией SendEmail(Params) из сервиса Common\Library\scr_MailUtils (не забудьте его подключить к wnd_DescriptionScript).

Пример использования SendEmail:

	SendEmail({Address: 'support@tscrm.com', 
		Subject: "Запрос в службу поддержки Terrasoft",
		BodyFormat: 1, Body: "Hello!"});

Создать напоминание можно следующим образом:

	var RemindingDataset = GetSingleItemByCode('ds_Reminding');
	RemindingDataset.Append();
	RemindingDataset.ValAsGUID('ID') = Connector.GenGUID();
	RemindingDataset.Values('SubjectID') = AccountDataset.ValAsGUID('ID');
	RemindingDataset.Values('SubjectTypeID') = rst_Account; // берется из Common\Dictionaries\Reminding\enm_RemindingSubjectType
	RemindingDataset.Values('Description') = 'Напоминание по Контрагенту.'
	RemindingDataset.Values('RemindTime') = new Date().getVarDate();
	RemindingDataset.Values('ContactID') =  Connector.CurrentUser.ContactID;
	RemindingDataset.Post();
	RemindingDataset.Close();
Показать все комментарии

Добрый день!
Есть бизнес-процесс, в ходе которого создаются когда последовательно, когда параллельно
ряд задач.
Необходимо после создания каждой задачи, а также после ее выполнения посылать
e-mail уведомления ответственному и автору.

Как решить эту задачу, используя блок "Отправка E-mail" в бизнес-процессе.
В частности, какие параметры нужно указать в самом блоке,
и где, в какой момент заполнять параметры "ответственный", "автор" - кому отправить
и id задачи, по которой нужно отправить информацию?

Спасибо.

Нравится

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

Здравствуйте, Дарья.

Отправил ответ Вам на e-mail.

"Олейник Дмитрий" написал:

Отправил ответ Вам на e-mail.

С уважением,
Олейник Дмитрий
Эксперт 3-й линии поддержки


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

В качестве решения предлагается использовать SendEmailByTemplate из scr_MailUtils:

Отправлять примерно так:

var AddressList = [];
var OwnerID = Dataset.Values('OwnerID');
GetMailAddressesByContactID(OwnerID, AddressList);
var TemplateID = GetSystemParameterValueEx('IncidentEmailByContactTemplateID');
if (IsEmptyGUID(TemplateID)) {
   return;
}
var ID = Dataset('ID');
SendEmailByTemplate(TemplateID, {RecordID: ID, Address: AddressList,
    Silent: true, AutoSend: true});
Показать все комментарии

Только начинаем осваивать и внедрять BPMOnline Service Desk.
Сразу появился ряд вопросов, написал в support, но хочу еще тут спросить.

1. Как можно реализовать рассылку email-уведомлений если изменяется определенные свойства у обращений.
т.е. нужно прислать письмо ответственному если у него появилось новая задача, или был добавлен комментарий к задаче и тп, а автора необходимо уведомлять например о смене статуса задачи.

Было бы вообще супер, если такое сделать вне активностей, чтобы не засорять их такими сообщениями

2. Не могу найти скрипт(бизнес процесс) создания email при синхронизации с почтой. необходимо привязывать ответ на email из 1. к уже созданным запросам.

Нравится

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

Здравствуйте, Антон!

"Антон Шумахер" написал:1. Как можно реализовать рассылку email-уведомлений если изменяется определенные свойства у обращений.
т.е. нужно прислать письмо ответственному если у него появилось новая задача, или был добавлен комментарий к задаче и тп, а автора необходимо уведомлять например о смене статуса задачи.

Было бы вообще супер, если такое сделать вне активностей, чтобы не засорять их такими сообщениями

Настроить отправку почты можно как при помощи активностей, так и без них. Для отправки сообщения следует доработать процесс карточки - необходимо добавить событийный подпроцесс на нажатие кнопки Ok (либо доработать его), проводить в нем вычитку необходимых параметров, и передавать из в элемент процесса типа UserTask. К элементу следует привязать системный процесс SendEmailUserTask.

2. Не могу найти скрипт(бизнес процесс) создания email при синхронизации с почтой. необходимо привязывать ответ на email из 1. к уже созданным запросам.

Создание активности делается в конфигурации, в source code схеме ImapClient. Метод называется SaveAsActivity

Добрый день.
а можете прислать абсолютно любой пример части процесса, где происходит отслеживание определенных свойств объекта после его сохранения?
Заранее спасибо.

Антон, уточните, пожалуйста, свойства какого объекта Вам нужно отслеживать?

Допустим объект "Запрос на обслуживание", отслеживаемые свойства "Состояние" и "Срок разрешения"

Благодарю за уточнение. В данном случае это не свойства, а значения полей. Отслеживать мы их будем в событийном подпроцессе.

Для того, чтобы это сделать, следует в создать обработчик события изменения значения поля в объекте либо поля в карточке:

eventsubprocess

По нажатию на кнопку Вы автоматически перейдете в процесс карточки. В скрипте можно написать обработчик.

subprocessscript

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

В конфигурации отправка описана в скрипте scr_TaskUtils в функции function SendTaskEmailToContact(TaskDataset, AddressList)

Таким образом, Вам необходимо доработать функцию следующим образом:

function SendTaskEmailToContact(TaskDataset, AddressList) {
         if (GetDatasetFieldValue(TaskDataset, 'CycleTaskParamID')) {
                   var TemplateID = GetSystemParameterValueEx('CycleTaskEmailByContactTemplateID');
         } else {
                   var TemplateID = GetSystemParameterValueEx('TaskEmailByContactTemplateID');
         }
         if (IsEmptyGUID(TemplateID)) {
                   ShowErrorDialog(FormatStr(SystemParameterIsEmptyError,
                            'TaskEmailByContactTemplateID'));
                   return;
         }
         var ID = TaskDataset.Values('ID');
                   
         var FileName = System.CreateObject('TSObjectLibrary.Value'); //создаем объект файл
         FileName.Value = 'C:\\Test.rtf'                                             //определяем путь хранения временного файла
         TaskDataset.DataFields('Description').SaveToFile(FileName.Value);  //сохраняем описание в файл
         var Attachments = new Array(FileName.Value);                           //определяем, что данный файл будет аттачем
         
         var Service = Services.GetSingleItemByUSI('scr_MailUtils');
         Service.ScriptControl.CodeObject.SendEmailByTemplate(TemplateID,
                   {RecordID: ID, Address: AddressList, AutoSend: true,
                   SkipQueryAddresses: true, Attachments: Attachments}); //в этой строке добавлены аттачи
}

Обратите внимание, по умолчанию в датасете задачи нет поля Description, хотя описание хранится в таблице задач. Для корректной работы скрипта его необходимо добавить в запрос и датасет:

1. Откройте sq_Task и добавьте новую колонку Description:

img125
img126

Сохраните и закройте запрос.

2. Откройте датасет ds_Task и добавьте в него колонку типа большой бинарный объект:

img127
img128

Сохраните и закройте датасет.

3. Откройте scr_TaskUtils и внесите изменения в функцию отправки письма. Перезапустите клиент. Результат будет выглядеть следующим образом:

img129

Нравится

Поделиться

1 комментарий

о, спасибо :biggrin:

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

Здравствуйте!

У меня такая проблема. Мне необходимо осуществить передачу оповещения определеенным лицам, после того как завершится определенная "Задача" в бизнес-процессе. Я знаю кому я буду отправлять оповещения. Я думаю это осуществить с помощью почты. Например, завершилась опеределенная задача в БП и генеральному директору пришло письмо, что такая-та задача завершена.

Как я предполагаю это сделать. В "События" OnAfterExecute, прописать функцию которая будет вызывать шаблон письма. Но письмо не будет отправляется автоматически.
Что вы можете посоветовать?

Нравится

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

Посмотрите вот этот пост.

Спасибо, изучаю.

Благодарю за ссылку.

Но не могу понять при выполнении функции выдает такую ошибку:
"UserName"-определение отсутствует.

//-----------------------------------------------------------------------------
// scr_Script
//-----------------------------------------------------------------------------     
function Main(){
        var FilePath = "C:\Doc\Contract";
        var Attachments = new Array(FilePath);
        SendEmailUsingCDO('yandex.ru', 'floxy8@yandex.ru',
                'floxy8@yandex.ru', 'Test CDO Message send', 'Hello. I"m here',Attachments);
}
function SendEmailUsingCDO(SMTPServer, SendTo, SendCC, SendFrom, Subject, Body, Attachments, SMTPUserName, SMTPUserPassword, SMTPUseSSL) {
			var Result = true;
	        try {
	        	var cdoMessage = new ActiveXObject("CDO.Message");
                var cdoConfig = new ActiveXObject("CDO.Configuration");
                var cdoFields = cdoConfig.Fields;
                cdoFields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2;
                cdoFields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = SMTPServer;
                cdoFields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 10;
                var cdoAnonymous = 0; // Do not authenticate
                var cdoBasic = 1; // basic (clear-text) authentication
                var cdoNTLM = 2; // NTLM
                // Если указан логин и пароль, то нужна авторизация на SMTP-сервере           
                if (!IsEmptyValue(UserName) && !IsUndefined(UserName) &&
                        !IsEmptyValue(UserPassword) && !IsUndefined(UserName)) {
                        UseSSL = (UseSSL? UseSSL : false);
// Type of authentication, NONE, Basic (Base64 encoded), NTLM
                        cdoFields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoBasic;
                        // Your UserID on the SMTP server
                        cdoFields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = UserName;
                        // Your password on the SMTP server
                        cdoFields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = UserPassword;
                        // Server port (typically 25)
                        cdoFields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25;
                        // Use SSL for the connection (False or True)
                        cdoFields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = UseSSL;
                }
                cdoFields.Update();
                cdoMessage.Configuration = cdoConfig;
                var cdoBodyPart = cdoMessage.BodyPart;
                cdoBodyPart.ContentTransferEncoding = "8bit";
                cdoMessage.To = SendTo;
                cdoMessage.From = SendFrom;
                cdoMessage.Subject = Subject;
                cdoMessage.TextBody = Body;
                if (Assigned(Attachments)) {
                        for (var i = 0; i < Attachments.length; i++) {
                                cdoMessage.AddAttachment(Attachments[i]);
                        }
                }
                cdoMessage.send();
        } catch (e) {
                var Message = FormatStr("Возникла ошибка при формировании и отсылке письма через Outlook:\r%1"+
                        "\rВозможно, на компьютере не установлен MS Outlook. Обратитесь за помощью к администратору.",
                        e.message);
                ShowWarningDialog(Message);
                Result = false;
        } finally {
                return Result;
        }
}

В скрипт SendEmailUsingCDO добавила передачу параметров SMTP-сервера для авторизации под пользователем:
- Имя пользователя
- Пароль
- Поддержка SSL

Порт вроде проставлен по умолчанию 25.

Подскажите в чем моя ошибка, благодарю заранее.

Здравствуйте,
Посмотрите пожалуйста на сигнатуру функции
в посте http://www.community.terrasoft.ua/forum/topic/5597#comment-24189

function SendEmailUsingCDO(SMTPServer, SendTo, SendCC, SendFrom, Subject, Body, Attachments, UserName, UserPassword, UseSSL)

у вас же

function SendEmailUsingCDO(SMTPServer, SendTo, SendCC, SendFrom, Subject, Body, Attachments, SMTPUserName, SMTPUserPassword, SMTPUseSSL)

Предлагаю вам в коде поменять UserName на SMTPUserName

Поменяла в коде UserName на SMTPUserName.

Но возникает ошибка. Скриншот с ошибкой выложила.
Дело в том, что интеграция настроена. Тип параметра SMTP для yandex, установлен. Может проблема в том, что когда происходит интеграция outlook с terrasoft, необхождимо вести пароль входа в terrasoft....

"Капустина Валентина" написал:Но возникает ошибка.

Ошибка переводиться как: Транспорту не удалось подключиться к серверу.

"Капустина Валентина" написал:Может проблема в том, что когда происходит интеграция outlook с terrasoft, необхождимо вести пароль входа в terrasoft

Для работы этой функциональности вообще не нужна интеграция ТС с Outlook.

"Кошкаров Андрей" написал:Поменяла в коде UserName на SMTPUserName.

Обратите внимание, что нужно вернуть правильное название и для других параметров.
Также в приведенном вами коде вы пропустили параметр SendFrom при вызове функции.

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

Попробуйте написать

var FilePath = "C:\\Doc\\Contract";

Ошибка:"The system cannot find the path specified" - Система не может найти указанный путь.
Думала что-то связано с SendEmailUsingCDO, но там указано все правильно.
Может я чего-то не замечаю.

Валентина, попробуйте прописать в FilePath путь к конкретному файлу который вы хотите прикрепить к письму

Пример:

var FilePath = "C:\\Doc\\Contract\\test.txt"

"Яворский Алексей" написал:

Валентина, попробуйте прописать в FilePath путь к конкретному файлу который вы хотите прикрепить к письму

Пример:

var FilePath = "C:\\Doc\\Contract\\test.txt"


Да я это тоже пробовала. Но возникает ошибка: "the transport failed to connect to the server"
"Кошкаров Андрей" написал:

Ошибка переводиться как: Транспорту не удалось подключиться к серверу.

Обратите внимание, что нужно вернуть правильное название и для других параметров.

Также в приведенном вами коде вы пропустили параметр SendFrom при вызове функции.


Все параметры пересмотрела и исправила, указала параметр SendFrom при вызове функции. Но ошибка так и не исчезла.

Валентина, проделал все действия, описанные в http://www.community.terrasoft.ua/forum/topic/5597#comment-24189 тестировал на аккаунте gmail. Привожу пример вызова в случае smtp настроек google:

        var FilePath = "C:\\tst\\tst.txt";
        var Attachments = new Array(FilePath);                
SendEmailUsingCDO('smtp.gmail.com', 'a.yavorskiy@terrasoft.ru','a.yavorskiy@terrasoft.ru', 'alexyavorskiybpm@gmail.com', 'Test CDO Message send', 'Hello. I"m here', Attachments,
'alexyavorskiybpm@gmail.com','mypassword',true);

У меня никаких проблем не возникло

В вашем скрипте scr_Script не увидел явного ввода логина и пароля на smtp сервер.
В моем примере UseSSL = true так как gmail использует SSL

Яворский Алексей
Спасибо, большое за помощь, получилось!:)

Еще раз обращаюсь за помощью, т.к. мне необходимо функцию отправки письма активировать, после того как завершится задача в бизнес-процессе. Задаче "Action2" определила событие OnBeforeExecute, но при запуске бизнес-процесса и после завершения задачи не возникает никаких ошибок и не отправляется письмо. Подскажите, пожалуйста, что я не учла.

function Action2OnBeforeExecute(ActionItem) {
function Main(){
		var FilePath = "C:\\e\\e.txt";
      	var Attachments = new Array(FilePath); 
        SendEmailUsingCDO('....')
....
}
}

Валентина, почему бы не выполнять данные действия на событие OnAfterExecute, так как в варианте OnBeforeExecute вы определяете событие до выполнение действия Задача.
В вашем коде вы внутри Action2OnBeforeExecute определяете функцию Main(), при этом ее не вызывая, предлагаю переписать ваш скрипт следующим образом:

function Action2OnAfterExecute(ActionItem) {
                var FilePath = "C:\\e\\e.txt";
        var Attachments = new Array(FilePath);
        SendEmailUsingCDO('....')
....
}

т.е я бы определил действие OnAfterExecute для Action2 и написал бы код, указанный выше

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

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

Поэтому было принято решение о рассылке уведомлений при поступлении оплаты по счету. Собственно, механизм следующий: если у счета меняется статус оплаты на "Оплачен" или "Оплачен частично", то отсылается уведомление. Уведомление отсылается либо ответственному по сделку, если счет прицеплен к сделке, либо ответственному по счету. Отсылка сделана по образу и подобию уведомлений, которые отсылаются при создании Задачи.

В скрипт wnd_InvoiceEditScript в функцию wnd_InvoiceEditOnPrepare в самый конец добавил строчку одну строку. Теперь эта функция выглядит вот так:

function wnd_InvoiceEditOnPrepare(Window) {

        Initialize(Window);
        wnd_BaseDBEditOnPrepare(Window);
/* MODULE WORKFLOW */
        var RequestFromWorkflow = false;
/* ENDMODULE WORKFLOW */
        InvoiceEdit.IsCompleting = false;
/* MODULE WORKFLOW */
        var DefaultValues = GetAttribute(Window, 'DefaultValues');
        var Dataset = BaseDBEdit.Dataset;
        if (Assigned(DefaultValues)) {
                // Post WorkflowItemID anyway because for this Invoice new
                // workflow item was created
                var NewWorkflowItemID = DefaultValues('WorkflowItemID');
                var RequestFromWorkflow = (!IsEmptyValue(NewWorkflowItemID));
                if ((RequestFromWorkflow) &&
                        (Dataset.Values('WorkflowItemID') != NewWorkflowItemID)) {
                        Dataset.Values('WorkflowItemID') = NewWorkflowItemID;
                        if (Dataset.State == dstEdit) {
                                Dataset.Post();
                                Dataset.Edit();
                        }
                }
        }
        if (RequestFromWorkflow && (Dataset.State == dstInsert)) {
                InvoiceEdit.CanCancel = false;
                dlData.Dataset.Values('BillStatusID') = null;
        } else {
                InvoiceEdit.CanCancel = true;
        }
        btnCancel.IsEnabled = InvoiceEdit.CanCancel;
/* ENDMODULE WORKFLOW */
        EnableNumberEdit();
    InvoiceEdit.BillStatusID = Dataset('BillStatusID');
}

Также были внесены изменения в функцию btnOKOnClick:

function btnOKOnClick(Control) {
        var Dataset = dlData.Dataset;
        var DefaultValues = GetAttribute(Self, 'DefaultValues');
/* MODULE WORKFLOW */
        var WorkflowItemID = Dataset.ValAsStr('WorkflowItemID');
/* ENDMODULE WORKFLOW */
        InvoiceEdit.IsCompleting = true;
        if (CheckItemNumberDuplicate('Invoice', Dataset, 'InvoiceNumber')){
                scr_BaseDBEdit.btnOKOnClick(Control);
        }
        Dataset.Open();
        var BillStatusID = Dataset('BillStatusID');
        if (!(InvoiceEdit.BillStatusID == BillStatusID)){
                if ((BillStatusID == GetInvoicePaidStatus())||
                        (BillStatusID == GetInvoicePartialPaidStatus())) {
                        var OpportunityID = Dataset('OpportunityID');
                        if (!IsEmptyGUID(OpportunityID)){
                                var ContactID = GetDatasetFieldValueByID('ds_Opportunity',OpportunityID,'OwnerID');
                        }else{
                            var ContactID = Dataset('OwnerID');
                        }
                        ProcessSendInvoiceEmailByContactID(Dataset, ContactID);
                }
        }
/* MODULE WORKFLOW */
        if (Self.IsVisible) {
                return;
        }
        ProcessWorkflowItem(WorkflowItemID);
/* ENDMODULE WORKFLOW */
}

Затем в скрипт scr_InvoiceUtils после строки
var InvoiceUtils = new Object();

была добавлена вот эта строка:
InvoiceUtils.PartialPaidStatusCode = 'PartialPaid';

А также был добавлен ряд функций:
function GetInvoicePartialPaidStatus() {
        if (IsEmptyGUID(InvoiceUtils.PaidStatusID)) {
                GetInvoiceStatusIDs();
        }
        return InvoiceUtils.PartialPaidStatusID;
}

function GetInvoiceNotifyMessageHTMLBody(Dataset) {
        var DataFields = Dataset.DataFields;
        var HTMLBody = '
\n'
;
        HTMLBody = HTMLBody + 'Вы получили данное уведомление об оплате счета, так как являетесь ответственным лицом.\n
'
;
        HTMLBody = HTMLBody + GetDatasetFieldHTMLView(DataFields.ItemsByName('InvoiceNumber')) + ' от ' + Dataset.ValAsStr('InvoiceDate') + '\n';
        HTMLBody = HTMLBody + '
\n'
;
        HTMLBody = HTMLBody + GetDatasetFieldHTMLView(DataFields.ItemsByName('OpportunityID')) + '\n';
        HTMLBody = HTMLBody + '
\n'
;
    HTMLBody = HTMLBody + '' + DataFields.ItemsByName('BasicAmount').Caption + ': ' + Dataset.ValAsStr('BasicAmount') + '\n';
        HTMLBody = HTMLBody + '
\n'
;
        HTMLBody = HTMLBody + GetDatasetFieldHTMLView(DataFields.ItemsByName('CustomerID')) + '\n';
        HTMLBody = HTMLBody + '
\n'
;
        HTMLBody = HTMLBody + GetDatasetFieldHTMLView(DataFields.ItemsByName('SupplierID')) + '\n';
        HTMLBody = HTMLBody + '

\n'
;
        HTMLBody = HTMLBody + GetDatasetFieldHTMLView(DataFields.ItemsByName('BillStatusID')) + '\n';
        HTMLBody = HTMLBody + '
\n'
;
    HTMLBody = HTMLBody + '' + DataFields.ItemsByName('PaymentAmount').Caption + ': ' + Dataset.ValAsStr('PaymentAmount') + '\n';
        HTMLBody = HTMLBody + '        ';
        HTMLBody = HTMLBody + GetDatasetFieldHTMLView(DataFields.ItemsByName('PaymentDate')) + '\n';
        HTMLBody = HTMLBody + '

\n'
;
        HTMLBody = HTMLBody + '\n';
        HTMLBody = HTMLBody + GetDatasetFieldHTMLView(DataFields.ItemsByName('ID')) + '\n';
        HTMLBody = HTMLBody + '

Нравится

Поделиться

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

Хороший вариант решения.

А мы - просто автоматически добавляем напоминания (оплачен или частично оплачен - ответственному за счет; счет готов к отгрузке товара со склада - ответственному за склад и т.д.)

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

Тоже вариант, но у меня например, всегда висит окошко с кучкой напоминаний и не всегда видно, если что-то появляется свежее. А почтовый клиент сразу начинает моргать в трее.

Может быть создать динамическую папку, "счета, оплаченные сегодня(вчера, за последнюю неделю)"? Можно добавить соответствующее поле И (что-то типа - ознакомлен, не отработано и т.д.) С созданием соответствующих фильтров есс-но?

Динамические группы и так сделаны, правда без разбивки по времени, просто по статусу оплаты. Однако это тоже работает только когда сам заглядываешь в Террасофт. А уже создание дополнительных полей "Ознакомлен, не ознакомлен" это еще сложение. Кто будет менять значение этого поля? Лишний раз редактировать карточку.

Уведомление по почте легче и нагляднее. В идеале вообще было бы хорошо получить возможность настройки уведомления по почте на любое событие в системе... А это мысль, кстати! Надо будет подумать над возможной реализацией. :)

Коллеги,
все зависит от регламентов работы менеджеров и их заинтересованности.
1) Поддерживаю динамические группы как инструмент. Любой уважающий себя менеджер начинает работу с просмотра оплат. Таким образом он открывает раздел и знает куда ему бежать.

2) Если менеджер пергружен или его он немотивирован на оплату счетов :) ( что вряд ли), тогда в помощь ему напоминания:
а) напоминания в Terrasoft - для всех пользователей системы,
б) если надо информировать и других сотрудников, то эффективнее e-mail рассылки.

Good luck in the life!

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

Почта - это личная напоминаловка по каждому событию.
Она пинает менеджера, что было событие, на которое надо обратить внимание.

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

Я бы сделал и то, и другое. Но начинал все же с динамических групп.

Good luck in the life!

"a.shekhovtsov" написал:Я бы сделал и то, и другое. Но начинал все же с динамических групп.

Совершенно согласен. У нас было сделано точно также. Просто когда просмотр состояния начинает занимать слишком много времени, стоит подключить напоминания.

У нас упор сделан на оперативность работы. За состоянием счета следят постоянно, а не как у большинства компаний - "У нас выписки снимают только два раза в день и все". В таком случае менеджер может знать, что информация об оплате может появится только в четко оговоренное время. Это как бы работа по таймеру.
А у нас ближе к событийной системе. :) Не сидеть же менеджеру и через каждые 5 минут мониторить счета. Он тогда все свое время только на это будет тратить. А так, произошло событие "деньги от клиент", сразу же после этого все пошло в работу.

Согласен. Для оперативности запуска процесса после прихода денег такой вариант наиболее удобен.

Good luck in the life!

"Барабанов Алексей Александрович" написал:А у нас ближе к событийной системе. :) Не сидеть же менеджеру и через каждые 5 минут мониторить счета.

Совершенно поддерживаю... а если менеджер в командировке и не имеет возможности запускать приложение и его средства комуникации ограничиваются телефоном и максимум нотбуком и тем же телефонным интернетом? В бою сапог надежнее(с) :-)))

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