Генерация прайса модуля 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.*;
import bitel.billing.server.tariff.voice.calc.*;
import java.sql.*;
 
int mid = 6;
int sid = 7;
 
private void addPriceItem( Element section, TariffModuleTree tree, Calendar time, int cid, String prefix, String title, Connection con )
{
	item = Utils.createElement( section, "item" );
	item.setAttribute( "title", title );
	//
	zdf = ZoneDestFinder.getZoneFinder( con, mid );
	//
	req = new TariffRequest();
	req.setRequestParam( "time", time );
	req.setRequestParam( "phone", prefix );
	req.setRequestParam( "sid", sid );
	req.setRequestParam( "call_type", 1 );
	req.setRequestParam( "zdf", zdf );
	//
	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, "7351", "Москва", con );
		addPriceItem( section, tree, time, cid, "7351", "Уфа", con );
	}
	//
	// 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>
...
Личные инструменты