forum.bitel.ru http://forum.bitel.ru/ |
|
[feature request] NpayModuleQuantity (CRM) http://forum.bitel.ru/viewtopic.php?f=16&t=10073 |
Страница 1 из 1 |
Автор: | Cromeshnic [ 13 янв 2015, 09:50 ] |
Заголовок сообщения: | [feature request] NpayModuleQuantity |
Нам нужны абонплаты, пропорциональные количеству абонплат (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, 09:51 ] |
Заголовок сообщения: | Re: [feature request] NpayModuleQuantity |
Ну и ссылка, чтобы понимать, о чём речь вообще: http://bgbilling.ru/v5.2/doc/ch22s04s04.html |
Автор: | stark [ 13 янв 2015, 11:16 ] |
Заголовок сообщения: | Re: [feature request] NpayModuleQuantity |
добавил в TODO |
Автор: | Cromeshnic [ 13 янв 2015, 11:30 ] |
Заголовок сообщения: | Re: [feature request] NpayModuleQuantity (CRM) |
Спасибо! |
Автор: | Cromeshnic [ 13 янв 2015, 17:18 ] |
Заголовок сообщения: | Re: [feature request] NpayModuleQuantity |
Поправка: забыл учесть поле 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; } } Потестил - работает на ура. |
Автор: | Cromeshnic [ 13 янв 2015, 17:24 ] |
Заголовок сообщения: | Re: [feature request] NpayModuleQuantity |
В конфиге абонплат: Код: 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 |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |