BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 28 мар 2024, 21:05

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 27 ] 
Автор Сообщение
СообщениеДобавлено: 18 апр 2017, 15:27 
Не в сети

Зарегистрирован: 29 янв 2014, 11:32
Сообщения: 365
Карма: 10
Добрый день!

Подскажите, пожалуйста, решение по следующему вопросу.

Имеется супердоговор. На нем два зависимых субдоговора. Один из субдоговоров в статусе "Приостановлен". В данном статусе не происходит начисление абонплаты. Второй субдоговор активен. Так вот при недостатке средств происходит блокировка Супердоговора, а также блокировка обоих субдоговоров. Статус "Приостановлен" у субдоговора перетирается. Соответственно для разблокировки требуется уже активация этого субдогвоора, который ранее был в статусе приостановлен.

Каким образом решить эту проблему? Как можно временно приостанавливать субдоговора так, чтобы дальнейшие блокировки и активации супердоговора не трогали статус этого субдоговора?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 апр 2017, 15:31 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
задача непонятна. вам надо, чтобы смены статусов не трогали статусы зависимых? или только в отдельных случаях?

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 апр 2017, 15:34 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
npay тут ни при чём, это механизм ядра

# При смене статуса договора смена статусов его независимых субдоговоров, 1 - включение
independ.subcontract.status.change=0

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 апр 2017, 15:34 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
а, не у вас же зависимые...
тогда depend.subcontract.status.change

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 апр 2017, 15:42 
Не в сети

Зарегистрирован: 29 янв 2014, 11:32
Сообщения: 365
Карма: 10
О, так это недокументированная возможность? А по умолчанию какой значение у этого поля? 1?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 апр 2017, 15:43 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
почему недокументированная? это всегда так было - зависимые по дефолту статус меняется, независимые не трогает
да, по дефолту там depend.subcontract.status.change=1
в доке первый параметр был, второго не было)

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 апр 2017, 15:46 
Не в сети

Зарегистрирован: 29 янв 2014, 11:32
Сообщения: 365
Карма: 10
Ну вот в доке только independ есть. Спасибо. Будем пробовать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 апр 2017, 17:48 
Не в сети

Зарегистрирован: 29 янв 2014, 11:32
Сообщения: 365
Карма: 10
Так это получается, что, т.к. субдогвора блокироваться не будут, то абонплата на них будет начисляться в полном объеме.
А надо чтобы на время блокировки абонплата не начислялась.

Прикладываю схему:


Вложения:
схема.png
схема.png [ 42.21 КБ | Просмотров: 14269 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 апр 2017, 18:04 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
а это не поможет в конфиге NPAY?
Тогда NPAY будет сам контролировать.
Код:
# обрарабываем зависимые субдоговоры
debet.npay.processDependentSub=1

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 апр 2017, 18:40 
Не в сети

Зарегистрирован: 29 янв 2014, 11:32
Сообщения: 365
Карма: 10
Судя по доке:
Цитата:
#при открытии статуса супердоговора открывать статусы зависимых договоров(1-открывать, 0 - не открывать).
debet.npay.processDependentSub=0

Этот параметр по умолчанию уже 1 стоит. Иначе бы субдоговора не активировались при разблокировке супера.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 апр 2017, 02:52 
Не в сети

Зарегистрирован: 29 янв 2014, 11:32
Сообщения: 365
Карма: 10
Попытался сделать вот так:
Цитата:
debet.npay.status.rule=4:4

4 - статус "Приостановлен"
Но не сработало. Все равно субдоговор с этого статуса (Приостановлен - 4) был переведен в статус Блокирован - 3.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 апр 2017, 19:09 
Не в сети

Зарегистрирован: 29 янв 2014, 11:32
Сообщения: 365
Карма: 10
Прокомментируйте, пожалуйста. Почему не работает последнее правило? Или я неправильно его понимаю?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 апр 2017, 19:56 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
не очень понятно, а в статус 4 у вас кто переводит?

но вообще сомневаюсь, что картинку вашу можно описать в штатной логике

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 апр 2017, 20:06 
Не в сети

Зарегистрирован: 29 янв 2014, 11:32
Сообщения: 365
Карма: 10
dimOn писал(а):
не очень понятно, а в статус 4 у вас кто переводит?

Оператор переводит. Например абонент уезжает в отпуск и на одной точке необходимо приостановить услугу, чтобы не было возможности пользоваться услугой, а также чтобы не было начислений абонплаты за этот период. Вторая точка должна быть активной.
Так вот при недостатке средств статус "Приостановлен" сбрасывается в "Блокирован". Вот надо сделать так, чтобы на этом субдоговоре статус не сбрасывался. Или как-то иначе решить проблему.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 апр 2017, 20:13 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
ну я так и подумал что тут что-то не сходится
причём тут тогда оператор и debet.npay.status.rule=4:4 которая есть настройка для задачи блокировки абонплат

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 апр 2017, 20:13 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
у вас только скриптами
так вижу

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 апр 2017, 20:31 
Не в сети

Зарегистрирован: 29 янв 2014, 11:32
Сообщения: 365
Карма: 10
dimOn писал(а):
ну я так и подумал что тут что-то не сходится
причём тут тогда оператор и debet.npay.status.rule=4:4 которая есть настройка для задачи блокировки абонплат

Ну я подумал, что данное правило в случае изменения статуса (когда блокируется договор), из 4 статуса будет переводить не в 3(Блокирован), а оставит в 4.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 апр 2017, 01:15 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
ну да, только данное правило действует на задачу блокировки абонплат же, и никакого отношения к основному модулю npay и тем более ядру (смена статуса руками) не имеет

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 апр 2017, 14:27 
Не в сети

Зарегистрирован: 29 янв 2014, 11:32
Сообщения: 365
Карма: 10
Не совсем понял. Поясните, пожалуйста.
Статус 4 (Приотсановлен) устаналваиется руками. Но в это время ничего и не требуется править.
А вот дальше уже статус "Блокирован" устанавливается штатным скриптом блокировки при нехватке средств. Так вот надо чтобы этот скрипт статус "Приостановлен" не менял и оставлял таким какой он есть. Я полагал "debet.npay.status.rule" тут поможет.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 апр 2017, 14:56 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
то есть у вас эта задача (полагаю то что вы назвали штатным скриптом) настроена чтобы переводить в 3 по недостатку средств.
но ведь она меняет только если у вас сейчас стоит активный для этой задачи статус (!). то есть получается у вас 4 заявлен там как активный? а 3 заявлен как неактивный? остальные настройки этой задачи (и модуля вообще) покажите.
выходит что вы сделали 4 активным, но хтите чтобы в него переводилось обратно при блокировке? а для других договоров должно быть другое поведение?

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 апр 2017, 15:18 
Не в сети

Зарегистрирован: 29 янв 2014, 11:32
Сообщения: 365
Карма: 10
Код:
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 не трогать, т.к. он не является активным.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 апр 2017, 13:15 
Не в сети

Зарегистрирован: 29 янв 2014, 11:32
Сообщения: 365
Карма: 10
Прокомментируйте, пожалуйста, возможно реализовать штатно то, что мы хотим?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 апр 2017, 11:46 
Не в сети

Зарегистрирован: 29 янв 2014, 11:32
Сообщения: 365
Карма: 10
Неужели никто не делает временную приостановку субдоговоров?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 27 апр 2017, 14:16 
Не в сети

Зарегистрирован: 29 янв 2014, 11:32
Сообщения: 365
Карма: 10
Уважаемые разработчики, прокомментируйте, пожалуйста. Мне кажется это не очень правильно, что нет возможности делать приостановку субдоговоров.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 11 май 2017, 20:55 
Не в сети

Зарегистрирован: 29 янв 2014, 11:32
Сообщения: 365
Карма: 10
Подниму тему. С картинками.
До блокировки. Супердоговор Активен. Субдоговор приостановлен.
После блокировки. Супердоговор заблокирован. Субдоговор также заблокировался.
Теперь для автоматической разблокировки необходимо оплатить за оба договора - и за Супер и за Субдоговор. Если денег будет достаточно,то активируются оба договора.

Надо чтобы статус субдоговора в случае текущего статуса "Приостановлен" не изменялся на "Заблокирован".

В основном конфиге:
Код:
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


Вложения:
До-блокировки.png
До-блокировки.png [ 49 КБ | Просмотров: 14103 ]
После-блокировки.png
После-блокировки.png [ 49.46 КБ | Просмотров: 14103 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 12 май 2017, 07:39 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
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);
         }
      }
   }
}


Уже пару лет проблем не возникает.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 12 май 2017, 12:16 
Не в сети

Зарегистрирован: 29 янв 2014, 11:32
Сообщения: 365
Карма: 10
Спасибо! Ну значит будем думать в этом направлении.
Спасибо за скрипты - посмотрим!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 27 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
POWERED_BY
Русская поддержка phpBB
[ Time : 0.120s | 74 Queries | GZIP : On ]