forum.bitel.ru http://forum.bitel.ru/ |
|
Блокировка субдоговора пристатусе "Приостановлен" http://forum.bitel.ru/viewtopic.php?f=16&t=12394 |
Страница 1 из 1 |
Автор: | spectrum [ 18 апр 2017, 15:27 ] |
Заголовок сообщения: | Блокировка субдоговора пристатусе "Приостановлен" |
Добрый день! Подскажите, пожалуйста, решение по следующему вопросу. Имеется супердоговор. На нем два зависимых субдоговора. Один из субдоговоров в статусе "Приостановлен". В данном статусе не происходит начисление абонплаты. Второй субдоговор активен. Так вот при недостатке средств происходит блокировка Супердоговора, а также блокировка обоих субдоговоров. Статус "Приостановлен" у субдоговора перетирается. Соответственно для разблокировки требуется уже активация этого субдогвоора, который ранее был в статусе приостановлен. Каким образом решить эту проблему? Как можно временно приостанавливать субдоговора так, чтобы дальнейшие блокировки и активации супердоговора не трогали статус этого субдоговора? |
Автор: | dimOn [ 18 апр 2017, 15:31 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
задача непонятна. вам надо, чтобы смены статусов не трогали статусы зависимых? или только в отдельных случаях? |
Автор: | dimOn [ 18 апр 2017, 15:34 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
npay тут ни при чём, это механизм ядра # При смене статуса договора смена статусов его независимых субдоговоров, 1 - включение independ.subcontract.status.change=0 |
Автор: | dimOn [ 18 апр 2017, 15:34 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
а, не у вас же зависимые... тогда depend.subcontract.status.change |
Автор: | spectrum [ 18 апр 2017, 15:42 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
О, так это недокументированная возможность? А по умолчанию какой значение у этого поля? 1? |
Автор: | dimOn [ 18 апр 2017, 15:43 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
почему недокументированная? это всегда так было - зависимые по дефолту статус меняется, независимые не трогает да, по дефолту там depend.subcontract.status.change=1 в доке первый параметр был, второго не было) |
Автор: | spectrum [ 18 апр 2017, 15:46 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
Ну вот в доке только independ есть. Спасибо. Будем пробовать. |
Автор: | Phricker [ 18 апр 2017, 18:04 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
а это не поможет в конфиге NPAY? Тогда NPAY будет сам контролировать. Код: # обрарабываем зависимые субдоговоры
debet.npay.processDependentSub=1 |
Автор: | spectrum [ 18 апр 2017, 18:40 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
Судя по доке: Цитата: #при открытии статуса супердоговора открывать статусы зависимых договоров(1-открывать, 0 - не открывать). debet.npay.processDependentSub=0 Этот параметр по умолчанию уже 1 стоит. Иначе бы субдоговора не активировались при разблокировке супера. |
Автор: | spectrum [ 19 апр 2017, 02:52 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
Попытался сделать вот так: Цитата: debet.npay.status.rule=4:4 4 - статус "Приостановлен" Но не сработало. Все равно субдоговор с этого статуса (Приостановлен - 4) был переведен в статус Блокирован - 3. |
Автор: | spectrum [ 19 апр 2017, 19:09 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
Прокомментируйте, пожалуйста. Почему не работает последнее правило? Или я неправильно его понимаю? |
Автор: | dimOn [ 19 апр 2017, 19:56 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
не очень понятно, а в статус 4 у вас кто переводит? но вообще сомневаюсь, что картинку вашу можно описать в штатной логике |
Автор: | spectrum [ 19 апр 2017, 20:06 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
dimOn писал(а): не очень понятно, а в статус 4 у вас кто переводит? Оператор переводит. Например абонент уезжает в отпуск и на одной точке необходимо приостановить услугу, чтобы не было возможности пользоваться услугой, а также чтобы не было начислений абонплаты за этот период. Вторая точка должна быть активной. Так вот при недостатке средств статус "Приостановлен" сбрасывается в "Блокирован". Вот надо сделать так, чтобы на этом субдоговоре статус не сбрасывался. Или как-то иначе решить проблему. |
Автор: | dimOn [ 19 апр 2017, 20:13 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
ну я так и подумал что тут что-то не сходится причём тут тогда оператор и debet.npay.status.rule=4:4 которая есть настройка для задачи блокировки абонплат |
Автор: | dimOn [ 19 апр 2017, 20:13 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
у вас только скриптами так вижу |
Автор: | spectrum [ 19 апр 2017, 20:31 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
dimOn писал(а): ну я так и подумал что тут что-то не сходится причём тут тогда оператор и debet.npay.status.rule=4:4 которая есть настройка для задачи блокировки абонплат Ну я подумал, что данное правило в случае изменения статуса (когда блокируется договор), из 4 статуса будет переводить не в 3(Блокирован), а оставит в 4. |
Автор: | dimOn [ 20 апр 2017, 01:15 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
ну да, только данное правило действует на задачу блокировки абонплат же, и никакого отношения к основному модулю npay и тем более ядру (смена статуса руками) не имеет |
Автор: | spectrum [ 20 апр 2017, 14:27 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
Не совсем понял. Поясните, пожалуйста. Статус 4 (Приотсановлен) устаналваиется руками. Но в это время ничего и не требуется править. А вот дальше уже статус "Блокирован" устанавливается штатным скриптом блокировки при нехватке средств. Так вот надо чтобы этот скрипт статус "Приостановлен" не менял и оставлял таким какой он есть. Я полагал "debet.npay.status.rule" тут поможет. |
Автор: | dimOn [ 20 апр 2017, 14:56 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
то есть у вас эта задача (полагаю то что вы назвали штатным скриптом) настроена чтобы переводить в 3 по недостатку средств. но ведь она меняет только если у вас сейчас стоит активный для этой задачи статус (!). то есть получается у вас 4 заявлен там как активный? а 3 заявлен как неактивный? остальные настройки этой задачи (и модуля вообще) покажите. выходит что вы сделали 4 активным, но хтите чтобы в него переводилось обратно при блокировке? а для других договоров должно быть другое поведение? |
Автор: | spectrum [ 20 апр 2017, 15:18 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
Код: contract.status.suspend.codes=2,3,4,5 service.no.suspend.3=77,81 service.no.suspend.4=77,81 recalculate.on.service.change=2 max.periodic.errors=30 debet.npay.status.manage=1 debet.npay.status.manage.groups=4 debet.npay.active.status=0 debet.npay.locked.status=3 debet.npay.checkServiceObjectList=0 debet.npay.status.rule=4:4 В основной конфигурации: Код: contract.status.list=0:Активен;1:В отключении;2:Отключен;3:Блокирован сист.;4:Приостановлен;5:В подключении contract.status.no.manual.set=1,2,5 independ.subcontract.status.change=0 Штатным скриптом я назвал задачу, которая запускается в планировщике: "Закрытие статуса NPAY договоров по балансу". Когда выполняется этот скрипт он переводит из статуса 0 (Активен) в 3 (Блокирован). Но также переводит и статус 4 (Приостановлен) в статус 3 (Блокирован). Так вот надо чтобы он не трогал этот статус 4 и не переводил этот статус в 3. Вот у нас есть строка в конфиге "debet.npay.active.status=0". Логично было бы только этот статус переводить из 0 в 3 (debet.npay.locked.status=3). А статус 4 не трогать, т.к. он не является активным. |
Автор: | spectrum [ 21 апр 2017, 13:15 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
Прокомментируйте, пожалуйста, возможно реализовать штатно то, что мы хотим? |
Автор: | spectrum [ 25 апр 2017, 11:46 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
Неужели никто не делает временную приостановку субдоговоров? |
Автор: | spectrum [ 27 апр 2017, 14:16 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
Уважаемые разработчики, прокомментируйте, пожалуйста. Мне кажется это не очень правильно, что нет возможности делать приостановку субдоговоров. |
Автор: | spectrum [ 11 май 2017, 20:55 ] | |||
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" | |||
Подниму тему. С картинками. До блокировки. Супердоговор Активен. Субдоговор приостановлен. После блокировки. Супердоговор заблокирован. Субдоговор также заблокировался. Теперь для автоматической разблокировки необходимо оплатить за оба договора - и за Супер и за Субдоговор. Если денег будет достаточно,то активируются оба договора. Надо чтобы статус субдоговора в случае текущего статуса "Приостановлен" не изменялся на "Заблокирован". В основном конфиге: Код: contract.status.list=0:Активен;1:В отключении;2:Отключен;3:Блокирован сист.;4:Приостановлен;5:В подключении В конфиге абонплат: Код: # статусы договора, в которых не начисляется абонентская плата
contract.status.suspend.codes=2,3,4,5 #код активного статуса договора debet.npay.active.status=0 #код заблокированного статуса договора debet.npay.locked.status=3
|
Автор: | Cromeshnic [ 12 май 2017, 07:39 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
spectrum писал(а): Неужели никто не делает временную приостановку субдоговоров? Мы делаем. Решили проблему собственным скриптом перетирания статусов (5.2): Код: package ru.dsi.bgbilling.kernel.scripts; import bitel.billing.common.TimeUtils; import bitel.billing.server.contract.bean.ContractStatus; import bitel.billing.server.contract.bean.ContractStatusManager.ContractStatusManager4Script; import ru.bitel.bgbilling.kernel.event.EventProcessor; import ru.bitel.bgbilling.kernel.event.events.ContractSetStatusLogicEvent; import ru.bitel.bgbilling.kernel.event.events.ContractStatusChangedEvent; import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase; import ru.bitel.bgbilling.server.util.Setup; import ru.bitel.common.sql.ConnectionSet; import java.util.Calendar; import java.util.HashSet; import java.util.Set; public class MyContractSetStatusLogicEvent extends EventScriptBase<ContractSetStatusLogicEvent> { @Override public void onEvent( ContractSetStatusLogicEvent event, Setup setup, ConnectionSet connectionSet ) throws Exception { Set<Integer> system_uids = new HashSet<Integer>(3); system_uids.add(0);//system system_uids.add(160);//C3PO system_uids.add(178);//CRM ContractStatus originalStatus = event.getOriginalStatus(); print( "userId = "+event.getUserId()); print( "original status = " + event.getOriginalStatus() ); print( "status1 = " + event.getStatus1() ); print( "status2 = " + event.getStatus2() ); String comment = originalStatus.getComment(); print(comment); print(SubcontractFlagContractStatusChangingEvent.subcontractCommentPrefix); if(null==comment){comment="";} if(comment.startsWith(SubcontractFlagContractStatusChangingEvent.subcontractCommentPrefix) || system_uids.contains(event.getUserId())){ //Если либо комментарий статуса начинается с SubcontractFlagContractStatusChangingEvent.subcontractCommentPrefix //и мы - субдоговор, либо пользователь = "сервер", // (с 23.04.2015) при этом новый статус - не 1 "в отключении" (т.е. статус "в отключении" всегда всё перетирает), // то => // => не перекрываем островки статуса "приостановлен" // старый статус ContractStatus status = event.getStatus1(); // Приходящий статус ContractStatus newStatus = event.getStatus2(); String statusComment = status.getComment(); if(statusComment==null){statusComment="";} //Обрабатываем только статусы 4 и 1 ("приостановлен", "в отключении"), установленный на конкретном субдоговоре (не спущенный сверху), //либо спущенный сверху, но перетираемый скриптом // c 23.04.2015 добавили статус 1: его нельзя перетирать по той же логике, что и 4, но он перетирает статус 4 всегда if((status.getStatus()==4 || status.getStatus()==1) && newStatus.getStatus()!=1 //С 23.04.2015 && (!statusComment.startsWith(SubcontractFlagContractStatusChangingEvent.subcontractCommentPrefix) || system_uids.contains(event.getUserId()))){ // менеджер ContractStatusManager, оптимизированный для этого скрипта ContractStatusManager4Script csm = new ContractStatusManager4Script( connectionSet.getConnection() ); //Предыдущий день перед началом нового статуса Calendar prevDay = Calendar.getInstance(); prevDay.setTime( newStatus.getDateFrom() ); prevDay.add( Calendar.DAY_OF_MONTH, -1 ); // следующий день после конца нового статуса (или null) Calendar nextDay = null; if( originalStatus.getDateTo() != null ) { nextDay = Calendar.getInstance(); nextDay.setTime( newStatus.getDateTo() ); nextDay.add( Calendar.DAY_OF_YEAR, 1 ); } Calendar tmpprev = Calendar.getInstance(); tmpprev.setTime(status.getDateFrom()); tmpprev.add( Calendar.DAY_OF_MONTH, -1 ); Calendar tmpnext = Calendar.getInstance(); if(status.getDateTo()!=null){ tmpnext.setTime(status.getDateTo()); tmpnext.add( Calendar.DAY_OF_MONTH, 1 ); }else{ tmpnext=null; } /* 1. * status:...[4444] * new:....[***********? * -> * status:...[4444] * new:....[]......[***? * * и да, мы теряем первый кусок от newStatus, поэтому сразу же его апдейтим (хоть и вне стандартной логики и без ContractStatusChangingEvent) */ if( TimeUtils.dateBeforeOrEq( newStatus.getDateFrom(), status.getDateFrom() ) && status.getDateTo() != null && (newStatus.getDateTo() == null || TimeUtils.dateBeforeOrEq( status.getDateTo(), newStatus.getDateTo() ) ) ) { //Запиливаем первый кусочек: if(TimeUtils.dateBefore(newStatus.getDateFrom(), tmpprev.getTime())){ ContractStatus tmp = newStatus.clone(); tmp.setDateTo(tmpprev.getTime()); if(ContractStatusManager4Script.isStatusPeriodValid(tmp)){ csm.updateStatus(tmp, event.getUserId()); //��������� ������� ������, ���� ���������: ContractStatus statusEvent = new ContractStatus(); statusEvent.setContractId(tmp.getContractId()); statusEvent.setDateFrom(tmp.getDateFrom()); statusEvent.setDateTo(tmp.getDateTo()); statusEvent.setStatus(tmp.getStatus()); statusEvent.setComment(tmp.getComment()); java.util.Date date = new java.util.Date(); if ((TimeUtils.dateBeforeOrEq(statusEvent.getDateFrom(), date)) && ( (statusEvent.getDateTo() == null) || (TimeUtils.dateBeforeOrEq(date, statusEvent.getDateTo())))) { csm.setContractStatus(statusEvent); ContractStatusChangedEvent changedEvent = new ContractStatusChangedEvent(statusEvent, event.getUserId()); EventProcessor.getInstance().publish(changedEvent); } } } //Меняем date1 второго кусочка newStatus newStatus.setDateFrom(tmpnext.getTime()); }else /* 2. * status:..[444] * new:.......[******? * -> * status:..[444] * new:..........[***? */ if(status.getDateTo() != null && TimeUtils.dateBeforeOrEq(status.getDateFrom(),newStatus.getDateFrom())){ newStatus.setDateFrom(tmpnext.getTime()); }else /* 3. * status:.....[444444? * new:.....[*****] * -> * status:.....[444444? * new:.....[*] */ if(newStatus.getDateTo()!=null && TimeUtils.dateBeforeOrEq(status.getDateFrom(), newStatus.getDateTo())){ newStatus.setDateTo(tmpprev.getTime()); }else /* 4. * status:.....[4444! * new:.....[*******? * or * status:.....[4444! * new:..........[**? * -> * status:.....[4444! * new:.....[*] * or * status:.....[4444! * new:.............. */ if(status.getDateTo()==null){ //либо статус обрезается до кусочка перед нашим диапазоном, либо вырождается newStatus.setDateTo(tmpprev.getTime()); } event.setProcessed( true ); csm.recycle(); } } } } Также есть скрипт, который при установке статуса на супере добавляет устанавливаемым статусам субов префикс "с супердоговора" (используется в предыдущем скрипте): Код: package ru.dsi.bgbilling.kernel.scripts; //import org.apache.log4j.Logger; import bitel.billing.server.contract.bean.Contract; import bitel.billing.server.contract.bean.ContractManager; import bitel.billing.server.contract.bean.ContractStatus; import ru.bitel.bgbilling.kernel.event.events.ContractStatusChangingEvent; import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase; import ru.bitel.bgbilling.server.util.Setup; import ru.bitel.common.sql.ConnectionSet; public class SubcontractFlagContractStatusChangingEvent extends EventScriptBase<ContractStatusChangingEvent> { public static String subcontractCommentPrefix = "С супердоговора: "; @Override public void onEvent( ContractStatusChangingEvent event, Setup setup, ConnectionSet connectionSet ) throws Exception { int cid = event.getContractId(); ContractManager cm = new ContractManager(connectionSet.getConnection()); Contract c = cm.getContractById(cid); cm.recycle(); if(null==c){ return; } if(c.isSuper()){ ContractStatus cs = event.getOriginalStatus(); if(cs!=null){ String comment = cs.getComment(); if(null==comment){comment="";} cs.setComment(subcontractCommentPrefix+comment); } } } } Уже пару лет проблем не возникает. |
Автор: | spectrum [ 12 май 2017, 12:16 ] |
Заголовок сообщения: | Re: Блокировка субдоговора пристатусе "Приостановлен" |
Спасибо! Ну значит будем думать в этом направлении. Спасибо за скрипты - посмотрим! |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |