BiTel

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

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




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: [feature request] NpayModuleQuantity
СообщениеДобавлено: 13 янв 2015, 09:50 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Нам нужны абонплаты, пропорциональные количеству абонплат (sic!) :)
Что-то типа такого:

Код:
module.quantity.1.mid=<mid>
module.quantity.1.class=ru.bitel.bgbilling.modules.npay.server.bean.NpayModuleQuantity
#абонплаты, которые умножаем на количество
module.quantity.1.sids=103
#абонплаты, количество которых считаем в модуле <mid>
module.quantity.1.targetSids=21,22,23


Практическая задача:
У нас уже есть абонплата за телефонную линию.
От количества пойнтов телефонии она не зависит, т.к. один номер может иметь несколько линий и наоборот.
Поэтому PhoneModuleQuantity не используется - вместо этого на договорах заводится столько абонплат, сколько линий подключили клиенту.
Появилась задача сделать дополнительную услугу: удешевление звонков на определённые направления за дополнительную абонплату. Делаем отдельный тариф с меньшей позицией, в котором считаем нужные звонки. Там же считается абонплата.
Абонплата за эту услугу должна быть также кратна количеству линий.
Как такое сделать?
Вариант 1: увеличивать абонплату за линию. Не логично с точки зрения бизнес-логики, т.к. это не абонплата за линию, а другая доп. услуга.
Вариант 2: создать отдельную абонплату для этой услуги и добавлять её по количеству линий. Но это неудобно, т.к. придётся следить, чтобы количество абонплат за линию на договоре совпадало с количеством абонплат за эту услугу.
Вариант 3: реализовать абонплаты, зависящие от количества абонплат. Тогда достаточно добавить одну абонплату за эту услугу и считать её кратной абонплатам за линию.

Я могу сам реализовать класс NpayModuleQuantity, но красивее было бы иметь стандартный.
Вот что накидал, но пока не тестировал:

Код:
package ru.dsi.bgbilling.modules.npay.server.bean;

import bitel.billing.server.npay.bean.ModuleQuantity;
import ru.bitel.common.Utils;
import ru.bitel.common.model.Period;

import java.sql.Connection;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;

/**
 * Класс для абонплат, зависящих от количества других абонплат
 */
public class NpayModuleQuantity extends ModuleQuantity {

    /**
     * Услуги абонплат, количество которых считаем
     */
    private List<Integer> targetSids;

    /**
     * Костыль - берём в sids только первый id из списка, остальные пихаем в targetSids
     * Т.о. первый sid - это абонплата, которую умножаем, а все остальные - те, чьё количество будем считать
     */
    @Override
    public void setSids(List<Integer> sids) {
        if(sids.size()>1) {
            this.targetSids=sids.subList(1,sids.size());
            sids=Collections.singletonList(sids.get(0));
        }else{
            this.targetSids=Collections.<Integer>emptyList();
        }
        super.setSids(sids);
    }

    @Override
    public List<Period> getPeriodQuantity(Connection con, int cid, Calendar from, Calendar to) {
        return getPeriodsFromTable(con, "npay_service_object_" + getMid(), cid, from, to, " AND sid in (-1,"+
                Utils.toString(this.targetSids)+")");
    }
}


Как видно, несколько костыльно, т.к. в текущем фреймворке нет возможности явно задать targetSids через конфиг.


Последний раз редактировалось Cromeshnic 13 янв 2015, 11:35, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [feature request] NpayModuleQuantity
СообщениеДобавлено: 13 янв 2015, 09:51 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Ну и ссылка, чтобы понимать, о чём речь вообще:
http://bgbilling.ru/v5.2/doc/ch22s04s04.html


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [feature request] NpayModuleQuantity
СообщениеДобавлено: 13 янв 2015, 11:16 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
добавил в TODO


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [feature request] NpayModuleQuantity (CRM)
СообщениеДобавлено: 13 янв 2015, 11:30 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [feature request] NpayModuleQuantity
СообщениеДобавлено: 13 янв 2015, 17:18 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Поправка: забыл учесть поле col (количество) у абонплат.

Рабочая версия:
Код:
package ru.dsi.bgbilling.modules.npay.server.bean;

import bitel.billing.common.TimeUtils;
import bitel.billing.server.npay.bean.ModuleQuantity;
import ru.bitel.bgbilling.server.util.ServerUtils;
import ru.bitel.common.Utils;
import ru.bitel.common.model.Period;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;

/**
 * Класс для абонплат, зависящих от количества других абонплат
 */
public class NpayModuleQuantity extends ModuleQuantity {

    /**
     * Услуги абонплат, количество которых считаем
     */
    private List<Integer> targetSids;

    /**
     * Костыль - берём в sids только первый id из списка, остальные пихаем в targetSids
     * Т.о. первый sid - это абонплата, которую умножаем, а все остальные - те, чьё количество будем считать
     */
    @Override
    public void setSids(List<Integer> sids) {
        if(sids.size()>1) {
            this.targetSids=sids.subList(1,sids.size());
            sids=Collections.singletonList(sids.get(0));
        }else{
            this.targetSids=Collections.<Integer>emptyList();
        }
        super.setSids(sids);
    }

    @Override
    public List<Period> getPeriodQuantity(Connection con, int cid, Calendar from, Calendar to) {
        return getPeriodsFromTable(con, "npay_service_object_" + getMid(), cid, from, to, " AND sid in (-1,"+
                Utils.toString(this.targetSids)+")");
    }

    @Override
    protected List<Period> getPeriodsFromTable(Connection con, String tableName, int cid, Calendar from, Calendar to, String filter)
    {
        List<Period> result = new ArrayList<Period>();
        try
        {
            if (ServerUtils.tableExists(con, tableName))
            {
                String query = "SELECT date1, date2, col FROM " + tableName + " WHERE cid=? " + "AND (date1 IS NULL OR date1<=?) AND (date2 IS NULL OR date2>=?) ";
                if (Utils.notBlankString(filter))
                {
                    query = query + filter;
                }
                PreparedStatement ps = con.prepareStatement(query);
                ps.setInt(1, cid);
                ps.setDate(2, TimeUtils.convertCalendarToSqlDate(to));
                ps.setDate(3, TimeUtils.convertCalendarToSqlDate(from));
                ResultSet rs = ps.executeQuery();
                while (rs.next())
                {
                    //добавляем столько периодов, какое количество указано в абонплате
                    for(int i=0;i<rs.getInt(3);i++){
                        result.add(new Period(rs.getDate(1), rs.getDate(2)));
                    }
                }
                ps.close();
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return result;
    }
}



Потестил - работает на ура.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [feature request] NpayModuleQuantity
СообщениеДобавлено: 13 янв 2015, 17:24 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
В конфиге абонплат:

Код:
module.quantity.1.mid=16
module.quantity.1.class=ru.dsi.bgbilling.modules.npay.server.bean.NpayModuleQuantity
#Первая услуга в списке - та, которую будем умножать. Остальные - те, на чьё количество будем умножать.
module.quantity.1.sids=549,30,31,148,270,455,491


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

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


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

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


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

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