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

Разблокировка по достаточному платежу
http://forum.bitel.ru/viewtopic.php?f=19&t=7742
Страница 1 из 1

Автор:  skyb [ 18 фев 2013, 12:09 ]
Заголовок сообщения:  Разблокировка по достаточному платежу

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

Код:
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.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 );
      setup = ru.bitel.bgbilling.server.util.Setup.getSetup();
      calculator.initTask(setup, 0, "mid=4");
      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.3);
   return  res;
}

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

Автор:  Akhmat [ 18 фев 2013, 15:31 ]
Заголовок сообщения:  Re: Разблокировка по достаточному платежу

убери dt.add(Calendar.MONTH,1);
не помню точно, он тогда будет учитывать фактически начисленную абоненту. если да, то учитываешь ее тоже

Автор:  skyb [ 18 фев 2013, 17:11 ]
Заголовок сообщения:  Re: Разблокировка по достаточному платежу

тада получается сумма вместо 700 больше 12килорублей

Автор:  snark [ 18 фев 2013, 17:35 ]
Заголовок сообщения:  Re: Разблокировка по достаточному платежу

Это твой календарь:
Код:
Calendar dt = new GregorianCalendar();


Тут ты к календарю добавляешь 1 месяц (чтобы считало следующий):
Код:
dt.add(Calendar.MONTH, 1);


Тут ты устанавливаешь текущий день месяца в последний день месяца:
Код:
dt.set(Calendar.DAY_OF_MONTH ,dt.getActualMaximum(Calendar.DAY_OF_MONTH));


Тут уже считаешь на основе своего календаря:
Код:
calculator.setExecutingTime(dt);
...
calculator.setActiveFromDate(dt);


Короче - скорми калькулятору _правильную_ дату исходя из задачи и все начнет считаться.

Автор:  skyb [ 18 фев 2013, 18:08 ]
Заголовок сообщения:  Re: Разблокировка по достаточному платежу

исходя из задачи необходимо убрать dt.add(Calendar.MONTH, 1); но убирая это сумма увеличивается в разы

Автор:  snark [ 18 фев 2013, 18:12 ]
Заголовок сообщения:  Re: Разблокировка по достаточному платежу

Про дни месяца ты так и не прочитал :(

Автор:  skyb [ 18 фев 2013, 18:56 ]
Заголовок сообщения:  Re: Разблокировка по достаточному платежу

а я так и не понял, что не так то?

Автор:  braek-neck [ 28 фев 2013, 16:45 ]
Заголовок сообщения:  Re: Разблокировка по достаточному платежу

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


держи, под себя думаю переделаешь.

Код:
// функция получения стоимости абонплаты за 30 дней.
private TarifNpayCost(int CID, String NPayMID, String npaysid, java.sql.Connection con, setup)
{
   Calendar dt = new GregorianCalendar();
    Calculator calculator = new Calculator();
    calculator.setExecutingTime(dt);
    calculator.setPreCalc();
    calculator.initTask(setup, 0, "mid="+NPayMID);
   String cid = Integer.toString(CID);
    calculator.setCids(cid);
    calculator.startTask();
 
    if (!calculator.isCalcErrors())
    {
        BigDecimal planAccount = BigDecimal.ZERO;
        Map planAccountMap = calculator.getCostCache().getContractAccounts();
        for (Integer contractId : ru.bitel.common.Utils.stringToIntegerList(cid))
          {
           if(planAccountMap.get(contractId)!=null)
         {
            planAccount = planAccount.add((BigDecimal)planAccountMap.get(contractId));
         }
          }
 
      CConstr = new Contract();
      BUConstr = new BalanceUtils(con);
      CConstr.setID(CID);
      planAccountSumma = BUConstr.getAccountSumma(CConstr, dt, npaysid);
      //print(planAccountSumma);
      //print(planAccount);
      cost = planAccount.subtract(planAccountSumma);
      //print(cost);
      npaycost = cost.multiply(new BigDecimal("30.00"));
      //print(npaycost);
      npaycost = npaycost.toBigInteger();
      //print(npaycost);
      return npaycost;
    }

}

Автор:  skyb [ 28 фев 2013, 18:27 ]
Заголовок сообщения:  Re: Разблокировка по достаточному платежу

а с февралем как? =)

Автор:  braek-neck [ 28 фев 2013, 18:36 ]
Заголовок сообщения:  Re: Разблокировка по достаточному платежу

у меня при активации учетный период создается равный 30 дням, не зависимо от того сколько дней в месяце. поэтому и сумму вычисляю за тридцать дней.

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