Импорт старой схемы рассылок баланса в Dispatch

Материал из BiTel WiKi

Перейти к: навигация, поиск

До версии 5.2 работала старая схема рассылок, реализованная в ядре: http://bgbilling.ru/v5.1/doc/ch01s24s07.html В версии 5.2 эта схема перестала работать, вместо неё предлагается использовать плагин dispatch: http://bgbilling.ru/v5.2/doc/ch30.html

Ниже приводится скрипт, импортирующий старые рассылки баланса в модуль dispatch.

Перед запуском необходимо создать в плагине dispatch тип контактов "E-mail" и рассылку "Рассылка баланса": Файл:dispatch_balance.jpg В тексте письма указываем подстановку: $${class:ru.bitel.bgbilling.plugins.dispatch.server.bean.message.DispatchBalanceMessage}

Указываем в условиях отправки условие по балансу с пустыми полями: Файл:dispatch_balance_conditions.jpg

Затем запускаем глобальный скрипт в динамическом коде, который из таблицы user_dispatch, содержащей старые рассылки, создаёт контакты и подписки на рассылки. В полях CONTACT_TYPE_ID и DISPATCH_ID указываем id созданных выше типа контактов и рассылки. В OUT будут созданные рассылки, в ошибках появятся необработанные записи.

package ru.dsi.bgbilling.kernel.scripts.global;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.Vector;
import java.util.regex.Pattern;
 
import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;
import ru.bitel.bgbilling.plugins.dispatch.common.bean.Contact;
import ru.bitel.bgbilling.plugins.dispatch.common.bean.Dispatch;
import ru.bitel.bgbilling.plugins.dispatch.common.bean.Subscription;
import ru.bitel.bgbilling.plugins.dispatch.server.dao.ContactDao;
import ru.bitel.bgbilling.plugins.dispatch.server.dao.DispatchDao;
import ru.bitel.bgbilling.plugins.dispatch.server.dao.SubscriptionDao;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.Preferences;
import ru.bitel.common.Utils;
import ru.bitel.common.model.ScheduleTime;
import ru.bitel.common.sql.ConnectionSet;
 
public class DispatchBalanceImport
	extends GlobalScriptBase
{
	@Override
	public void execute( Setup setup1, ConnectionSet connectionSet )
		throws Exception
	{
		int CONTACT_TYPE_ID = 1;
		int DISPATCH_ID = 1;
 
		Connection con = connectionSet.getConnection();
 
		SubscriptionDao sm = new SubscriptionDao(con);
		ContactDao cm = new ContactDao(con);
		DispatchDao dm = new DispatchDao(con);
		Dispatch dispatch = dm.get(DISPATCH_ID);
 
		//Перебираем все рассылки из user_dispatch:
		PreparedStatement ps = con.prepareStatement("SELECT user_dispatch.* FROM " +
				"	user_dispatch  INNER JOIN " +
				"	contract ON user_dispatch.cid=contract.id  AND contract.date1<=CURDATE() AND (contract.date2 IS NULL OR contract.date2>=CURDATE())  AND contract.del=0  " +
				"WHERE " +
				"	user_dispatch.type=1");
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			int id = 0;
			try{
				id = rs.getInt("id");
				int cid = rs.getInt("cid");
				String mails = rs.getString("mails");
				//String title = rs.getString("title");
				boolean status = rs.getBoolean("status");
				String paramsString = rs.getString("params");
				this.print("id="+id+"; cid="+cid+"; mails="+mails+"; status="+status+"; params="+paramsString);
				Map<String, String> params = getParams(paramsString);
 
				Preferences prefs = new Preferences();
				String balance_limit = params.get("balance_limit");
				if(null!=balance_limit){
					prefs.set("0.to_balance", balance_limit);
				}
				ScheduleTime time = new ScheduleTime();
				String dw = params.get("dw");
				if(null!=dw){
					time.setDayOfWeek(Integer.valueOf(dw));
				}
 
				//Создаём контакты
				Vector<String> emails = splitEmails(mails);
				List<Contact> contacts = new ArrayList<Contact>();
				for(String email: emails){
					Contact contact = new Contact();
					contact.setContactTypeId(CONTACT_TYPE_ID);
					contact.setContractId(cid);
					contact.setValue(email);
					cm.update(contact);
					contacts.add(contact);
				}
 
				//Создаём dispatch_subscription
				Subscription subscription = new Subscription();
				subscription.setActive(status);
				subscription.setComment(mails);
				subscription.setContacts(contacts);
				subscription.setContractId(cid);
				subscription.setDispatch(dispatch);
				subscription.setPreferences(prefs);
				subscription.setRepeatTime(time);
				sm.update(subscription);
			}catch(Exception e){
				this.error("Error on user_dispatch.id = "+id+" :");
				this.error(e);
			}
		}
		rs.close();
		ps.close();
 
	}
 
	//Парсим user.dispatch.params : "dw%v%127%p%balance_limit%v%30.0" -> {dw='127', balance_limit='30'} 
	  private Map<String, String> getParams(String paramsString) throws SQLException
	  {
 
		  Map<String, String> result = new HashMap<String, String>();
		  if(paramsString==null){return result;}
		  Pattern pt = Pattern.compile("%p%");
		  Pattern pt_v = Pattern.compile("%v%");
		  String[] pairs = pt.split(paramsString);
			for (int i = 0; i < pairs.length; i++)
			{
			  String[] pair_value = pt_v.split(pairs[i]);
			  if ((pair_value == null) || (pair_value.length != 2))
			    continue;
			  result.put(pair_value[0], pair_value[1]);
			}
		  return result;
	  }
 
		public Float getBalanceLimit(Map<String, String> params)
		{
			String bl = params.get("balance_limit");
			return bl != null ? new Float(Utils.parseFloat(bl, 0.0F)) : null;
		}
 
		public long getDaysOfWeek(Map<String, String> params)
		{
			return Utils.parseLong(params.get("dw"), 0L);
		}
 
		private Vector<String> splitEmails(String mails){
			Vector<String> result = new Vector<String>();
			if(null==mails){
				return result;
			}
			StringTokenizer st = new StringTokenizer(mails, ",;\r\n ");
		      while (st.hasMoreTokens()) {
		          String token = st.nextToken().trim();
		          result.add(token);
		      }
			return result;
		}
}


xsl-файл рассылки баланса, форматированный в старом стиле:

<?xml version="1.0" encoding="UTF-8"?>
 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 
<xsl:output method="html" encoding="UTF-8" indent="yes"/>
 
<xsl:template match="/data">
<html>
 
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
 
<body>
    <center>
        <h2>Отчет по балансу<br/>Договор:<xsl:value-of select="@contractTitle"/></h2>
         За месяц: <xsl:value-of select="format-number( date/@month, '00' )"/>.<xsl:value-of select="date/@year"/><br/><br/>
     </center>
    <xsl:call-template name="table"/><br/>
</body>
</html>
</xsl:template>
 
<xsl:template name="table">
<table width="100%" border="1" cellspacing="0" cellpadding="0">
        <thead>
                <tr>
                        <td>Описание</td>
                        <td>Сумма, руб.</td>
                </tr>
        </thead>
        <tbody>
                <tr bgcolor="#f0f0f0">
                        <td style="text-align: left;"><b>Входящий остаток на начало месяца</b></td>
                        <td>
                                <b><xsl:value-of select="format-number( balance/@summa1, '0.00' )" /></b>
                        </td>
                </tr>
                <tr bgcolor="#f0f0f0">
                        <td style="text-align: left;"><b>Приход за месяц (всего)</b></td>
                        <td>
                                <b><xsl:value-of select="format-number( balance/@summa2, '0.00' )" /></b>
                        </td>
                </tr>
                <xsl:for-each select="balance/payments/payment">
                        <tr>
                                <td style="text-align: left; color: #555555; padding-left: 20px;">
                                        <xsl:value-of select="@title" />
                                </td>
                                <td>
                                        <xsl:value-of select="format-number( @value, '0.00' )" />
                                </td>
                        </tr>
                </xsl:for-each>
                <tr bgcolor="#f0f0f0">
                        <td style="text-align: left;"><b>Расход за месяц (всего)</b></td>
                        <td>
                                <b><xsl:value-of select="format-number( 0 - balance/@summa4, '0.00')" /></b>
 
                        </td>
                </tr>
                <xsl:for-each select="balance/charges/charge">
                        <tr>
                                <td style="text-align: left; color: #555555; padding-left: 20px;">
                                        <xsl:value-of select="@title" />
                                </td>
                                <td>
                                        <xsl:value-of select="format-number( 0 - @value, '0.00' )" />
                                </td>
                        </tr>
                </xsl:for-each>
                <tr bgcolor="#f0f0f0">
                        <td style="text-align: left;"><b>Наработка за месяц (всего)</b></td>
                        <td>
                                <b><xsl:value-of select="format-number( 0 - balance/@summa3, '0.00' )" /></b>
                        </td>
                </tr>
                <xsl:for-each select="balance/accounts/account">
                        <tr>
                                <td style="text-align: left; color: #555555; padding-left: 20px;">
                                        <xsl:value-of select="@title" />
                                </td>
                                <td>
                                        <xsl:value-of select="format-number( 0 - @value, '0.00' )" />
                                </td>
                        </tr>
                </xsl:for-each>
                <tr bgcolor="#f0f0f0">
                        <td style="text-align: left;"><b>Исходящий остаток на конец месяца</b></td>
                        <td>
                                <b><xsl:value-of select="format-number( balance/@summa5, '0.00' )" /></b>
                        </td>
                </tr>
                <xsl:if test="/data/@balance_mode=1">
                        <tr>
                                <td style="text-align: left;">Лимит</td>
                                <td>
                                        <xsl:value-of select="format-number( balance/@limit, '0.00' )" />
                                </td>
                        </tr>
                </xsl:if>
        </tbody>
</table>
</xsl:template>
 
 
</xsl:stylesheet>

--Cromeshnic 02:36, 6 апреля 2012 (UTC)

Личные инструменты