forum.bitel.ru
http://forum.bitel.ru/

Получение предполагаемой наработки по абонплатам за месяц
http://forum.bitel.ru/viewtopic.php?f=16&t=4076
Страница 2 из 3

Автор:  Администратор [ 29 июл 2010, 16:56 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за месяц

В WiKi добавил.
http://wiki.bgbilling.ru/index.php/%D0% ... 1%82%D1%8B

Автор:  Akhmat [ 10 авг 2010, 21:22 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за месяц

Хочу при смене тарифного плана в любой день текущего месяца запретить переход на выбранный тариф, если переначисление абонплаты до конца месяца уведет договор ниже лимита(в минус, загонит в долги), и вывести месаг пользователю вида "Недостаточно средств на договоре. для перехода на <выбранный> тарифный план требуется пополнить счет на N р."

Для расчета требуются цифры:
1) "ТекущийБаланс" (могу получить)
2) НачисленнаяАбонплатаЗаМесяц: вся имеющаяся наработка по абонплатам(что в contract_account) на договоре за текущий месяц (могу получить)
3) НаработкаПоСменяемомуТарифуДоПредполагаемойДатыЗакрытия: абонплата по сменяемому тарифу договора за текущий месяц, до предполагаемой даты закрытия, с учетом имеющихся статусов договора. (не могу получить)
4) АбонплатаПоВыбранномуТарифуЗаОставшиесяДниМесяца (не могу получить)
5) "ТекущийЛимит" (могу получить)

Вычисляем корректировку по формуле:

Код:
СкорректированнаяАбонплатаЗаМесяц = НачисленнаяАбонплатаЗаМесяц - (НаработкаПоСменяемомуТарифуДоПредполагаемойДатыЗакрытия + АбонплатаПоВыбранномуТарифуЗаОставшиесяДниМесяца)

ПредполагаемыйБалансПослеСменыТарифа = ТекущийБаланс + (НачисленнаяАбонплатаЗаМесяц  - СкорректированнаяАбонплатаЗаМесяц )
Если ПредполагаемыйБалансПослеСменыТарифа >ТекущийЛимит
   "Разрешаем менять тариф"
Иначе
   Вывод месаги в ЛК "Для смены тарифа требуется доплатить" + (ПредполагаемыйБалансПослеСменыТарифа -ТекущийЛимит) + "рублей"



Подскажите как получить цифры в пунктах 3) и 4)
По имеющимся примерам вычисления абонплаты... вроде они не подходят для этого случая.

Либо как по другому реализовать?


Вообще у кого как реализована смена тарифов через web? Использует кто нибудь стандартный алгоритм смены тарифа?

PS
сори за сложный пост

upd
рассчет малость неверный, но суть вопроса не изменилась, требуется возможность получать суммы вида 3) 4)

Автор:  skyb [ 11 авг 2010, 05:03 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за месяц

Мож чем поможет - http://wiki.bgbilling.ru/index.php/%D0% ... 1%82%D0%B5

Автор:  Akhmat [ 11 авг 2010, 12:47 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за месяц

не подходит этот пример. но спасибо

Автор:  Brodayga [ 10 окт 2011, 17:41 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

Вычисляю предполагаемую абонплату за месяц
Код:
import java.math.*;
import bitel.billing.server.npay.Calculator;
import bitel.billing.common.TimeUtils;

private double getCoast(setup,int cid)
{
      Calendar dt = new GregorianCalendar();
     dt.add(Calendar.MONTH,1);    
      dt.set(Calendar.DAY_OF_MONTH ,dt.getActualMaximum(Calendar.DAY_OF_MONTH));
      Calculator calculator = new Calculator();
      print(TimeUtils.convertCalendarToDateString(dt));
      calculator.setExecutingTime(dt);
      calculator.setPreCalc();
      calculator.initTask(setup, 0, "mid=3");
      calculator.setCids(""+cid);
      print(""+cid);
      calculator.startTask();
      print (calculator.isCalcErrors());
      BigDecimal planAccount = BigDecimal.ZERO;
     if (!calculator.isCalcErrors())
      {
 
        Map planAccountMap = calculator.getCostCache().getContractAccounts();
          planAccount =ru.bitel.common.Utils.maskNull((BigDecimal)planAccountMap.get(сid));
       print(planAccount);
      }
   res =planAccount.doubleValue();
   return  res;
}


При запуске из глобальных скриптов выдаёт ответ как и нужно абонплата за след месяц.
А при запуске по событию(приход платежа) вычисляеться абонплата за день.
как заставить вычислять за месяц из скрипта поведения.

Автор:  Администратор [ 12 окт 2011, 10:21 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

Выложите как вы вызываете это в скрипте. И куда сумму выводите.

Автор:  Brodayga [ 12 окт 2011, 13:23 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

Администратор писал(а):
Выложите как вы вызываете это в скрипте. И куда сумму выводите.

В принципе сам разобрался. Проблема в том что я рассчитываю абонплату для приостановленного договора чтоб по результату активировать. Хватает поступления на месяц или нет.
Но ведь по логике он должен был дать вообще ноль,так как договор приостановлен, а не абонплату за день?

Автор:  romaniozi [ 30 ноя 2011, 15:33 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

Код:
private double getCoast(setup,int cid)
{
      Calendar dt = new GregorianCalendar();
     dt.add(Calendar.MONTH,1);   
      dt.set(Calendar.DAY_OF_MONTH ,dt.getActualMaximum(Calendar.DAY_OF_MONTH));
      Calculator calculator = new Calculator();
      print(TimeUtils.convertCalendarToDateString(dt));
      calculator.setExecutingTime(dt);
      calculator.setPreCalc();
      calculator.initTask(setup, 0, "mid=3");
      calculator.setCids(""+cid);
      print(""+cid);
      calculator.startTask();
      print (calculator.isCalcErrors());
      BigDecimal planAccount = BigDecimal.ZERO;
     if (!calculator.isCalcErrors())
      {
 
        Map planAccountMap = calculator.getCostCache().getContractAccounts();
          planAccount =ru.bitel.common.Utils.maskNull((BigDecimal)planAccountMap.get(сid));
       print(planAccount);
      }
   res =planAccount.doubleValue();
   return  res;
}


Что из себя представляет Setup ? Как его получить, что передавать? Подскажите пожалуйста

Автор:  Cromeshnic [ 01 дек 2011, 06:41 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

Получить можно так:

Код:
setup = ru.bitel.bgbilling.server.util.Setup.getSetup();


зы.
Цитата:
getCoast()

получитьПобережье() ? :)

Автор:  romaniozi [ 01 дек 2011, 13:29 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

Cromeshnic писал(а):
Получить можно так:

Код:
setup = ru.bitel.bgbilling.server.util.Setup.getSetup();


зы.
Цитата:
getCoast()

получитьПобережье() ? :)


Спасибо!
Возможно :) я даже не заметил что не Cost, а Coast.
А можно ли из этого скрипта как-то получить абонплату по отдельности для каждой услуге?

Автор:  Brodayga [ 25 май 2012, 13:08 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

Brodayga писал(а):
Администратор писал(а):
Выложите как вы вызываете это в скрипте. И куда сумму выводите.

В принципе сам разобрался. Проблема в том что я рассчитываю абонплату для приостановленного договора чтоб по результату активировать. Хватает поступления на месяц или нет.
Но ведь по логике он должен был дать вообще ноль,так как договор приостановлен, а не абонплату за день?


В версии 5.2 начал возвращать ноль. Как получить абонплату для приостановленного договора? Устанавливать активен, считать и если не хватает то опять приостановить?
Может подскажете более красивое решение?

Автор:  Brodayga [ 25 май 2012, 17:05 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

Просто смена статуса не помогает, необходимо запустить ещё и задачу установка статусов договоров.

Какие ещё есть решение как получить абонплату за месяц. нужно поменять статус договора с приостановлен на активен в случае прихода платежа >= чем абонплата за месяц по активному тарифу. Версия 5.2

Автор:  snark [ 25 май 2012, 17:15 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

Дебетовые абонплаты это делают автоматом вроде как.

Автор:  Brodayga [ 25 май 2012, 17:20 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

snark писал(а):
Дебетовые абонплаты это делают автоматом вроде как.

Режим снятия подневной. Т.е. договор активируется при приходе платежа хватающего на день.

Автор:  snark [ 25 май 2012, 17:26 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

Дебетовые абонплаты же. Они, ЕМНИМС, в аккурат под это и заточены.

Автор:  Brodayga [ 25 май 2012, 17:31 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

snark писал(а):
Дебетовые абонплаты же. Они, ЕМНИМС, в аккурат под это и заточены.

В описании
http://www.bgbilling.ru//v5.2/doc/ch21s07.html

Цитата:
Перевод договора в активный статус, указанный в переменной debet.npay.active.status, происходит по платежу тогда, когда остаток баланса позволяет перевести открыть договор от текущей даты, начислить ему абонентскую плату и баланс при этом не должен опуститься ниже лимита.

насколько я понимаю если подневной режим снятия то активируется при приходе платежа достаточного чтобы снять дневную наработку. Мне необходима сумма за месяц.

Автор:  snark [ 25 май 2012, 17:49 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

Предыдущие 2 абзаца на той же странице почитайте:
Цитата:
Для каждого активного договора оценивается сумма начислений абонентских плат при тарификации до текущих суток. Оценивается уже начисленная договору наработка за абонентские платы. В случае если уже начисленная наработка более или равна планируемой к начислению не выполняется никаких действий. В случае, если планируемая к начислению наработка больше уже начисленной и её начисление приведёт к понижению баланса договора ниже лимита - статус договора меняется на определённый в переменной конфигурации debet.npay.locked.status.

При подневном начисление абонентских плат до текущего дня блокировка будет производится с начала любых суток. При начислении подневном до конца месяца либо помесячном режиме начисления блокировка возможна только в начале месяца перед первым начислением.

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

Автор:  Brodayga [ 29 май 2012, 13:49 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

В версии 5.2 как получить предполагаемую наработку за месяц для приостановленного договора?

Автор:  Brodayga [ 29 май 2012, 15:34 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

snark писал(а):
Предыдущие 2 абзаца на той же странице почитайте:
Цитата:
Для каждого активного договора оценивается сумма начислений абонентских плат при тарификации до текущих суток. Оценивается уже начисленная договору наработка за абонентские платы. В случае если уже начисленная наработка более или равна планируемой к начислению не выполняется никаких действий. В случае, если планируемая к начислению наработка больше уже начисленной и её начисление приведёт к понижению баланса договора ниже лимита - статус договора меняется на определённый в переменной конфигурации debet.npay.locked.status.

При подневном начисление абонентских плат до текущего дня блокировка будет производится с начала любых суток. При начислении подневном до конца месяца либо помесячном режиме начисления блокировка возможна только в начале месяца перед первым начислением.

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

С блокировкой проблем нет!
Есть проблема с активацией и для этого необходимо знать сколько должно сняться у абонента за месяц. Стандартная схема активации не подходит т.к. у абонента стоит абонплата с подневным режимом снятия
допустим абонплата в месяц 30 рублей. Тогда в день у него грубо говоря 1 рубль. Мне необходимо активировать абонента если насчёт придёт 30 рублей (или другая сумма X процентов от месячной) а не 1 рубль. Месячный режим снятия не подходит по другим причинам.

Автор:  snark [ 29 май 2012, 16:32 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

"Абонентка до текущего дня" и т.п. тоже не подходят?

Автор:  Brodayga [ 29 май 2012, 17:09 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

snark писал(а):
"Абонентка до текущего дня" и т.п. тоже не подходят?

оно и есть . Это никак не решает проблему. Т.к. договор активируется при поступлении средств хватающих снять абонплату за один день!!!

Автор:  skyb [ 06 июн 2012, 07:25 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

Brodayga
Как то решили вопрос?

Автор:  Brodayga [ 06 июн 2012, 12:46 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

skyb писал(а):
Brodayga
Как то решили вопрос?

Нет.

Автор:  skyb [ 06 июн 2012, 12:56 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

Brodayga
А куда запихиваете этот скрипт? У меня сейчас работает со статическими суммами, положен он в библиотеки скриптов и в функции скриптов поведения, на событие запрос доп баланса при разблокировке, у вас так же?

Автор:  Brodayga [ 06 июн 2012, 18:05 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

skyb писал(а):
Brodayga
А куда запихиваете этот скрипт? У меня сейчас работает со статическими суммами, положен он в библиотеки скриптов и в функции скриптов поведения, на событие запрос доп баланса при разблокировке, у вас так же?

У меня функции скриптов поведения приход платежа. А у вас договор приостановлен в момент выполнения?
Также тестировал и в глобальных скриптах.
Попробую на запрос доп баланса , по идее не должно влиять.

Автор:  Brodayga [ 06 июн 2012, 20:12 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

проблема решена если можно так сказать.
все дело было
calculator.setActiveFromDate( null );
удалил и начал считать.
Сам не знаю зачем взял скрипт с вики, а не скопировал старый.

Автор:  skyb [ 07 июн 2012, 04:45 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

Brodayga
Тоесть у вас весь код в
Цитата:
У меня функции скриптов поведения приход платежа.
и все? а можете дать его?

Автор:  Brodayga [ 07 июн 2012, 11:56 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

skyb писал(а):
Brodayga
Тоесть у вас весь код в
Цитата:
У меня функции скриптов поведения приход платежа.
и все? а можете дать его?

Код:
private double getCost(int cid)
{
      Calendar dt = new GregorianCalendar();
      dt.add(Calendar.MONTH,1);    
      dt.set(Calendar.DAY_OF_MONTH ,dt.getActualMaximum(Calendar.DAY_OF_MONTH));
      Calculator calculator = new Calculator();
      print(TimeUtils.convertCalendarToDateString(dt));
      calculator.setExecutingTime(dt);
      calculator.setPreCalc();
     calculator.setActiveFromDate( dt );
      calculator.initTask(setup, 0, "mid=2");
      calculator.setCids(""+cid);
      print(""+cid);
      calculator.startTask();
      print (calculator.isCalcErrors());
      BigDecimal planAccount = BigDecimal.ZERO;
     if (!calculator.isCalcErrors())
      {
        planAccount = BigDecimal.ZERO;
        Map planAccountMap = calculator.getCostCache().getContractAccounts();
      if (planAccountMap.get(cid)!=null)
        planAccount = ru.bitel.common.Utils.maskNull((BigDecimal)planAccountMap.get(cid));
      }
   res =planAccount.doubleValue()*dt.getActualMaximum(Calendar.DAY_OF_MONTH);
   return  res;
}


   cid = event.getContractID();
   contractManager = new ContractManager( con );
   contract = contractManager.getContractByID( cid );
   bu = new BalanceUtils( con );
   time = event.getGenerateTime().clone();
   balance = bu.getBalance ( time.getTime(), cid ).floatValue();
   limit = contract.getBalanceLimit().floatValue();
   abon = getCost(cid);

print( "abon for tarif: " +abon);
print("limit "+limit);
print("balance "+balance);

но расчёт работает правильно только для приостановленного или закрытого договора
Далее уже по вашей логике все данные есть.
В 5.0 использовал скрипты и для приостановки и для активации. На 5.2 перекину на запрос дополнительного расхода. Так будет проще и правельней.
немного облагородить осталось
Код:
import java.math.*;
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.tariff.bean.*;
import bitel.billing.server.script.event.*;
import bitel.billing.server.ipn.bean.*;
import bitel.billing.common.KernelConst;
import java.util.*;
import java.text.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
import bitel.billing.server.util.*;
import ru.bitel.bgbilling.server.util.*;
import java.sql.*;
import bitel.billing.server.admin.eventbus.*;
import bitel.billing.server.dialup.bean.busevent.*;
import java.math.*;
import bitel.billing.server.npay.Calculator;
import bitel.billing.common.TimeUtils;
 
private double getCost(int cid)
{
      Calendar dt = new GregorianCalendar();
      dt.set(Calendar.DAY_OF_MONTH ,dt.getActualMaximum(Calendar.DAY_OF_MONTH));
      Calculator calculator = new Calculator();
      print(TimeUtils.convertCalendarToDateString(dt));
      calculator.setExecutingTime(dt);
      calculator.setPreCalc();
     calculator.setActiveFromDate( dt );
   setup = ru.bitel.bgbilling.server.util.Setup.getSetup();
      calculator.initTask(setup, 0, "mid=2");
      calculator.setCids(""+cid);
      print(""+cid);
      calculator.startTask();
      print (calculator.isCalcErrors());
      BigDecimal planAccount = BigDecimal.ZERO;
       if (!calculator.isCalcErrors())
        {
              Map planAccountMap = calculator.getCostCache().getContractAccounts();
            planAccount = ru.bitel.common.Utils.maskNull((BigDecimal)planAccountMap.get(cid));
       
      }
   res =planAccount.doubleValue()*(dt.getActualMaximum(Calendar.DAY_OF_MONTH)-1);
   return  res;
}

public void onEvent( event, setup, con, conSlave )
{
   print("cost =" +getCost(event.getContractID()));
    event.setSumma(  new BigDecimal( getCost(event.getContractID()) )  );
}


Автор:  skyb [ 08 июн 2012, 05:06 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

Brodayga Это у вас динкод чтоль? или bgbs ???

Автор:  stark [ 08 июн 2012, 12:52 ]
Заголовок сообщения:  Re: Получение предполагаемой наработки по абонплатам за меся

skyb писал(а):
Brodayga Это у вас динкод чтоль? или bgbs ???

bgbs

Страница 2 из 3 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/