Нам нужны
абонплаты, пропорциональные количеству абонплат (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 через конфиг.