Импорт старой схемы рассылок баланса в Dispatch
Материал из BiTel WiKi
(Новая страница: «До версии 5.2 работала старая схема рассылок, реализованная в ядре: http://bgbilling.ru/v5.1/doc/ch01s24s07.html…») |
|||
Строка 163: | Строка 163: | ||
} | } | ||
} | } | ||
+ | </source> | ||
+ | |||
+ | В дополнение прилагаю xsl-файл рассылки баланса, форматированный в старом стиле: | ||
+ | <source lang="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> | ||
</source> | </source> | ||
--[[Участник:Cromeshnic|Cromeshnic]] 02:36, 6 апреля 2012 (UTC) | --[[Участник:Cromeshnic|Cromeshnic]] 02:36, 6 апреля 2012 (UTC) |
Версия 02:41, 6 апреля 2012
До версии 5.2 работала старая схема рассылок, реализованная в ядре: http://bgbilling.ru/v5.1/doc/ch01s24s07.html В версии 5.2 эта схема перестала работать, вместо неё предлагается использовать плагин dispatch: http://bgbilling.ru/v5.2/doc/ch30.html
Ниже приводится скрипт, импортирующий старые рассылки баланса в модуль disptch.
Перед запуском необходимо создать в плагине 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 Test 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-файл рассылки баланса, форматированный в старом стиле:
GeSHi Error: GeSHi could not find the language xsl (using path /home/user/wiki.bitel.ru/mediawiki-1.15.1/extensions/SyntaxHighlight_GeSHi/geshi/geshi/) (code 2)
Вы должны указать язык следующим образом: <source lang="html">...</source>
Поддерживаемые языки:
abap, actionscript, ada, apache, applescript, asm, asp, autoit, bash, basic4gl, blitzbasic, bnf, c, c_mac, caddcl, cadlisp, cfdg, cfm, cpp, cpp-qt, csharp, css, d, delphi, diff, div, dos, dot, eiffel, fortran, freebasic, genero, gml, groovy, haskell, html4strict, idl, ini, inno, io, java, java5, javascript, latex, lisp, lua, m68k, matlab, mirc, mpasm, mysql, nsis, objc, ocaml, ocaml-brief, oobas, oracle8, pascal, per, perl, php, php-brief, plsql, python, qbasic, rails, reg, robots, ruby, sas, scheme, sdlbasic, smalltalk, smarty, sql, tcl, text, thinbasic, tsql, vb, vbnet, vhdl, visualfoxpro, winbatch, xml, xpp, z80
--Cromeshnic 02:36, 6 апреля 2012 (UTC)