BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 21 июн 2025, 23:24

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




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
СообщениеДобавлено: 14 ноя 2012, 18:11 
Доброго времени суток.

Пытаюсь получить параметры тарифа в биллинге вер. 5.2:
Код:
package ru.ttk.billing.event.GlobalScript;

import bitel.billing.server.contract.bean.ContractManager;
import bitel.billing.server.tariff.TariffTreeSet;
import java.util.Calendar;
import java.util.GregorianCalendar;
import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.sql.ConnectionSet;

public class test extends GlobalScriptBase{
    @Override
    public void execute( Setup setup, ConnectionSet connectionSet )
            throws Exception{
        Calendar dt = new GregorianCalendar();
        int cid = 79343;
       
        TariffTreeSet tts = new ContractManager(connectionSet.getConnection()).getRealtimeTariffTreeSet(cid, dt, "npay", 7, true);

    }   
}

Получаю ошибку:
Код:
11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream - java.lang.InstantiationException: ru.bitel.bgbilling.modules.npay.tariff.server.CalculateModeTariffTreeNode
11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream -     at java.lang.Class.newInstance0(Class.java:340)
11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream -     at java.lang.Class.newInstance(Class.java:308)
11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream -     at bitel.billing.server.tariff.TariffModuleTree.createNode(TariffModuleTree.java:206)
11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream -     at bitel.billing.server.tariff.TariffModuleTree.loadTree(TariffModuleTree.java:133)
11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream -     at bitel.billing.server.tariff.TariffModuleTree.load(TariffModuleTree.java:39)
11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream -     at bitel.billing.server.tariff.TariffTreeSet.getModuleTree(TariffTreeSet.java:51)
11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream -     at bitel.billing.server.tariff.TariffTreeSet.addTariffTree(TariffTreeSet.java:73)
11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream -     at bitel.billing.server.contract.bean.ContractManager.getRealtimeTariffTreeSet(ContractManager.java:656)
11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream -     at bitel.billing.server.contract.bean.ContractManager.getRealtimeTariffTreeSet(ContractManager.java:597)
11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream -     at ru.ttk.billing.event.GlobalScript.test.execute(test.java:26)
....

Прошу подсказать, что я делаю не так.


Вернуться к началу
  
 
СообщениеДобавлено: 15 ноя 2012, 12:12 
Код:
TariffTreeSet tts = new ContractManager( connectionSet.getConnection() ).getRealtimeTariffTreeSet( cid, dt, "ipn", 4, true );

Для модуля IPN работает.

Подскажите как в биллинге 5.2 получить параметры тарифа для модуля NPAY.


Вернуться к началу
  
 
СообщениеДобавлено: 15 ноя 2012, 12:45 
Под параметрами тарифа модуля NPAY, я подразумеваю не только размер абонплаты, но еще и режим снятия (месячный, дневной и т.д.).
На форуме и в wiki есть примеры получения размера абонплаты.
Как получить режим снятия?


Вернуться к началу
  
 
СообщениеДобавлено: 16 ноя 2012, 12:25 
Жаль что диалога не получилось...

Приведу пример, того как можно получить параметры тарифа, скрипт рассчитан только на 2 режима списания: месячный и дневной.
Как будет работать в других условиях я не знаю.

Код:
package ru.ttk.billing.event.GlobalScript;

import bitel.billing.common.TimeUtils;
import bitel.billing.server.npay.bean.ServiceObject;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;
import ru.bitel.bgbilling.kernel.tariff.tree.server.TariffModuleTree;
import ru.bitel.bgbilling.kernel.tariff.tree.server.TariffModuleTreeSet;
import ru.bitel.bgbilling.kernel.tariff.tree.server.TariffModuleTreeSetDao;
import ru.bitel.bgbilling.modules.npay.tariff.server.NPayTariffContext;
import ru.bitel.bgbilling.modules.npay.tariff.server.NPayTariffRequest;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.Preferences;
import ru.bitel.common.model.Period;
import ru.bitel.common.sql.ConnectionSet;

/**
 *
 * @author lda
 */
public class test extends GlobalScriptBase{
   
    @Override
    public void execute( Setup setup, ConnectionSet connectionSet )
            throws Exception{

        int cid = 79343;
        int mid = 7;
        Calendar dt = TimeUtils.clear_HOUR_MIN_MIL_SEC(Calendar.getInstance());
        Calendar startMonth = TimeUtils.getStartMonth( dt );
        Calendar endMonth = TimeUtils.getEndMonth( dt );     
        int daysInMonth = startMonth.getActualMaximum( Calendar.DAY_OF_MONTH );
        Connection con = connectionSet.getConnection();
        Connection conSlave = connectionSet.getSlaveConnection();
        try {       
            TariffModuleTreeSetDao tariffModuleTreeSetDao = new TariffModuleTreeSetDao( con );

            Preferences moduleSetup = setup.getModuleSetup( mid );
           
            NPayTariffContext context  = new NPayTariffContext( moduleSetup, con, mid, startMonth, endMonth, endMonth, String.valueOf(cid), null );
            context.setPrecalcOpenPeriod( new Period( TimeUtils.convertCalendarToDate( startMonth ), null ) );
           
            String query =
                "SELECT cid, sid, col, emid, eid " +
                "FROM npay_service_object_" + mid + " " +
                "WHERE (date1 IS NULL OR date1<=?) AND (date2 IS NULL OR date2>=?) ";
            query += " AND cid IN (" + cid + ")";
            query += " ORDER BY cid, sid";

            PreparedStatement ps = conSlave.prepareStatement( query );
            ps.setDate( 1, TimeUtils.convertCalendarToSqlDate( dt ) );
            ps.setDate( 2, TimeUtils.convertCalendarToSqlDate( dt ) );
            ResultSet rs = ps.executeQuery();
            while( rs.next() ){
                    ServiceObject serviceObject = new ServiceObject();

                    serviceObject.setContractId( rs.getInt( 1 ) );
                    serviceObject.setServiceId( rs.getInt( 2 ) );
                    serviceObject.setDate1( TimeUtils.convertCalendarToDate(startMonth ));
                    serviceObject.setDate2( TimeUtils.convertCalendarToDate(endMonth ) );
                    serviceObject.setCol( rs.getInt( 3 ) );
                    serviceObject.setEntityMid( rs.getInt( 4 ) );
                    serviceObject.setEntityId( rs.getInt( 5 ) );
                   
                    int emid = serviceObject.getEntityMid();
                    int eid = serviceObject.getEntityId();
                    int col = serviceObject.getCol();
                    int sid = serviceObject.getServiceId();
                   
                    Calendar serviceStart = TimeUtils.convertDateToCalendar( serviceObject.getDate1() );
                    Calendar serviceEnd = TimeUtils.convertDateToCalendar( serviceObject.getDate2() );
                   
                    Calendar date1 = (Calendar)serviceStart.clone();
                    Calendar date2 = (Calendar)serviceEnd.clone();
                   
                    TariffModuleTreeSet tts = tariffModuleTreeSetDao.getTariffTreeSetForDay(cid, dt, "npay", mid, emid, eid);
                    for( TariffModuleTreeSet.Entry tariffPeriod : tts.entries() ){
                        List<NPayTariffRequest.NPayServiceCost> serviceCostList = Collections.singletonList( new NPayTariffRequest.NPayServiceCost( sid, serviceStart, serviceEnd, date1, date2, col ) );
                        NPayTariffRequest req = new NPayTariffRequest( mid, cid, sid );
                        req.setInfoEnable( true );
                        req.setConnectionSet( connectionSet );
                        req.setAccountingMonthDays( daysInMonth );
                        req.setTime( date1 );

                        req.setServiceCost( sid,  serviceCostList);

                        final TariffModuleTree tree = tariffPeriod.getTree();

                        tree.execute( req, context );

                        if( req.isAccepted() ){
                            boolean isDayMode = req.toString().indexOf("Day mode") != -1;
                            for( NPayTariffRequest.NPayServiceCost serviceCost : req.getServiceCostList() ){
                                print("cost="+serviceCost.cost);
                                print("isDayMode="+isDayMode);
                            }
                        }
                    }
            }            
            ps.close();
            tariffModuleTreeSetDao.freeResources();
        }catch( Exception e ){
            e.printStackTrace();
        }
    }
}


Криво конечно, но работает.
Если кто нибудь приведет другой пример, буду благодарен.


Последний раз редактировалось lda 19 ноя 2012, 18:30, всего редактировалось 2 раз(а).

Вернуться к началу
  
 
СообщениеДобавлено: 17 ноя 2012, 01:36 
Не в сети
Клиент

Зарегистрирован: 12 фев 2008, 18:10
Сообщения: 3951
Карма: 249
lda писал(а):
Код:
...
FROM npay_service_object_" + mid + " " +
"WHERE (date1 IS NULL OR date1<=?)
...


Дата начала действия услуги может быть не установлена?


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

Зарегистрирован: 20 апр 2011, 09:56
Сообщения: 346
Карма: 19
Для меня тоже тема получения цен актуальна, хотел сделать генерируемый прайс лист, но все руки не доходят. Писал запрос на получение цен с помесячным снятием, на вики вроде был, но там не учитываются тарифы с копированным деревом, что очень не удобно.

Код из первого поста у меня отрабатывается без ошибок, те лист возвращает, но я не смотрел есть в нем чтото или нет.

PS. Еще думал в сторону функций mysql, думаю через них было бы удачнее эту задачу реализовать, и получать суммы, режим списания, множители простыми запросами в БД.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 ноя 2012, 12:00 
snark писал(а):
lda писал(а):
Код:
...
FROM npay_service_object_" + mid + " " +
"WHERE (date1 IS NULL OR date1<=?)
...


Дата начала действия услуги может быть не установлена?


В теории может, на практике маловероятно.
Это просто общий подход к объектам, имеющим период действия.


Вернуться к началу
  
 
СообщениеДобавлено: 19 ноя 2012, 12:08 
aiwbend писал(а):
Для меня тоже тема получения цен актуальна, хотел сделать генерируемый прайс лист, но все руки не доходят. Писал запрос на получение цен с помесячным снятием, на вики вроде был, но там не учитываются тарифы с копированным деревом, что очень не удобно.

Код из первого поста у меня отрабатывается без ошибок, те лист возвращает, но я не смотрел есть в нем чтото или нет.

PS. Еще думал в сторону функций mysql, думаю через них было бы удачнее эту задачу реализовать, и получать суммы, режим списания, множители простыми запросами в БД.


Очень не рекомендую Вам получать параметры тарифа напрямую из MySql.
Известно ли Вам, что биллинг кэширует параметры тарифа?
Получать параметры тарифа из кеша на порядок быстрее чем напрямую из базы.

Посмотрите что выводит req.toString(), в тарифах с разным типом тарификации, может быть вам это поможет.


Вернуться к началу
  
 
СообщениеДобавлено: 19 ноя 2012, 12:23 
aiwbend писал(а):
Писал запрос на получение цен с помесячным снятием, на вики вроде был, но там не учитываются тарифы с копированным деревом, что очень не удобно.


Мне не совсем понятно, что значит "тарифы с копированным деревом", наверное вы имели ввиду персональные тарифы.

Вот эта статья: http://wiki.bgbilling.ru/index.php/%D0% ... 1%82%D1%8B

Этот пример не работает с персональными тарифами.

Мой пример персональные тарифы обрабатывает.


Вернуться к началу
  
 
СообщениеДобавлено: 19 ноя 2012, 13:39 
Не в сети

Зарегистрирован: 20 апр 2011, 09:56
Сообщения: 346
Карма: 19
lda писал(а):
Посмотрите что выводит req.toString(), в тарифах с разным типом тарификации, может быть вам это поможет.

В чем поможет?
lda писал(а):
Мне не совсем понятно, что значит "тарифы с копированным деревом", наверное вы имели ввиду персональные тарифы.

Голобальные тарифы с parent_tree
lda писал(а):
Очень не рекомендую Вам получать параметры тарифа напрямую из MySql.
Известно ли Вам, что биллинг кэширует параметры тарифа?
Получать параметры тарифа из кеша на порядок быстрее чем напрямую из базы.

соглашусь, лучше наверно будет написать универсальный класс который будет возвращать нужную инфу по id тарифа.

PS.Я просто дискуссировал на тему получения инфы из тарифа, с какими трудностями я столкнулся и размашлял как лучше и универсально, с учетом всех деталей(унаследованным деревом, учетом периодов и тп) реализовать это, а Вы мне про персональные тарифы... :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 ноя 2012, 15:28 
aiwbend писал(а):
PS.Я просто дискуссировал на тему получения инфы из тарифа, с какими трудностями я столкнулся и размашлял как лучше и универсально, с учетом всех деталей(унаследованным деревом, учетом периодов и тп) реализовать это, а Вы мне про персональные тарифы... :)


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

По поводу персональных тарифов.
Я предположил что "тарифы с копированным деревом" это персональные тарифы унаследованные от глобальных.

Если Вы получаете абонплату использую стандартное API, то унаследованные тарифа там должны обрабатываться.

Можете показать пример, который не обрабатывает "тарифы с копированным деревом"?
У вас биллинг 5.2?


Вернуться к началу
  
 
СообщениеДобавлено: 19 ноя 2012, 16:56 
Не в сети

Зарегистрирован: 20 апр 2011, 09:56
Сообщения: 346
Карма: 19
lda писал(а):
Можете показать пример, который не обрабатывает "тарифы с копированным деревом"?
У вас биллинг 5.2?

Когда я ковырял все это дело был 5.1, и я яро хотел все сделать через SQL чтобы можно было использовать это быстро, там где потребуется. Да и в API на тот момент ничего подходящего не нашел, наверное плохо искал. Да и динкода не было еще.

В итоге натыкал такое, где не учитывается все выше сказанное :)

Код:
SELECT p.id, p.title, mtree_node.type, sum(MID(DATA,13)) AS abon, SUBSTRING_INDEX(DATA, "%", 1) AS type
FROM tariff_plan AS p
LEFT JOIN tariff_tree_link ON tariff_tree_link.tpid=p.id
LEFT JOIN module_tariff_tree ON module_tariff_tree.tree_id=tariff_tree_link.tree_id AND module_tariff_tree.mid=5
LEFT JOIN mtree_node ON mtree_node.mtree_id=module_tariff_tree.id
WHERE mtree_node.type LIKE '%_cost'
GROUP BY p.id


в общем уныло и не универсально, но все равно пользуюсь где условия позволяют.


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

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


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

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


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

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