Импорт старой схемы рассылок баланса в 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" рассылку "Рассылка баланса": В тексте письма указываем подстановку: $${class:ru.bitel.bgbilling.plugins.dispatch.server.bean.message.DispatchBalanceMessage}
Указываем в условиях отправки условие по балансу с пустыми полями:
Затем запускаем глобальный скрипт в динамическом коде, который из таблицы 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)