forum.bitel.ru http://forum.bitel.ru/ |
|
CRM - Задачи http://forum.bitel.ru/viewtopic.php?f=1&t=2726 |
Страница 1 из 2 |
Автор: | lda [ 12 авг 2009, 16:50 ] |
Заголовок сообщения: | CRM - Задачи |
Ув. разработчики. Есть необходимость запретить принимать и закрывать задачи CRM если не произведены определенные манипуляции в договоре. Возможно ли добавить еще одно событие в биллинг "Перед сохранением задачи"? |
Автор: | skn [ 12 авг 2009, 19:21 ] |
Заголовок сообщения: | |
не понятно, что даст вам это событие... - вызов события не отменяет выполнение акшена - событие выполняется на сервере, а не на клиенте.... |
Автор: | lda [ 12 авг 2009, 19:49 ] |
Заголовок сообщения: | |
Цитата: не понятно, что даст вам это событие... Это событие даст возможность уведомить пользователя, что он что то не сделал в договоре. И не даст возможность закрыть задачу. Цитата: - вызов события не отменяет выполнение акшена
- событие выполняется на сервере, а не на клиенте.... У вас есть событие "Перед изменением параметра договора". В нем можно вернуть ошибку event.setError("Ошибка"). При этом ести выводится ошибка, то данные не записываются. Вот и хотелось бы получить похожее событие, но только для CRM-Задачи. У нас готовится слияние с еще одним провайдером, необходимо в вашем биллинге реализовать схему работы, похожую на ту которую использует другой провайдер. Поэтому я, последнее время, и прошу и вас добавлять различные вещи в биллинг. Очень прошу помочь... |
Автор: | skn [ 12 авг 2009, 20:16 ] |
Заголовок сообщения: | |
добавлять по одному событию в разные места проги, не очень продуктивное занятие.... попробуем решить проблему более глобально, добавить возможность вызова скрипта перед и после любого акшена в биллинге, но это потребует времени на тестирование. |
Автор: | lda [ 12 авг 2009, 21:44 ] |
Заголовок сообщения: | |
skn писал(а): добавлять по одному событию в разные места проги, не очень продуктивное занятие....
попробуем решить проблему более глобально, добавить возможность вызова скрипта перед и после любого акшена в биллинге, но это потребует времени на тестирование. К сожалению времени у нас не так то и много. Как быстро мы сможем воспользоваться таким скриптом? Готов быть тестером. |
Автор: | skn [ 13 авг 2009, 11:37 ] |
Заголовок сообщения: | |
что бы что нибудь тестировать, надо сначало это что то сделать.... |
Автор: | vdd [ 13 авг 2009, 18:49 ] |
Заголовок сообщения: | |
skn писал(а): добавлять по одному событию в разные места проги, не очень продуктивное занятие....
попробуем решить проблему более глобально, добавить возможность вызова скрипта перед и после любого акшена в биллинге, но это потребует времени на тестирование. Чудо?! НГ?! Ну а если серьезно, то это будет принципиальный шаг к обеспечению нормальной адаптации биллинга под конкретного заказчика. А с возможностью отмены действия из скрипта обработки - два принципиальных шага. IMHO |
Автор: | skn [ 13 авг 2009, 19:39 ] |
Заголовок сообщения: | |
увы пока не все так просто.... события привязываются к договорам в которых есть ссылки на скрипты. Но далеко не все акшены связаны с договорами..... где искать скрипты для таких акшенов? |
Автор: | lda [ 13 авг 2009, 19:56 ] |
Заголовок сообщения: | |
skn писал(а): увы пока не все так просто.... события привязываются к договорам в которых есть ссылки на срипты. Но далеко не все акшены связаны с договорами..... где искать скрипты для таких акшенов?
В голову приходит два варианта: 1. Не привязывать эти скрипты к договорам. 2. Дать возможность вызывать событие для акшенов, так же как для обработки доп. действий договора. Типа пишем в каком то конфиге, что для такого то акшена вызвать событие "Акшен" и передать в него несколько параметров: код экшена, cid и т.д. А дальше обрабатываем это событие как и любое другое для договора. |
Автор: | vdd [ 13 авг 2009, 20:04 ] |
Заголовок сообщения: | |
В скриптах, не привязнных к договорам. ![]() Например, есть некая сущность "профиль", к ней привязаны скрипты и набор событий. Да вообще могут быть просто скрипты без привязки к договорам. Даже наверное так: привязка скрипта к договору похожа на попытку предугадать, как облегчить жизнь разрабочикам скриптов, но если посмотреть некоторые скрипты в вики, то видно, что процедура "свой-чужой договор" в скрипте это тривиальная задача, которая могла быть дополнительно упрощена с помощью библиотечных утилит или вообще архитектурного решения скрипт+фильтр(скрипт-диспатчер). Мне другое интересно - вызов обработчика по любому экшену, вероятно в том месте кода, где тип экшена не известен, подразумевает проблему контекста, получаемого обработчиком. Какую информацию мы получим кроме факта "происходит вот такое вот событие"? |
Автор: | skn [ 13 авг 2009, 20:32 ] |
Заголовок сообщения: | |
короче пока так получилось 1) в конфиге прописывается для какаих акшенов генерировать события в виде Код: action.event_<module>_<action>=before|after|both
2) события генерируются только для запросов в которых есть параметер cid 3) есть два события: ActionBeforeEvent и ActionAfterEvent в которые передаются параметры: module, action, contractId, userId. Дополнительно в ActionBeforeEvent передается httpRequest (из которого можно получить все параметры переданные с клиента), а в ActionAfterEvent - rootNode - ссылка на ответную xml. 4) ActionBeforeEvent содержит методы setDoAction(Boolean) и setError( String, Boolean ) с помощью которых можно отменить выполнение акшена и задать сообщение выводимое в клиенте. |
Автор: | vdd [ 13 авг 2009, 20:46 ] |
Заголовок сообщения: | |
То есть мы получим только то, что связанно с работой клиентского приложения по поводу договоров? Насчет DoAction и SetError - если error выводится только при отмене - то некоторая избыточность ощушается ![]() |
Автор: | skn [ 13 авг 2009, 20:52 ] |
Заголовок сообщения: | |
vdd писал(а): То есть мы получим только то, что связанно с работой клиентского приложения по поводу договоров? а какие варианты? vdd писал(а): Насчет DoAction и SetError - если error выводится только при отмене - то некоторая избыточность ощушается
![]() возможны случаи когда надо отменить акшен, но не надо выводить сообщение... и наоборот |
Автор: | vdd [ 13 авг 2009, 23:09 ] |
Заголовок сообщения: | |
skn писал(а): vdd писал(а): То есть мы получим только то, что связанно с работой клиентского приложения по поводу договоров? а какие варианты? я проверяю, насколько понимаю о чем речь. Идеология action выглядит расширяемой и на остальные части, внутри сервера. skn писал(а): vdd писал(а): Насчет DoAction и SetError - если error выводится только при отмене - то некоторая избыточность ощушается ![]() возможны случаи когда надо отменить акшен, но не надо выводить сообщение... и наоборот То есть SetError - это все таки SetMessage? |
Автор: | skn [ 13 авг 2009, 23:25 ] |
Заголовок сообщения: | |
реализовал второй вариант, для тех кто умеет програмировать на java, в конфиге задается рематинг Код: action.remap_<module>_<action>=mypackage.MyAction это дает возможность вместо стандартного обработчика вызвать стороний, в простейшем варианте стороний обработчик может быть унаследован от стандарного и производить дополнительные проверки и действия до и после, или вместо стандартного. Например расширение обработчика сохранения текстового параметра из договора Код: package mypackage;
public class MyAction extends bitel.billing.server.contract.action.ActionUpdateParameterType1 { @Override public void doAction() throws SQLException { // проверки до вызова стандартного акшена ........... // вызон стандартного акшена, если надо super.doAction(); // дествия после акшена ............ } } |
Автор: | skn [ 13 авг 2009, 23:35 ] |
Заголовок сообщения: | |
vdd писал(а): skn писал(а): vdd писал(а): То есть мы получим только то, что связанно с работой клиентского приложения по поводу договоров? а какие варианты? я проверяю, насколько понимаю о чем речь. Идеология action выглядит расширяемой и на остальные части, внутри сервера. action может быть и расширяемо, а вот текущая реализация событий не очень. Я пока не вижу смысла в событиях на акшены не связанные с договорами, к примеру: редактирование шаблонов, пользователей, справочников..... |
Автор: | skn [ 13 авг 2009, 23:42 ] |
Заголовок сообщения: | |
vdd писал(а): skn писал(а): vdd писал(а): Насчет DoAction и SetError - если error выводится только при отмене - то некоторая избыточность ощушается ![]() возможны случаи когда надо отменить акшен, но не надо выводить сообщение... и наоборот То есть SetError - это все таки SetMessage? в текущих событиях например связанных с редактированием параметров договора, установка сообщения методом setError() подразумевает отмену акшена, я же разделил эти действия. Т.е. например, можно полностью реализовать обработку акшена с помощью скрипта и отменить вызов стандартного. |
Автор: | lda [ 14 авг 2009, 10:56 ] |
Заголовок сообщения: | |
skn писал(а): Я пока не вижу смысла в событиях на акшены не связанные с договорами, к примеру: редактирование шаблонов, пользователей, справочников.....
Я согласен с таким подходом. Возможность обработки акшенов для договоров очень серьезно расширит возможность биллинга по автоматизации работы. По крайней мере у нас акшенами, которые не связаны с договором, пользуются в основном только администраторы биллинга, а в автоматизации их работы нет большего смысла. |
Автор: | skn [ 14 авг 2009, 13:16 ] |
Заголовок сообщения: | |
выложил обновление сервера и CRM |
Автор: | lda [ 14 авг 2009, 13:58 ] |
Заголовок сообщения: | |
skn писал(а): выложил обновление сервера и CRM
Приступил к тестированию. setDoAction(Boolean) - работает, а setError(error) - нет. В конфиге прописал: Код: action.event_ru.bitel.bgbilling.plugins.crm_UpdateRegisterTask=before В скрипте поведения: Код: print("ok"); event.setError( "asd" ); Получил ошибку: Код: java.util.concurrent.ExecutionException: java.security.PrivilegedActionException: Sourced file: Function [id:45; title:До выполнения action] : Error in method
invocation: Method setError( java.lang.String ) not found in class'bitel.billing.server.script.bean.event.ActionBeforeEvent' : at Line: 2 : in file: Function [id:45; title:До выполнения action] : event .setError ( "asd" ) at java.util.concurrent.FutureTask$Sync.innerGet(Unknown Source) at java.util.concurrent.FutureTask.get(Unknown Source) at bitel.billing.server.script.bean.ScriptMachine$ThreadedScriptMachine.runScriptImpl(ScriptMachine.java:359) at bitel.billing.server.script.bean.ScriptMachine.runScript(ScriptMachine.java:128) at bitel.billing.server.script.bean.event.EventProcessor.processEvent(EventProcessor.java:237) at bitel.billing.server.Executer.doModule(Executer.java:717) at bitel.billing.server.Executer$1.run(Executer.java:206) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Unknown Source) at bitel.billing.server.Executer.doPost(Executer.java:201) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at bitel.billing.server.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:37) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:568) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Unknown Source) Caused by: java.security.PrivilegedActionException: Sourced file: Function [id:45; title:До выполнения action] : Error in method invocation: Method setError( java.lang.String ) not found in class'bitel.billing.server.script.bean.event.ActionBeforeEvent' : at Line: 2 : in file: Function [id:45; title:До выполнения a ction] : event .setError ( "asd" ) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Unknown Source) at bitel.billing.server.script.bean.ScriptMachine$ThreadedScriptMachine$1.call(ScriptMachine.java:335) at bitel.billing.server.script.bean.ScriptMachine$ThreadedScriptMachine$1.call(ScriptMachine.java:1) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ... 1 more Caused by: Sourced file: Function [id:45; title:До выполнения action] : Error in method invocation: Method setError( java.lang.String ) not found in class'bit el.billing.server.script.bean.event.ActionBeforeEvent' : at Line: 2 : in file: Function [id:45; title:До выполнения action] : event .setError ( "asd" ) at bsh.BSHMethodInvocation.eval(Unknown Source) at bsh.BSHPrimaryExpression.eval(Unknown Source) at bsh.BSHPrimaryExpression.eval(Unknown Source) at bsh.Interpreter.eval(Unknown Source) at ru.bitel.bgbilling.kernel.script.server.bean.ScriptInstance.eval(ScriptInstance.java:310) at bitel.billing.server.script.bean.ScriptMachine$SimpleScriptRunner.runScript(ScriptMachine.java:69) at bitel.billing.server.script.bean.ScriptMachine.runScriptImpl(ScriptMachine.java:189) at bitel.billing.server.script.bean.ScriptMachine$ThreadedScriptMachine.access$0(ScriptMachine.java:1) at bitel.billing.server.script.bean.ScriptMachine$ThreadedScriptMachine$1$1.run(ScriptMachine.java:340) at bitel.billing.server.script.bean.ScriptMachine$ThreadedScriptMachine$1$1.run(ScriptMachine.java:1) ... 9 more 08-14/11:49:17 INFO [http-8080-1] script - Process time => 11 08-14/11:49:17 INFO [http-8080-1] script - ok |
Автор: | lda [ 14 авг 2009, 14:23 ] |
Заголовок сообщения: | |
Код: print(event.contractId); Выдает ошибку: Код: java.util.concurrent.ExecutionException: java.security.PrivilegedActionException: Sourced file: Function [id:45; title:До выполнения action] : Cannot access f
ield: contractId, on object: Event bitel.billing.server.script.bean.event.ActionBeforeEvent cid: 15682; module: 0; type: 30 : at Line: 5 : in file: Function [ id:45; title:До выполнения action] : event .contractId at java.util.concurrent.FutureTask$Sync.innerGet(Unknown Source) at java.util.concurrent.FutureTask.get(Unknown Source) at bitel.billing.server.script.bean.ScriptMachine$ThreadedScriptMachine.runScriptImpl(ScriptMachine.java:359) at bitel.billing.server.script.bean.ScriptMachine.runScript(ScriptMachine.java:128) at bitel.billing.server.script.bean.event.EventProcessor.processEvent(EventProcessor.java:237) at bitel.billing.server.Executer.doModule(Executer.java:717) at bitel.billing.server.Executer$1.run(Executer.java:206) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Unknown Source) at bitel.billing.server.Executer.doPost(Executer.java:201) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at bitel.billing.server.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:37) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:568) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Unknown Source) Caused by: java.security.PrivilegedActionException: Sourced file: Function [id:45; title:До выполнения action] : Cannot access field: contractId, on object: E vent bitel.billing.server.script.bean.event.ActionBeforeEvent cid: 15682; module: 0; type: 30 : at Line: 5 : in file: Function [id:45; title:До выполнения act ion] : event .contractId at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Unknown Source) at bitel.billing.server.script.bean.ScriptMachine$ThreadedScriptMachine$1.call(ScriptMachine.java:335) at bitel.billing.server.script.bean.ScriptMachine$ThreadedScriptMachine$1.call(ScriptMachine.java:1) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ... 1 more Caused by: Sourced file: Function [id:45; title:До выполнения action] : Cannot access field: contractId, on object: Event bitel.billing.server.script.bean.eve nt.ActionBeforeEvent cid: 15682; module: 0; type: 30 : at Line: 5 : in file: Function [id:45; title:До выполнения action] : event .contractId at bsh.UtilEvalError.toEvalError(Unknown Source) at bsh.UtilEvalError.toEvalError(Unknown Source) at bsh.BSHAmbiguousName.toObject(Unknown Source) at bsh.BSHAmbiguousName.toObject(Unknown Source) at bsh.BSHPrimaryExpression.eval(Unknown Source) at bsh.BSHPrimaryExpression.eval(Unknown Source) at bsh.BSHArguments.getArguments(Unknown Source) at bsh.BSHMethodInvocation.eval(Unknown Source) at bsh.BSHPrimaryExpression.eval(Unknown Source) at bsh.BSHPrimaryExpression.eval(Unknown Source) at bsh.Interpreter.eval(Unknown Source) at ru.bitel.bgbilling.kernel.script.server.bean.ScriptInstance.eval(ScriptInstance.java:310) at bitel.billing.server.script.bean.ScriptMachine$SimpleScriptRunner.runScript(ScriptMachine.java:69) at bitel.billing.server.script.bean.ScriptMachine.runScriptImpl(ScriptMachine.java:189) at bitel.billing.server.script.bean.ScriptMachine$ThreadedScriptMachine.access$0(ScriptMachine.java:1) at bitel.billing.server.script.bean.ScriptMachine$ThreadedScriptMachine$1$1.run(ScriptMachine.java:340) at bitel.billing.server.script.bean.ScriptMachine$ThreadedScriptMachine$1$1.run(ScriptMachine.java:1) ... 9 more 08-14/12:13:57 INFO [http-8080-1] script - Process time => 12 08-14/12:13:57 INFO [http-8080-1] script - ok |
Автор: | skn [ 14 авг 2009, 14:27 ] |
Заголовок сообщения: | |
см. http://www.bgbilling.ru/v4.6/javadoc/bi ... frame.html замени Код: print("ok"); event.setError( "asd" ); на Код: print("ok");
event.setError( "asd", false ); |
Автор: | skn [ 14 авг 2009, 14:29 ] |
Заголовок сообщения: | |
Замени Код: print(event.contractId); на Код: print(event.getContractID());
|
Автор: | lda [ 14 авг 2009, 14:34 ] |
Заголовок сообщения: | |
Все получилось. Огромное Вам спасибо! ![]() |
Автор: | lda [ 14 авг 2009, 15:59 ] |
Заголовок сообщения: | |
Подскажите пожалуйста как получить параметр из request по имени. Делаю так: Код: request = event.getRequest();
print(request.getSession().getAttribute( "type" )); print(request.getSession().getAttribute( "comment" )); Но всегда получаю null. |
Автор: | skn [ 14 авг 2009, 16:32 ] |
Заголовок сообщения: | |
Код: print(request.getParameter( "type" ));
|
Автор: | lda [ 14 авг 2009, 16:37 ] |
Заголовок сообщения: | |
skn писал(а): Код: print(request.getParameter( "type" )); Спасибо. Все получилось. |
Автор: | lda [ 17 авг 2009, 11:52 ] |
Заголовок сообщения: | |
Возникла такая проблема. Обрабатываю событие "До action" для CRM->задачи: Код: action.event_ru.bitel.bgbilling.plugins.crm_UpdateRegisterTask=before
Проблема в том, что если я сохраняю задачу из договора, то событие срабатывает, а если из плагина CRM, то событие не срабатывает. Присмотрелся к запросу, оказалось что при сохранении задачи из плагина параметр cid не передается. Можно решить эту проблему? |
Автор: | skn [ 17 авг 2009, 14:05 ] |
Заголовок сообщения: | |
ну как вариант переопределить акшен как предлагал выше |
Автор: | lda [ 17 авг 2009, 14:09 ] |
Заголовок сообщения: | |
skn писал(а): ну как вариант переопределить акшен как предлагал выше
А нельзя просто передавать cid, что бы сработало событие? |
Страница 1 из 2 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |