Генерация прайса модуля IP телефонии в карточке договора
Материал из BiTel WiKi
Версия биллинга от 4.6.
Ставится задача преобразования тарифного плана модуля IP телефонии, например такого вида.
К удобочитаемому прайсу например такого вида:
Задача решается с помощью вызова функции библиотеки скриптов из XSLT шаблона, см. здесь: http://wiki.bgbilling.ru/index.php/XSLT
Создается библиотека скриптов с названием price и следующим содержимым:
import org.w3c.dom.*; import bitel.billing.server.contract.bean.*; import bitel.billing.server.util.*; import bitel.billing.server.tariff.*; int mid = 6; int sid = 7; private void addPriceItem( Element section, TariffModuleTree tree, Calendar time, int cid, String prefix, String title ) { item = Utils.createElement( section, "item" ); item.setAttribute( "title", title ); // req = new TariffRequest(); req.setRequestParam( "time", time ); req.setRequestParam( "phone", prefix ); req.setRequestParam( "sid", sid ); req.setRequestParam( "call_type", 1 ); // tree.processRequest( req ); if( req.wasAccepted() ) { minCost = req.getResponseParam( "min_cost" ); if( minCost != null ) { item.setAttribute( "cost", Utils.formatCost( minCost ) ); } } } public Node getVoipPrice( String cidString ) { cid = Utils.parseIntString( cidString ); time = new GregorianCalendar(); // ctx = getContext(); con = ctx.con; // doc = Utils.createDocument(); result = doc.createElement( "price" ); // tts = new ContractManager( con ).getRealtimeTariffTreeSet( cid, time, "voiceip", mid, true ); tree = tts.getTree( time ); if( tree != null ) { Element section = null; // section = Utils.createElement( result, "section" ); section.setAttribute( "title", "Территория России" ); // addPriceItem( section, tree, time, cid, "7495", "Москва" ); addPriceItem( section, tree, time, cid, "7347", "Уфа" ); } // // Utils.serializeXML( result, System.out, "windows-1251" ); // return result; }
Параметры mid и sid необходимо заменить на ваш код экземпляра модуля и код услуги IP телефонии. Функция getVoipPrice возвращает XML дерево примерно следующего содержимого:
<price> <section title="Территория России"> <item cost="1.20" title="Москва"/> <item cost="4.30" title="Уфа"/> </section> </price>
Обратите внимаение, что перечень секций и направлений с "префиксом-представителем" задаются в скрипте. Скрипт фактически создаёт тарифный план для договора и вызывает в нём тарифный запрос для получения цен.
Для вызова скрипта в шаблоне карточки договора скорректируйте заголовок XSLT шаблона следующим образом:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xalan="http://xml.apache.org/xalan" xmlns:script="bitel.billing.server.util.exslt.Scripting" version="1.0"> <xalan:component prefix="script" functions="invoke"> <xalan:script lang="javaclass" src="xalan://bitel.billing.server.util.exslt.Scripting"/> </xalan:component> .....
Таблица с прайсом генерируется примерно таким способом. Обратите внимание, что сначала перебираются секции, а потом каждое направление (item) в секции.
... <!-- начало таблицы с прайсом --> <fo:table table-layout="fixed"> <fo:table-column column-width="proportional-column-width(1)"/> <fo:table-column column-width="proportional-column-width(1)"/> <xsl:variable name="cid" select="string(contract/@cid)"/> <fo:table-body> <fo:table-row> <fo:table-cell><fo:block>Тарифы на телефонные звонки</fo:block></fo:table-cell> <fo:table-cell><fo:block>Руб. в минуту</fo:block></fo:table-cell> </fo:table-row> <xsl:for-each select="script:invoke('price','getVoipPrice', $cid)/section"> <fo:table-row> <fo:table-cell><fo:block><xsl:value-of select="@title"/></fo:block></fo:table-cell> <fo:table-cell><fo:block></fo:block></fo:table-cell> </fo:table-row> <xsl:for-each select="item"> <fo:table-row> <fo:table-cell><fo:block><xsl:value-of select="@title"/></fo:block></fo:table-cell> <fo:table-cell><fo:block><xsl:value-of select="@cost"/></fo:block></fo:table-cell> </fo:table-row> </xsl:for-each> </xsl:for-each> </fo:table-body> </fo:table> ...