http://wiki.bitel.ru/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:Contributions&feed=atom&target=DimOn BiTel WiKi - Вклад участника [ru] 2024-03-29T06:24:33Z Материал из BiTel WiKi MediaWiki 1.15.1 http://wiki.bitel.ru/index.php/%D0%A4%D0%B0%D0%B9%D0%BB:Bill_pdf_barcode_example.xsl Файл:Bill pdf barcode example.xsl 2023-11-12T17:29:12Z <p>DimOn:&#32;загружена новая версия «Файл:Bill pdf barcode example.xsl»</p> <hr /> <div>карточка bill с примерами штрих-кодов</div> DimOn http://wiki.bitel.ru/index.php/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2_%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD-%D0%BF%D0%BB%D0%B0%D1%82%D0%B5%D0%B6%D0%B5%D0%B9 Примеры скриптов обработки онлайн-платежей 2019-07-23T06:31:41Z <p>DimOn:&#32;</p> <hr /> <div>По новому 54-ФЗ нужно печатать чек на каждый приём денег. Некоторые системы встраивают эту процедуру на своей стороне, в этих модулях биллинга есть возможность пользоваться этим. Они используют, например, атол-онлайн или свои мощности ККМ. Если вы хотите печатать чек на своей стороне и на своём ККМ, то в данный момент это можно сделать через небольшой набор скриптов в версиях до 7.0.<br /> <br /> '''В версиях 7.0+ есть аналогичный штатный механизм:''' https://docs.bitel.ru/pages/viewpage.action?pageId=126222350<br /> <br /> Работает так:<br /> <br /> Приходит платёж от сторонней системы, вы скриптом отлавливаете и небольшим кодом через API отправляете на печать чека. ККМ далее делает отправку в ОФД, далее ОФД отправляет email/sms итд. Все скрипты - для дин.кода.<br /> <br /> Документация по дин.классам: https://docs.bitel.ru/pages/viewpage.action?pageId=43385236<br /> <br /> Привязка дин.кода к событию: https://docs.bitel.ru/pages/viewpage.action?pageId=43385244<br /> <br /> Привязка дин.кода к глобальному скрипту: https://docs.bitel.ru/pages/viewpage.action?pageId=43385260<br /> <br /> Периодическое выполнение глобальных скриптов: https://docs.bitel.ru/pages/viewpage.action?pageId=43385264<br /> <br /> <br /> Скрипт на приём платежа:<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ***;<br /> <br /> import static ru.bitel.bgbilling.common.bean.BGBaseConstants.KEY_CUSTOMER_ADDRESS;<br /> <br /> import java.sql.Connection;<br /> <br /> import bitel.billing.server.util.MailMsg;<br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.kernel.contract.api.common.bean.Contract;<br /> import ru.bitel.bgbilling.kernel.contract.api.server.bean.ContractDao;<br /> import ru.bitel.bgbilling.kernel.contract.balance.common.bean.Payment;<br /> import ru.bitel.bgbilling.kernel.contract.balance.server.event.PaymentEvent;<br /> import ru.bitel.bgbilling.kernel.contract.config.server.ContractModuleConfigDao;<br /> import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase;<br /> import ru.bitel.bgbilling.plugins.cashcheck.server.CashCheckUtils;<br /> import ru.bitel.bgbilling.plugins.cashcheck.server.bean.Check;<br /> import ru.bitel.bgbilling.server.util.Setup;<br /> import ru.bitel.common.sql.ConnectionSet;<br /> <br /> /**<br /> * Обрабатываем приход платежа с печатью на регистраторах по событию «Приход платежа».<br /> * Попытка костыля для обработки онлайн-платежей.<br /> * @author dimon<br /> */<br /> public class CashCheckPrintPayment<br /> extends EventScriptBase&lt;PaymentEvent&gt;<br /> {<br /> /**<br /> * [Настройки здесь]<br /> * Номер ККМ из конфига плагина, на котором печатать.<br /> */<br /> private int kkmNum = 2;<br /> <br /> /**<br /> * [Настройки здесь]<br /> * Пароль, под которым заходит в ККМ.<br /> */<br /> private int kkmPass = 3;<br /> <br /> /**<br /> * [Настройки здесь]<br /> * e-mail администраторов, куда слать уведомления.<br /> */<br /> private String[] EMAILS = {&quot;***@***.ru&quot;};<br /> <br /> /**<br /> * [Настройки здесь]<br /> * На основании переданных данных (payment, contract) генерируется объект Check.<br /> * Там же внутри в объект Check ставятся тип платежей для ККМ (check.setPaymentType) и налоговая группа для ККМ (check.setTax).<br /> */<br /> private void makeCheck(Connection con, Payment payment, Contract contract) throws Exception<br /> {<br /> if(payment.getTypeId() == 99)<br /> {<br /> check = new Check();<br /> <br /> int MID = 16; // это mid модуля платёжного этого, того где в ЛК вводят нужный email, все мыла сохраняются отдельно для каждого модуля, сейчас так сделано <br /> <br /> ContractModuleConfigDao contractModuleConfigDao = new ContractModuleConfigDao( con, MID );<br /> String customerEmail = contractModuleConfigDao.get( contract.getId(), KEY_CUSTOMER_ADDRESS );<br /> contractModuleConfigDao.close();<br /> <br /> check.setPaymentType(1); // ставим ТИП ПЛАТЕЖА ККМ: 1 - нал, 2,3,4 - безнал или какой-то другой тип оплаты<br /> check.setTax(0); // ставим ТИП НАЛОГА ККМ: 0 - по номеру секции (в атолах), N - какой-то другой на выбор<br /> check.setOnlyElCheck(true); // &quot;только электронный чек&quot;<br /> check.setCustomerEmail(customerEmail);<br /> int paymentDep = 1; // отдел, используется ниже в addPayment<br /> // добавляем параметр договора<br /> //int PARAM_ID = 3;<br /> //ContractParameterManager bgParamMan = new ContractParameterManager( con );<br /> //String paramVal = bgParamMan.getStringParam( event.getContractID(), PARAM_ID );<br /> // check.addString( &quot;Какой-то параметр договора: &quot; + paramVal );<br /> check.addPayment( payment.getSum(), &quot;Оплата услуг Интернета и Телевидения по договору&quot; + contract.getTitle(), paymentDep );<br /> }<br /> if(payment.getTypeId() == 666) // остальные ветки по аналогии<br /> {<br /> //check = new Check();<br /> //...<br /> }<br /> }<br /> <br /> // --- всё что ниже менять не нужно ---<br /> <br /> private Check check = null;<br /> <br /> @Override<br /> public void onEvent(PaymentEvent event, Setup setup, ConnectionSet set)<br /> throws Exception<br /> {<br /> if(event.isEditMode()) return; // если платёж редактируется, а не создаётся, то сразу уходим<br /> Connection con = set.getConnection();<br /> Payment payment = event.getPayment();<br /> int userId = payment.getUserId();<br /> check = null;<br /> print( &quot;CashCheck Autoprint: user id=&quot;+userId+&quot;, payment should be automatically printed...&quot; );<br /> ContractDao contractDao = new ContractDao(con, userId);<br /> Contract contract = contractDao.get(payment.getContractId());<br /> contractDao.close();<br /> makeCheck( con, payment, contract ); // в этом методе делается всё про чек - устанавливаются глобальные check и kkmNum<br /> if( check != null )<br /> {<br /> try<br /> {<br /> CashCheckUtils.printCheck(check, CashCheckUtils.getPrinter( kkmNum ), kkmPass, con, payment.getId());<br /> print( &quot;CashCheck Autoprint: check was printed!&quot; );<br /> }<br /> catch(BGException e)<br /> {<br /> print( &quot;CashCheck Autoprint: check ERROR: &quot; + e.getMessage() );<br /> sendMails(setup, &quot;CashCheck Autoprint: check ERROR&quot;, e.printStackTraceToString());<br /> }<br /> }<br /> else<br /> {<br /> error( &quot;CashCheck Autoprint: makeCheck: check == null, payment NOT printed!&quot; ); <br /> }<br /> }<br /> <br /> private void sendMails(Setup setup, String subject, String body)<br /> {<br /> MailMsg mailmsg = new MailMsg(setup);<br /> for(String email : EMAILS)<br /> {<br /> try<br /> {<br /> print(&quot;CashCheck Autoprint: Send e-mail to &quot;+email+&quot;...&quot;);<br /> mailmsg.sendMessage(email, subject, body);<br /> }<br /> catch (Exception e)<br /> {<br /> error(&quot;CashCheck Autoprint: Error send e-mail: &quot;+e.toString());<br /> }<br /> }<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> Также надо бы автоматически закрывать день. Для этого скрипт по таймеру каждую ночь делает на ККМ z-отчёт.<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ***;<br /> <br /> import bitel.billing.server.util.MailMsg;<br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;<br /> import ru.bitel.bgbilling.plugins.cashcheck.server.CashCheckUtils;<br /> import ru.bitel.bgbilling.server.util.Setup;<br /> import ru.bitel.common.sql.ConnectionSet;<br /> <br /> /**<br /> * Закрытие дня (снятие z-отчёта). Скрипт глобальный, для выполнения по таймеру.<br /> * Подразумевается запуск поздно ночью.<br /> * Попытка костыля для обработки онлайн-платежей.<br /> * @author dimon<br /> */<br /> public class CashCheckCloseDay<br /> extends GlobalScriptBase<br /> {<br /> /**<br /> * [Настройки здесь]<br /> * Номер ККМ из конфига плагина, на котором печатать.<br /> */<br /> private int kkmNum = 2;<br /> <br /> /**<br /> * [Настройки здесь]<br /> * Пароль, под которым заходит в ККМ. Скорее всего нужен админский.<br /> */<br /> private int kkmPass = 30;<br /> <br /> /**<br /> * [Настройки здесь]<br /> * e-mail администраторов, куда слать уведомления.<br /> */<br /> private String[] EMAILS = {&quot;***@***.ru&quot;};<br /> <br /> @Override<br /> public void execute(Setup setup, ConnectionSet set)<br /> throws Exception<br /> {<br /> print( &quot;CashCheck Autoprint: ZReport...&quot; );<br /> try<br /> {<br /> CashCheckUtils.ZReport(CashCheckUtils.getPrinter( kkmNum ), kkmPass);<br /> print( &quot;CashCheck Autoprint: ZReport was made!&quot; );<br /> sendMails(setup, &quot;CashCheck Autoprint: ZReport was made!&quot;, &quot;subj&quot;);<br /> }<br /> catch(BGException e)<br /> {<br /> print( &quot;CashCheck Autoprint: ZReport ERROR: &quot; + e.getMessage() );<br /> sendMails(setup, &quot;CashCheck Autoprint: ZReport ERROR&quot;, e.printStackTraceToString());<br /> }<br /> }<br /> <br /> private void sendMails(Setup setup, String subject, String body)<br /> {<br /> MailMsg mailmsg = new MailMsg(setup);<br /> for(String email : EMAILS)<br /> {<br /> try<br /> {<br /> print(&quot;CashCheck Autoprint: Send e-mail to &quot;+email+&quot;...&quot;);<br /> mailmsg.sendMessage(email, subject, body);<br /> }<br /> catch (Exception e)<br /> {<br /> error(&quot;CashCheck Autoprint: Error send e-mail: &quot;+e.toString());<br /> }<br /> }<br /> }<br /> }<br /> &lt;/source&gt;</div> DimOn http://wiki.bitel.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0 Заглавная страница 2018-04-09T17:08:47Z <p>DimOn:&#32;/* Технологии */</p> <hr /> <div>== О BiTel Wiki ==<br /> Здесь вы можете получить больше информации о продуктах BiTel: BGBilling, BGCRM, а также поделиться своим опытом с другими пользователями. В то время как документация часто предоставляет общие сведения о системе и ее настройках, в WiKi приводятся конкретные примеры.<br /> <br /> * &lt;b&gt;[[Как выложить статью на WiKi]]&lt;/b&gt;<br /> * [[Оформление статей]]<br /> * [http://forum.bitel.ru/ Форум BiTel]<br /> <br /> == Специалисты ==<br /> Уважаемые &quot;продвинутые пользователи&quot;. Здесь вы можете располагать записи со своими контактами для оказания воздмездной или безвозмездной помощи по настройке системы BGBilling пользователям, не столь далеко продвинувшимся. Желательно указывать ваши контактные данные и &quot;специализацию&quot;. Отзывы по исполнителям можно оставить/почитать [http://forum.bitel.ru/viewtopic.php?t=9329 на форуме].<br /> {| border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;<br /> |- valign=top align=&quot;center&quot; bgcolor=&quot;#eeeeee&quot; <br /> | Имя || Специализация || Контакт || Примечания<br /> |-<br /> | Олег Алтынников || Установка, настройка, поддержка биллинга, миграция с других|| E-mail: murano@linkray.ru, ICQ: 462851472 || Написание скриптов, интеграция с любым оборудованием (IPTV, Интернет, DPI, Телефония), проекты любой сложности под любые задачи, автоматизация, оптимизация работы, Linux/FreeBSD и многое другое<br /> |-<br /> |-<br /> | Рустам Тазуркаев || Mikrotik, переход с NetUp, CISCO || [[Изображение:Cpec_2_contact.png]] &lt;!-- ICQ: 648986--&gt; ||<br /> |-<br /> | Михаил Чернобаев || В поиске работы [https://hh.ru/resume/33fee438ff003ce8350039ed1f736563726574 hh][https://moikrug.ru/mikhail-chernobaev mk]. Скрипты биллинга, Java-расширения, интеграция с другими системами || Тел. +79619322588 (+telegram) skype &amp; e-mail: mstr.box@gmail.com || Автоматизация бизнес-процессов: скриптование в биллинге, расширение BGBS API, разработка инструментов интеграции с другими системами. Переход на BGBilling. Возможны крупные проекты.<br /> |- <br /> | Борис Близнюков || Скрипты биллинга, CISCO, Voip, Mera || [[Изображение:Cpec_4_contact.png]] &lt;!--ICQ: 1996944--&gt; || Только бесплатные краткие консультации. Очень хороший специалист по CISCO.<br /> |-<br /> | Андрей Бехтерев || Cisco, UNIX, ISP, Asterisk || ICQ: 7021464 WEB: http://behterev.su/ || Обширный спектр оборудования. Консалтинг.<br /> |-<br /> | Гершевич М.М. || Доработка конфигурации 1С и прочего ПО. || Тел. +79248454888 +7-(4162)-238-777 WEB: http://www.amurimpulse.ru/ mail: mike1008@mail.ru || Консалтинг. Информационная безопасность. Интеграция биллинга. Крупные проекты. Работа под заказ.<br /> |-<br /> | Андрей Зюзенков || Android, Linux, Eltex, Asterisk, BGBilling || [https://bghelp.ru Сайт], e-mail: info@bghelp.ru || Интеграция, мобильные приложения на Android<br /> |-<br /> | Семён Кошечкин || Java || email/gtalk: [[Файл:Cpec_5_contact.jpg]]|| Скрипты, дополнения, модуль Inet. [[%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:Contributions/Cromeshnic|wiki]]<br /> |-<br /> |-<br /> | Конференция BGBilling || Вопросы касаемо системы BGBilling || https://t.me/bgbilling || Администраторы АСР BGBillig (иногда и разработчики) помогают друг другу в разных вопросах.<br /> |}<br /> <br /> == BGBilling ==<br /> === Установка ===<br /> * [[Установка на gentoo]]<br /> * [[Установка на Sun Solaris]]<br /> * [[Установка на Slackware]]<br /> * [[Установка на FreeBSD]]<br /> * [[Установка на Ubuntu 8 Desktop]]<br /> * [[Установка на Ubuntu 9.10 Desktop]]<br /> <br /> <br /> ==== Перенос данных в биллинг ====<br /> *[[Пример конвертера данных из csv-файлов в базу BGBilling]]<br /> *[[Пример конвертера данных из CSV-файлов в базу BGBilling - 2]]<br /> *[[Пример конвертера данных из CSV-файлов в базу BGBilling - 3]]<br /> *[[Конвертер базы Netup]]<br /> *[[Примеры конвертеров данных из других биллинговых систем]]<br /> <br /> === Администрирование ===<br /> * [[Разграничение прав действий]]<br /> * [[Настройка безопасности сервера биллинга и компонентов биллинга]]<br /> * [[Принудительный останов процессов биллинга]]<br /> * [[Использование подписанного SSL сертификата]]<br /> * [[Запуск scheduler и data_loader с другими портами управления]]<br /> * [[bg-snmp-management|Мониторинг java-процессов по snmp]]<br /> * [[Пример юнита для systemd]]<br /> * [[Скрипты автостарта демонов bgbilling для Debian]]<br /> * [[javaws|Запуск BGBillingClient через Java Web Start]]<br /> * [[Мониторинг Inet-Radius через JMX]]<br /> * [[Интеграция существующего сертификата и приватного ключа SSL в хранилище keystore]]<br /> * [[Адреса платежных шлюзов, для тех кто хочет без доступа в интернет произвести оплату]]<br /> <br /> === Настройка вспомогательного ПО ===<br /> *[[Проксирование обращений к BGBillingServer посредством nginx]]<br /> <br /> ==== WildFly личный кабинет ====<br /> *[[Включение https]]<br /> *[[Смена Тарифного плана в Личном кабинете]]<br /> <br /> ==== MySQL ====<br /> *[[Рекомендации по настройке MySQL]]<br /> *[[database backup|Backup MySQL базы с помощью snapshot'ов (Linux, LVM)]]<br /> *[[Настройка MySQL репликации]]<br /> *[[Установка триггера в MySQL для отслеживания изменений]]<br /> *[[Скрипт восстановления MySQL репликации]]<br /> *[[Simple DB backup]]<br /> *[[Galera]]<br /> <br /> ==== NetFlow ====<br /> *[[Настройка NetFlow-агента IPCAD]]<br /> *[[Разделение NetFlow-потоков]]<br /> <br /> === Технологии ===<br /> *[[BGBilling_XSLT|Всё про XSLT в биллинге]]<br /> <br /> === Разработка ===<br /> *[[Отладка action'ов в IntelliJ IDEA]]<br /> *[[Разработка динамического кода в IDE Eclipse]]<br /> <br /> === [[XSLT]] шаблоны ===<br /> *[[Добавление параметров договора на страницу личного кабинета]]<br /> &lt;!-- *[[Красивые графики статистики в модуле IPN]] --&gt;<br /> *[[Карточки договора]]<br /> *[[Создание XSLT/FO шаблона со штрихкодами]]<br /> *[[Подстановка данных в зависимости от текущего пользователя биллинга]]<br /> *[[Генерация прайса модуля IP телефонии в карточке договора]]<br /> <br /> ==== Счета ====<br /> *[[Печать счета-фактуры и акта на отдельных листах]]<br /> *[[Расширенные счета модуля бухгалтерии]]<br /> *[[Квитанция телефонии физ. лицам]]<br /> *[[Шаблоны вывода названия месяца]]<br /> *[[Изменения в шаблоне в зависимости от месяца документа]]<br /> *[[Добавление новых шрифтов в FO шаблоны]]<br /> <br /> === Интеграция с внешними системами ===<br /> * [[Прямая интеграция с платежными терминалами ЭСФОР / SFOUR]]<br /> * [[Интеграция с платежной системой с использованием модуля Card]]<br /> * [[Интеграция с платежной системой Robokassa]]<br /> * [[SMS рассылка через SMPP]]<br /> * [[SMS рассылка через SMPP по средствам дин кода в 5.2]]<br /> * [[Система учета &quot;Заявки и Наряды&quot; на java]]<br /> * [[Bash скрипт-отсылка смс через телефон при отсутствие ping на заданный узел]]<br /> * [[Запросы в личный кабинет пользователя сторонними системами]]<br /> * [[Запросы к серверу биллинга сторонними системами]]<br /> <br /> ==== 1С ====<br /> * [[BGBilling-1C]]<br /> * [[amurimpulse.ru bgbilling]]<br /> * [[Integrator 1C-BGBilling]]<br /> * [[Пример обращения к биллингу из 1С v.7.7]]<br /> * [[Пример интеграции с 1С v.7.7]]<br /> * [[Пример интеграции с 1С v.8.1]]<br /> * [[Пример интеграции с 1С через custom API]]<br /> * [[Установка unload_status счета через HTTP-запрос]]<br /> ==== Android ====<br /> *[[Разработка мобильных приложений на Android]]<br /> ==== Telegram ====<br /> *[[Разработка telegram ботов]]<br /> <br /> === Динамический код (скрипты BGBS для старых версий) ===<br /> *[[Логгирование в скриптах поведения]]<br /> <br /> ==== Динамический код ====<br /> *[[Конвертирование адреса]]<br /> *[[Глобальная синхронзация услуг модуля npay с тарифным планом]]<br /> *[[Новый номер договора группе договоров]]<br /> *[[Скрипт проверки таймзон (timezone, tz, tzdata) в java]]<br /> <br /> ==== Комплексные решения ====<br /> *[[Предоставление тестового периода пользования услугой]]<br /> *[[Организация системы отслеживания и отключения КТВ должников на BGBS с использованием CRM плагина]]<br /> *[[Автоматизация подключений VPN-клиентов с использованием CRM плагина]]<br /> *[[Пример автоматизации подключения новых клиентов]]<br /> <br /> ==== Глобальные скрипты ====<br /> *[[Скрипт глобальный отмены перехода на тарифы при неоплате]]<br /> *[[Скрипт предоставление скидки пенсионерам]]<br /> *[[Скрипт создания субдоговоров по шаблону]]<br /> *[[Глобальное событие запуска сервера]]<br /> *[[Перемещение в группу через 3 месяца если не было движения денег в наработке]]<br /> *[[Поиск и изменение статусов у договоров]]<br /> *[[Получение списка доступных действий в SQL]]<br /> *[[Глобальный скрипт для удаления старых таблиц]]<br /> <br /> ==== Пользовательские библиотеки скриптов ====<br /> *[[Пересчеты и бонусы]]<br /> *[[Архивирование логов netflow и radius accaunting]]<br /> <br /> ==== Ядро ====<br /> *[[Смена тарифного плана по заданию пользователя]]<br /> *[[Валидация текстового параметра]]<br /> *[[Проверка ИНН/КПП при вводе]]<br /> *[[Проверка параметра договора перед изменением]]<br /> *[[Обработка смены параметра договора]]<br /> *[[Создание списка дополнительных действий для договора]]<br /> *[[Обработка события создания договора]]<br /> *[[Обработка события &quot;добавление услуги RSCM в договор&quot; . Скипт сменяет тариф, подключает абонплату ]]<br /> *[[Приостановление договора клиентом через WEB]]<br /> *[[Скрипт проверки баланса и отключения договора]]<br /> *[[Изменение стандартной логики перетирания статусов]]<br /> *[[Пример продажи OEM ключей с помощью скрипта]]<br /> *[[Пример копирования тарифного плана]]<br /> *[[Получение текущего пользователя биллинга]]<br /> *[[Запуск скрипта до и после акшена]]<br /> *[[Примеры скриптов до и после акшена]]<br /> *[[Примеры динамического кода акшена и веб-сервисов]]<br /> *[[Начисление бонусов на счет при платежах определенного типа]]<br /> *[[Включение должников по приходу платежа]]<br /> *[[Снижение лимита при внесении расхода]]<br /> *[[Изменение суммы лимита определенной группе договоров]]<br /> *[[Синхронизация услуг договора в соответствии с тарифными планами]]<br /> *[[Добавление группы и снятие в зависимости от статуса]]<br /> *[[Управление статусом договора по состоянию баланса]]<br /> *[[Запрет на вход в личный кабинет с закрытых договоров]]<br /> *[[Переход на понижающий тариф только со следующего месяца]]<br /> *[[Пример создания своего интерфейса в клиенте]]<br /> *[[Метки услуг]]<br /> *[[Сравнение прав пользователей]]<br /> *[[Свой список шаблонов договоров]]<br /> *[[Модификация приходящего платежа (снятие процента)]]<br /> *[[Подкрашивание договоров в поиске]]<br /> *[[Пример добавления пунктов в ЛК редиректящих на url]]<br /> *[[Фиксированные суммы для оплаты в старом ЛК]]<br /> <br /> ==== Модуль Bill ====<br /> *[[Создание счета в модуле Bill]]<br /> *[[Создание счета из суммы платежей по классу договоров]]<br /> *[[Создание счета по таблице позиций]]<br /> *[[Создание счета и счет-фактур в модуле Bill(выполнение тех же действий что и руками)]]<br /> *[[Создание счетов на предоплату]]<br /> *[[Распечатка счетов в pdf по событию генерации счета]]<br /> *[[Внешняя программа на JAVA для синхронизации номеров счетов и актов выполненных работ (версия BGBilling 5.0)]]<br /> *[[Автоматическая отправка счетов через глобальный скрипт поведения]]<br /> <br /> ==== Модуль DialUp ====<br /> *[[Запуск переначисления в модуле DialUp]]<br /> *[[Передача ACCEPT вместо REJECT вместе с доп. аттрибутами]]<br /> *[[Обработка запроса учетного периода]]<br /> *[[Переинициализация тарифа в пределах сессии | Обработка запроса учетного периода (переинициализация тарифа в пределах сессии) ]]<br /> *[[Ограничение доступа для различных групп пользователей для BGRadiusDialup]]<br /> *[[Детальное информирование абонентов о причинах ошибки 691]]<br /> *[[Аутентификация с учетом Calling-Id-Station]]<br /> *[[Доп. действие сброса активных соединений]]<br /> *[[Открытие абонплаты по первой установке соединения]]<br /> *[[Пересчет трафика по данным Radius (при потерянных Netflow-логах)]]<br /> *[[Отключение Fake сессий при приходе платежа]]<br /> *[[Ограничение доступа на основе объектов]]<br /> <br /> ==== Модуль DialUp / Cкрипты предобработки RADIUS запросов ====<br /> * [[Уcтановка услуги типа &quot;Время&quot; для BGRadiusDialup]]<br /> * [[Установка фиксированного пароля]]<br /> * [[Нормализация параметра Acct-Session-Id у маршрутизатора Cisco]]<br /> * [[Разделение атрибута User-Name на логин и пароль]]<br /> * [[Вынос MAC адреса из cisco-avp-pair в Calling-Station-Id]]<br /> * [[Копирование Тunnel-Client-Endpoint/Tunnel-Server-Endpoint в Calling-Station-Id/Called-Station-Id]]<br /> * [[Замена radius-атрибутов при авторизации]]<br /> <br /> ==== Модуль Inet / Cкрипты предобработки RADIUS запросов ====<br /> * [[Вынос MAC адреса из cisco-avp-pair в Calling-Station-Id для модуля Inet]]<br /> <br /> ==== Модуль СerberСrypt ====<br /> *[[Изменение подписки карты через web (cerbercrypt)]]<br /> *[[Управление подписками через веб (cerbercrypt)]]<br /> *[[Дин.код для синхронизации pairing с внешнего cas]]<br /> *[[Скрипт активации/деактивации карты при добавлении/удалении]]<br /> <br /> ==== Модуль NPay ====<br /> *[[Определение размера абонентской платы]]<br /> *[[Запуск переначисления в модуле NPay]]<br /> *[[Дебетовые абонплаты. Снятие штрафа за разблокировку.]]<br /> *[[Снятие абонентской платы в дебитовых договорах]]<br /> *[[Предварительное уведомление о блокировке по дебетовым абонплатам]]<br /> *[[ Начисление абонплат по схеме 15-15 ]]<br /> *[[Персональные цены для договоров]]<br /> <br /> ==== Модуль Phone ====<br /> *[[При создании поинта модуля Phone добавление в него абонплат]]<br /> *[[Закрытие_телефонных_договоров]]<br /> <br /> ==== Модуль RSCM ====<br /> *[[Запуск переначисления в модуле RSCM]]<br /> *[[Перенос суммы расхода в наработку RSCM модуля]]<br /> <br /> ==== Модуль VoiceIp ====<br /> *[[Определение стоимости звонка VoiceIp]]<br /> <br /> ==== Модуль VoiceIp / Cкрипты предобработки RADIUS запросов ====<br /> * [[Идентификация Voip оператора по подсети (транзит)]]<br /> * [[Установка параметров звонка Voip]]<br /> * [[Установка фиксированного пароля]]<br /> * [[Разделение атрибута User-Name на логин и пароль]]<br /> * [[Замена radius-атрибутов при авторизации]]<br /> <br /> ==== Плагин CRM ====<br /> *[[Обработка выполненных задач в журнале задач]]<br /> *[[Обработка задач по событию ядра &quot;Поступление платежа&quot;, создание новой задачи и изменение существующей]]<br /> *[[Пример получения информации о задаче]]<br /> *[[Уведомления монтажников о новых активных задачах путем отправки SMS XML запросом]]<br /> <br /> ==== Плагин CashCheck ====<br /> *[[Чек: добавление позиции]]<br /> *[[Чек: завершение формирования]]<br /> *[[Примеры скриптов CashCheck]]<br /> *[[Примеры скриптов обработки онлайн-платежей]]<br /> <br /> ==== Плагин Documents ====<br /> *[[Создание копий документа на договорах]]<br /> <br /> ==== Модуль Inet ====<br /> *[[Скрипт активации учетного периода]]<br /> *[[Скрипт закрытия соединений]]<br /> <br /> === Решения для модулей и плагинов ===<br /> <br /> ==== Модуль DialUP ====<br /> *[[Настройка Lucent Ascend MAX6000 в качестве DialUP сервера]]<br /> *[[Настройка Dial-IN сервера FreeBSD PPPD]]<br /> *[[Настройка VPN сервера LINUX PPPD + POPTOP]]<br /> *[[Настройка шейпера в LINUX PPPD]]<br /> *[[Настройка VPN сервера FreeBSD MPD]]<br /> *[[Настройка PPPoE сервера на Cisco-роутере]]<br /> *[[Настройка PPPoE и/или РРТР (VPN) на Mikrotik]]<br /> *[[Проблема с прохождением update пакетов и сброса сессий в Debian и Ubuntu дистрибутивах]]<br /> *[[Настройка Dial-IN Windows RRAS сервера]]<br /> *[[VPN доступ с повременной тарификацией на базе FreeBSD MPD]]<br /> *[[Организация семейства UNLIMIT тарифов на базе FreeBSD MPD]]<br /> *[[Примеры тарифных планов VPN/DialUp]]<br /> *[[Отключение сессий по PoD на CISCO]]<br /> *[[Пример скрипта управления уровнями BGRadiusDialup]]<br /> *[[Настройка cisco с поддеркой ISG]]<br /> *[[Настройка BGBilling c поддеркой ISG]]<br /> *[[Настройка BGBilling с RedBack SmartEdge (PPPOE)]]<br /> <br /> ==== Модуль E-Mail ====<br /> *[[Почтовая система Exim + Cyrus + OpenLDAP на FreeBSD]]<br /> *[[Postfix/MySQL/BGBilling]]<br /> *[[Postfix+dovecot+ldap]]<br /> *[[Postfix+Mysql+Virtual domains]]<br /> <br /> ==== Модуль Inet ====<br /> *[[Inet FAQ]]<br /> *[[Схемы подключения]]<br /> *[[Расширения]]<br /> *[[Конвертеры из IPN в INET]]<br /> *[[Конвертер: логины Dialup в сервисы inet]]<br /> *[[WiFi-портал с активацией по sms ]]<br /> *[[WiFi-портал с оплатой картой через assist ]]<br /> <br /> ==== Модуль IPN ====<br /> *[[IP/VPN]]<br /> *[[Примеры тарифных планов IPN]]<br /> *[[Настройка BGIPNNetflowCollector]]<br /> *[[Методика определения причины отсутствия трафика в отчете договора]]<br /> *[[Связка с flow-tools]]<br /> *[[Экспорт Netflow-данных в формат Nfdump]]<br /> *[[Реалиазация шлюза на Cisco]]<br /> *[[Реализация шлюзов на BeanShell,примеры стандартных и других шлюзов]] (Manad, Cisco, Zyxel, Mikrotik)<br /> *[[Изменения в manad для работы с одним pipe на множество IP адресов]]<br /> *[[FreeBSD manad, понимающий изменения правил в тарифах]]<br /> *[[Табличный FreeBSD manad, понимающий изменения правил в тарифах]]<br /> *[[Пример реализации скриптового универсального шлюза]]<br /> *[[Конвертер привязок услуг dialup в привязки ipn]]<br /> *[[Реализация скрипта Manad]]<br /> *[[Настройка шлюза Mikrotik]]<br /> *[[Обновление номеров интерфейсов при замене роутера]]<br /> <br /> ==== Модуль Phone ====<br /> * [[Конвертация и загрузка тарифов Телефонии в биллинг]]<br /> * [[Примеры тарифных планов Телефонии]]<br /> * [[Примеры реализации конверторов логов]]<br /> * [[Генератор отчётности для Совинтел]]<br /> <br /> ==== Модуль Reports ====<br /> *[[Редактирование отчетов в iReport]]<br /> *[[Примеры отчётов]]<br /> *[[Использование отчётов для организации универсального поиска]]<br /> *[[Табличные отчёты с динамическими столбцами]]<br /> *[[Табличные отчёты в динамическом коде]]<br /> *[[Сохранение JasperReports-отчёта на сервере в pdf]]<br /> <br /> ==== Модуль TV ====<br /> *[[Активация/добавление модуля на договор через дополнительное действие]]<br /> <br /> ==== Модуль VoiceIP ====<br /> *[[Интеграция Asterisk и BGBilling (Accounting) посредством скрипта предобработки запросов Radius]]<br /> *[[Интеграция Asterisk и BGBilling (Accounting) посредством изменения программного кода Asterisk]]<br /> *[[Интеграция c MVTS]]<br /> *[[Интеграция c Cisco Call Manager Express (CME)]]<br /> *[[Карточная IVR система на базе Cisco]]<br /> *[[Примеры IVR скриптов для Cisco]]<br /> *[[Пример настройки Cisco AS5350]]<br /> *[[Продажа пакетов минут на направления]]<br /> <br /> ==== Плагин Dispatch ====<br /> *[[Импорт старой схемы рассылок баланса в Dispatch]]<br /> <br /> === SQL-запросы ===<br /> *[[Схема связки таблиц тарифов]]<br /> *[[Разные SQL-запросы]]<br /> *[[SQL-запрос: кто сколько платит на каждом тарифе]]<br /> *[[Получение цен тарифов]]<br /> *[[Работа с группами, битовые маски]]<br /> *[[наработка по абонентке и услугам за месяц]]<br /> <br /> ==== CerberCrypt ====<br /> *[[Модуль CerberCrypt: Разные SQL-запросы]]<br /> *[[Модуль CerberCrypt: Поиск битых SQL-связей]]<br /> <br /> === Веб-Интерфейс ===<br /> *[[Свой action в личном кабинете]]<br /> **[[WebAction_CustomSuspend]] - управление статусом договора (v5.0)<br /> *[[Изменение параметров договора из личного кабинета]]<br /> *[[Как убрать ненужные действия в web]]<br /> <br /> === Протоколы ===<br /> *[[Протокол дилерский платежей]]<br /> *[[Протоколы, поддержанные в модуле MPS]]<br /> *[[Протоколы, поддержанные в модуле Phone]]<br /> *[[Медиа: Enaza.zip]]<br /> *[[Медиа: Payonline.zip]]<br /> <br /> === FAQ ===<br /> * [[Не запускается служба под Windows (BGBillingServer, BGCashcheckServer итд)]]<br /> * [[Вопросы вместо русских букв]]<br /> * [[Что происходит с пользователями при рестарте сервера биллинга и BGRadiusDialup]]<br /> * [[Тарификация максимального трафика]]<br /> * [[Field ... doesn't have a default value ]]<br /> * [[Character set ‘cp1251' is not a compiled character set and is not specified in the ‘C:\mysql\\share\charsets\Index.xml’ file ]]<br /> * [[com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown database 'bgbilling' ]]<br /> * [[Договор не отображается в поиске]]<br /> * [[PPPD проблема с сессиями больше 4ГБ]]<br /> * [[Меню личного кабинета]]<br /> * [[Java.lang.NoClassDefFoundError:_javax/xml/bind/DataBindingException|FreeBSD: Java.lang.NoClassDefFoundError: javax/xml/bind/DataBindingException]]<br /> * [[Manad: после некоторого количества договоров начинает передавать данные на биллинг неправильно ]]<br /> * [[Ошибка выполнения скиптов: Undefined argument:]]<br /> * [[Ошибка в логе &quot;Too many open files&quot;]]<br /> * [[Ошибка в логе &quot;java.lang.OutOfMemoryError : unable to create new native Thread&quot;]]<br /> * [[Ошибка в клиенте &quot;Action NOT FOUND!..&quot;]]<br /> * [[Inet FAQ]]<br /> * [[java.lang.NoSuchMethodError]]<br /> * [[Много таблиц npay_add_cost_detail и npay_detail]]<br /> * [[Тормозит клиент BG под Windows]]<br /> * [[Unable to load authentication plugin]]<br /> <br /> == BGCRM ==<br /> <br /> === Настройка вспомогательного ПО ===<br /> * [[Проксирование обращений к BGCRM посредством nginx]]<br /> <br /> === Плагин BGBilling ===<br /> * [[Синхронизация справочников адресов с BGBilling]]<br /> * [[Активация доверительного платежа в привязанном к процессу договоре биллинга]]<br /> * [[Импорт контрагентов из договоров, sql запрос]]<br /> <br /> === Плагин Document ===<br /> * [[Примеры шаблонов для генерации документов]]<br /> * [[Примеры шаблонов для генерации документов (устаревшее)]]<br /> * [[Пустой шаблон]]<br /> <br /> === Плагин Report ===<br /> * [[Примеры отчётов BGCRM]]<br /> <br /> === Комплексные решения ===<br /> *[[Организация отключения должников КТВ]]<br /> *[[Интеграция с Asterisk для обработки входящих звонков]]<br /> <br /> === Интеграция с внешними системами ===<br /> *[[Asterisk - пример обращения от АТС]]<br /> *[[ВКонтакте - пример интеграции]]<br /> <br /> === Примеры динамического кода ===<br /> *[[Проверка уникальности контрагента по ИНН]]<br /> *[[Проверка уникальности контрагента по паспортным данным]]<br /> *[[Переключение статуса процессов по наступлению момента времени]]<br /> *[[Повышение приоритета процессов]]<br /> *[[Проверка правки параметра процесса]]<br /> *[[Изменение описания процесса по правке параметра]]<br /> *[[Обработка событий процесса согласования]]<br /> *[[Генерация новостей исполнителям при изменении процессов]]<br /> *[[Уведомление на email]]<br /> <br /> === Примеры JEXL конфигураций, скриптов обработки событий ===<br /> *[[Простая обработка событий процесса]]<br /> <br /> == DBInfo ==<br /> * [[Описание программы]]<br /> * [[Установка и настройка программы]]<br /> * [[Исходный код программы]]<br /> <br /> == Разработка ПО ==<br /> В данном разделе собираются рекомендации по разработке ПО. Это накопленная годами и пополняемая база знания призвана упростить обучение в первую очередь разработчиков, работающих с применяемыми в BiTel технологиями: Java, Web (JS, HTML), СУБД MySQL, LINUX, GIT. И разрабатывающих схожие приложения: тиражируемые продукты для автоматизации процессов организаций. Всё предельно конкретно, поэтому большая часть примеров будет приведена на Java.<br /> Однако значительная часть описываемых проблем и принципов довольно фундоментальна и может быть полезна разработчиками в иных областях.<br /> <br /> === В общем ===<br /> * [[Разработка]]<br /> * [[Оптимизация]]<br /> * [[Логирование]]<br /> * [[Сборка и публикация проекта]]<br /> <br /> === Java разработка ===<br /> * [[Работа с git в Eclipse(EGit)]]<br /> * [[Выявление неисправностей приложений]]<br /> * [[Обращение к Web-сервису]]<br /> * [[Работа с SQL в Java]]<br /> * [[Встроенный Application сервер в приложении]]<br /> * [[Потоки в Java]]<br /> * [[Обработка ошибок]]<br /> <br /> ==== Полезные Java библиотеки ====<br /> {| border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;<br /> |- valign=top align=&quot;center&quot; bgcolor=&quot;#eeeeee&quot; <br /> | Наименование || Область применения<br /> |-<br /> | [[Jimi - обработка изображений | JIMI]] || Обработка изображений<br /> |}<br /> <br /> === Технологии, используемые в проектах ===<br /> * [[XML]]<br /> * [[XSLT]]<br /> * [[FO(P)]]<br /> * [[REGEXP]]<br /> * [[MySQL REGEXP]]<br /> <br /> === Вспомогательные технологии ===<br /> * [[Сборщик Apache ANT]]<br /> * [[Сбор и анализ сетевого трафика]]<br /> * [[SSH]]<br /> * [[Оптимизация запросов в MySQL]]<br /> <br /> === Требования BiTel к оформлению ===<br /> * [[Java кода]]<br /> * [[MySQL кода]]</div> DimOn http://wiki.bitel.ru/index.php/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2_%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD-%D0%BF%D0%BB%D0%B0%D1%82%D0%B5%D0%B6%D0%B5%D0%B9 Примеры скриптов обработки онлайн-платежей 2017-07-03T09:20:24Z <p>DimOn:&#32;</p> <hr /> <div>По новому 54-ФЗ нужно печатать чек на каждый приём денег. Некоторые системы встраивают эту процедуру на своей стороне, в этих модулях биллинга есть возможность пользоваться этим. Они используют, например, атол-онлайн или свои мощности ККМ. Если вы хотите печатать чек на своей стороне и на своём ККМ, то в данный момент это можно сделать через небольшой набор скриптов.<br /> <br /> Работает так:<br /> <br /> Приходит платёж от сторонней системы, вы скриптом отлавливаете и небольшим кодом через API отправляете на печать чека. ККМ далее делает отправку в ОФД, далее ОФД отправляет email/sms итд. Все скрипты - для дин.кода.<br /> <br /> Документация по дин.классам: https://docs.bitel.ru/pages/viewpage.action?pageId=43385236<br /> <br /> Привязка дин.кода к событию: https://docs.bitel.ru/pages/viewpage.action?pageId=43385244<br /> <br /> Привязка дин.кода к глобальному скрипту: https://docs.bitel.ru/pages/viewpage.action?pageId=43385260<br /> <br /> Периодическое выполнение глобальных скриптов: https://docs.bitel.ru/pages/viewpage.action?pageId=43385264<br /> <br /> <br /> Скрипт на приём платежа:<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ***;<br /> <br /> import static ru.bitel.bgbilling.common.bean.BGBaseConstants.KEY_CUSTOMER_ADDRESS;<br /> <br /> import java.sql.Connection;<br /> <br /> import bitel.billing.server.util.MailMsg;<br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.kernel.contract.api.common.bean.Contract;<br /> import ru.bitel.bgbilling.kernel.contract.api.server.bean.ContractDao;<br /> import ru.bitel.bgbilling.kernel.contract.balance.common.bean.Payment;<br /> import ru.bitel.bgbilling.kernel.contract.balance.server.event.PaymentEvent;<br /> import ru.bitel.bgbilling.kernel.contract.config.server.ContractModuleConfigDao;<br /> import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase;<br /> import ru.bitel.bgbilling.plugins.cashcheck.server.CashCheckUtils;<br /> import ru.bitel.bgbilling.plugins.cashcheck.server.bean.Check;<br /> import ru.bitel.bgbilling.server.util.Setup;<br /> import ru.bitel.common.sql.ConnectionSet;<br /> <br /> /**<br /> * Обрабатываем приход платежа с печатью на регистраторах по событию «Приход платежа».<br /> * Попытка костыля для обработки онлайн-платежей.<br /> * @author dimon<br /> */<br /> public class CashCheckPrintPayment<br /> extends EventScriptBase&lt;PaymentEvent&gt;<br /> {<br /> /**<br /> * [Настройки здесь]<br /> * Номер ККМ из конфига плагина, на котором печатать.<br /> */<br /> private int kkmNum = 2;<br /> <br /> /**<br /> * [Настройки здесь]<br /> * Пароль, под которым заходит в ККМ.<br /> */<br /> private int kkmPass = 3;<br /> <br /> /**<br /> * [Настройки здесь]<br /> * e-mail администраторов, куда слать уведомления.<br /> */<br /> private String[] EMAILS = {&quot;***@***.ru&quot;};<br /> <br /> /**<br /> * [Настройки здесь]<br /> * На основании переданных данных (payment, contract) генерируется объект Check.<br /> * Там же внутри в объект Check ставятся тип платежей для ККМ (check.setPaymentType) и налоговая группа для ККМ (check.setTax).<br /> */<br /> private void makeCheck(Connection con, Payment payment, Contract contract) throws Exception<br /> {<br /> if(payment.getTypeId() == 99)<br /> {<br /> check = new Check();<br /> <br /> int MID = 16; // это mid модуля платёжного этого, того где в ЛК вводят нужный email, все мыла сохраняются отдельно для каждого модуля, сейчас так сделано <br /> <br /> ContractModuleConfigDao contractModuleConfigDao = new ContractModuleConfigDao( con, MID );<br /> String customerEmail = contractModuleConfigDao.get( contract.getId(), KEY_CUSTOMER_ADDRESS );<br /> contractModuleConfigDao.close();<br /> <br /> check.setPaymentType(1); // ставим ТИП ПЛАТЕЖА ККМ: 1 - нал, 2,3,4 - безнал или какой-то другой тип оплаты<br /> check.setTax(0); // ставим ТИП НАЛОГА ККМ: 0 - по номеру секции (в атолах), N - какой-то другой на выбор<br /> check.setOnlyElCheck(true); // &quot;только электронный чек&quot;<br /> check.setCustomerEmail(customerEmail);<br /> int paymentDep = 1; // отдел, используется ниже в addPayment<br /> // добавляем параметр договора<br /> //int PARAM_ID = 3;<br /> //ContractParameterManager bgParamMan = new ContractParameterManager( con );<br /> //String paramVal = bgParamMan.getStringParam( event.getContractID(), PARAM_ID );<br /> // check.addString( &quot;Какой-то параметр договора: &quot; + paramVal );<br /> check.addPayment( payment.getSum(), &quot;Оплата услуг Интернета и Телевидения по договору&quot; + contract.getTitle(), paymentDep );<br /> }<br /> if(payment.getTypeId() == 666) // остальные ветки по аналогии<br /> {<br /> //check = new Check();<br /> //...<br /> }<br /> }<br /> <br /> // --- всё что ниже менять не нужно ---<br /> <br /> private Check check = null;<br /> <br /> @Override<br /> public void onEvent(PaymentEvent event, Setup setup, ConnectionSet set)<br /> throws Exception<br /> {<br /> if(event.isEditMode()) return; // если платёж редактируется, а не создаётся, то сразу уходим<br /> Connection con = set.getConnection();<br /> Payment payment = event.getPayment();<br /> int userId = payment.getUserId();<br /> check = null;<br /> print( &quot;CashCheck Autoprint: user id=&quot;+userId+&quot;, payment should be automatically printed...&quot; );<br /> ContractDao contractDao = new ContractDao(con, userId);<br /> Contract contract = contractDao.get(payment.getContractId());<br /> contractDao.close();<br /> makeCheck( con, payment, contract ); // в этом методе делается всё про чек - устанавливаются глобальные check и kkmNum<br /> if( check != null )<br /> {<br /> try<br /> {<br /> CashCheckUtils.printCheck(check, CashCheckUtils.getPrinter( kkmNum ), kkmPass, con, payment.getId());<br /> print( &quot;CashCheck Autoprint: check was printed!&quot; );<br /> }<br /> catch(BGException e)<br /> {<br /> print( &quot;CashCheck Autoprint: check ERROR: &quot; + e.getMessage() );<br /> sendMails(setup, &quot;CashCheck Autoprint: check ERROR&quot;, e.printStackTraceToString());<br /> }<br /> }<br /> else<br /> {<br /> error( &quot;CashCheck Autoprint: makeCheck: check == null, payment NOT printed!&quot; ); <br /> }<br /> }<br /> <br /> private void sendMails(Setup setup, String subject, String body)<br /> {<br /> MailMsg mailmsg = new MailMsg(setup);<br /> for(String email : EMAILS)<br /> {<br /> try<br /> {<br /> print(&quot;CashCheck Autoprint: Send e-mail to &quot;+email+&quot;...&quot;);<br /> mailmsg.sendMessage(email, subject, body);<br /> }<br /> catch (Exception e)<br /> {<br /> error(&quot;CashCheck Autoprint: Error send e-mail: &quot;+e.toString());<br /> }<br /> }<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> Также надо бы автоматически закрывать день. Для этого скрипт по таймеру каждую ночь делает на ККМ z-отчёт.<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ***;<br /> <br /> import bitel.billing.server.util.MailMsg;<br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;<br /> import ru.bitel.bgbilling.plugins.cashcheck.server.CashCheckUtils;<br /> import ru.bitel.bgbilling.server.util.Setup;<br /> import ru.bitel.common.sql.ConnectionSet;<br /> <br /> /**<br /> * Закрытие дня (снятие z-отчёта). Скрипт глобальный, для выполнения по таймеру.<br /> * Подразумевается запуск поздно ночью.<br /> * Попытка костыля для обработки онлайн-платежей.<br /> * @author dimon<br /> */<br /> public class CashCheckCloseDay<br /> extends GlobalScriptBase<br /> {<br /> /**<br /> * [Настройки здесь]<br /> * Номер ККМ из конфига плагина, на котором печатать.<br /> */<br /> private int kkmNum = 2;<br /> <br /> /**<br /> * [Настройки здесь]<br /> * Пароль, под которым заходит в ККМ. Скорее всего нужен админский.<br /> */<br /> private int kkmPass = 30;<br /> <br /> /**<br /> * [Настройки здесь]<br /> * e-mail администраторов, куда слать уведомления.<br /> */<br /> private String[] EMAILS = {&quot;***@***.ru&quot;};<br /> <br /> @Override<br /> public void execute(Setup setup, ConnectionSet set)<br /> throws Exception<br /> {<br /> print( &quot;CashCheck Autoprint: ZReport...&quot; );<br /> try<br /> {<br /> CashCheckUtils.ZReport(CashCheckUtils.getPrinter( kkmNum ), kkmPass);<br /> print( &quot;CashCheck Autoprint: ZReport was made!&quot; );<br /> sendMails(setup, &quot;CashCheck Autoprint: ZReport was made!&quot;, &quot;subj&quot;);<br /> }<br /> catch(BGException e)<br /> {<br /> print( &quot;CashCheck Autoprint: ZReport ERROR: &quot; + e.getMessage() );<br /> sendMails(setup, &quot;CashCheck Autoprint: ZReport ERROR&quot;, e.printStackTraceToString());<br /> }<br /> }<br /> <br /> private void sendMails(Setup setup, String subject, String body)<br /> {<br /> MailMsg mailmsg = new MailMsg(setup);<br /> for(String email : EMAILS)<br /> {<br /> try<br /> {<br /> print(&quot;CashCheck Autoprint: Send e-mail to &quot;+email+&quot;...&quot;);<br /> mailmsg.sendMessage(email, subject, body);<br /> }<br /> catch (Exception e)<br /> {<br /> error(&quot;CashCheck Autoprint: Error send e-mail: &quot;+e.toString());<br /> }<br /> }<br /> }<br /> }<br /> &lt;/source&gt;</div> DimOn http://wiki.bitel.ru/index.php/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2_%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD-%D0%BF%D0%BB%D0%B0%D1%82%D0%B5%D0%B6%D0%B5%D0%B9 Примеры скриптов обработки онлайн-платежей 2017-07-03T09:20:03Z <p>DimOn:&#32;Новая страница: «По новому 54-ФЗ нужно печатать чек на каждый приём денег. Некоторые системы встраивают эту …»</p> <hr /> <div>По новому 54-ФЗ нужно печатать чек на каждый приём денег. Некоторые системы встраивают эту процедуру на своей стороне, в этих модулях биллинга есть возможность пользоваться этим. Они используют, например, атол-онлайн или свои мощности ККМ. Если вы хотите печатать чек на своей стороне и на своём ККМ, то в данный момент это можно сделать через небольшой набор скриптов.<br /> <br /> Работает так:<br /> <br /> Приходит платёж от сторонней системы, вы скриптом отлавливаете и небольшим кодом через API отправляете на печать чека. ККМ далее делает отправку в ОФД, далее ОФД отправляет email/sms итд. Все скрипты - для дин.кода.<br /> <br /> Документация по дин.классам: https://docs.bitel.ru/pages/viewpage.action?pageId=43385236<br /> Привязка дин.кода к событию: https://docs.bitel.ru/pages/viewpage.action?pageId=43385244<br /> Привязка дин.кода к глобальному скрипту: https://docs.bitel.ru/pages/viewpage.action?pageId=43385260<br /> Периодическое выполнение глобальных скриптов: https://docs.bitel.ru/pages/viewpage.action?pageId=43385264<br /> <br /> Скрипт на приём платежа:<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ***;<br /> <br /> import static ru.bitel.bgbilling.common.bean.BGBaseConstants.KEY_CUSTOMER_ADDRESS;<br /> <br /> import java.sql.Connection;<br /> <br /> import bitel.billing.server.util.MailMsg;<br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.kernel.contract.api.common.bean.Contract;<br /> import ru.bitel.bgbilling.kernel.contract.api.server.bean.ContractDao;<br /> import ru.bitel.bgbilling.kernel.contract.balance.common.bean.Payment;<br /> import ru.bitel.bgbilling.kernel.contract.balance.server.event.PaymentEvent;<br /> import ru.bitel.bgbilling.kernel.contract.config.server.ContractModuleConfigDao;<br /> import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase;<br /> import ru.bitel.bgbilling.plugins.cashcheck.server.CashCheckUtils;<br /> import ru.bitel.bgbilling.plugins.cashcheck.server.bean.Check;<br /> import ru.bitel.bgbilling.server.util.Setup;<br /> import ru.bitel.common.sql.ConnectionSet;<br /> <br /> /**<br /> * Обрабатываем приход платежа с печатью на регистраторах по событию «Приход платежа».<br /> * Попытка костыля для обработки онлайн-платежей.<br /> * @author dimon<br /> */<br /> public class CashCheckPrintPayment<br /> extends EventScriptBase&lt;PaymentEvent&gt;<br /> {<br /> /**<br /> * [Настройки здесь]<br /> * Номер ККМ из конфига плагина, на котором печатать.<br /> */<br /> private int kkmNum = 2;<br /> <br /> /**<br /> * [Настройки здесь]<br /> * Пароль, под которым заходит в ККМ.<br /> */<br /> private int kkmPass = 3;<br /> <br /> /**<br /> * [Настройки здесь]<br /> * e-mail администраторов, куда слать уведомления.<br /> */<br /> private String[] EMAILS = {&quot;***@***.ru&quot;};<br /> <br /> /**<br /> * [Настройки здесь]<br /> * На основании переданных данных (payment, contract) генерируется объект Check.<br /> * Там же внутри в объект Check ставятся тип платежей для ККМ (check.setPaymentType) и налоговая группа для ККМ (check.setTax).<br /> */<br /> private void makeCheck(Connection con, Payment payment, Contract contract) throws Exception<br /> {<br /> if(payment.getTypeId() == 99)<br /> {<br /> check = new Check();<br /> <br /> int MID = 16; // это mid модуля платёжного этого, того где в ЛК вводят нужный email, все мыла сохраняются отдельно для каждого модуля, сейчас так сделано <br /> <br /> ContractModuleConfigDao contractModuleConfigDao = new ContractModuleConfigDao( con, MID );<br /> String customerEmail = contractModuleConfigDao.get( contract.getId(), KEY_CUSTOMER_ADDRESS );<br /> contractModuleConfigDao.close();<br /> <br /> check.setPaymentType(1); // ставим ТИП ПЛАТЕЖА ККМ: 1 - нал, 2,3,4 - безнал или какой-то другой тип оплаты<br /> check.setTax(0); // ставим ТИП НАЛОГА ККМ: 0 - по номеру секции (в атолах), N - какой-то другой на выбор<br /> check.setOnlyElCheck(true); // &quot;только электронный чек&quot;<br /> check.setCustomerEmail(customerEmail);<br /> int paymentDep = 1; // отдел, используется ниже в addPayment<br /> // добавляем параметр договора<br /> //int PARAM_ID = 3;<br /> //ContractParameterManager bgParamMan = new ContractParameterManager( con );<br /> //String paramVal = bgParamMan.getStringParam( event.getContractID(), PARAM_ID );<br /> // check.addString( &quot;Какой-то параметр договора: &quot; + paramVal );<br /> check.addPayment( payment.getSum(), &quot;Оплата услуг Интернета и Телевидения по договору&quot; + contract.getTitle(), paymentDep );<br /> }<br /> if(payment.getTypeId() == 666) // остальные ветки по аналогии<br /> {<br /> //check = new Check();<br /> //...<br /> }<br /> }<br /> <br /> // --- всё что ниже менять не нужно ---<br /> <br /> private Check check = null;<br /> <br /> @Override<br /> public void onEvent(PaymentEvent event, Setup setup, ConnectionSet set)<br /> throws Exception<br /> {<br /> if(event.isEditMode()) return; // если платёж редактируется, а не создаётся, то сразу уходим<br /> Connection con = set.getConnection();<br /> Payment payment = event.getPayment();<br /> int userId = payment.getUserId();<br /> check = null;<br /> print( &quot;CashCheck Autoprint: user id=&quot;+userId+&quot;, payment should be automatically printed...&quot; );<br /> ContractDao contractDao = new ContractDao(con, userId);<br /> Contract contract = contractDao.get(payment.getContractId());<br /> contractDao.close();<br /> makeCheck( con, payment, contract ); // в этом методе делается всё про чек - устанавливаются глобальные check и kkmNum<br /> if( check != null )<br /> {<br /> try<br /> {<br /> CashCheckUtils.printCheck(check, CashCheckUtils.getPrinter( kkmNum ), kkmPass, con, payment.getId());<br /> print( &quot;CashCheck Autoprint: check was printed!&quot; );<br /> }<br /> catch(BGException e)<br /> {<br /> print( &quot;CashCheck Autoprint: check ERROR: &quot; + e.getMessage() );<br /> sendMails(setup, &quot;CashCheck Autoprint: check ERROR&quot;, e.printStackTraceToString());<br /> }<br /> }<br /> else<br /> {<br /> error( &quot;CashCheck Autoprint: makeCheck: check == null, payment NOT printed!&quot; ); <br /> }<br /> }<br /> <br /> private void sendMails(Setup setup, String subject, String body)<br /> {<br /> MailMsg mailmsg = new MailMsg(setup);<br /> for(String email : EMAILS)<br /> {<br /> try<br /> {<br /> print(&quot;CashCheck Autoprint: Send e-mail to &quot;+email+&quot;...&quot;);<br /> mailmsg.sendMessage(email, subject, body);<br /> }<br /> catch (Exception e)<br /> {<br /> error(&quot;CashCheck Autoprint: Error send e-mail: &quot;+e.toString());<br /> }<br /> }<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> Также надо бы автоматически закрывать день. Для этого скрипт по таймеру каждую ночь делает на ККМ z-отчёт.<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ***;<br /> <br /> import bitel.billing.server.util.MailMsg;<br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;<br /> import ru.bitel.bgbilling.plugins.cashcheck.server.CashCheckUtils;<br /> import ru.bitel.bgbilling.server.util.Setup;<br /> import ru.bitel.common.sql.ConnectionSet;<br /> <br /> /**<br /> * Закрытие дня (снятие z-отчёта). Скрипт глобальный, для выполнения по таймеру.<br /> * Подразумевается запуск поздно ночью.<br /> * Попытка костыля для обработки онлайн-платежей.<br /> * @author dimon<br /> */<br /> public class CashCheckCloseDay<br /> extends GlobalScriptBase<br /> {<br /> /**<br /> * [Настройки здесь]<br /> * Номер ККМ из конфига плагина, на котором печатать.<br /> */<br /> private int kkmNum = 2;<br /> <br /> /**<br /> * [Настройки здесь]<br /> * Пароль, под которым заходит в ККМ. Скорее всего нужен админский.<br /> */<br /> private int kkmPass = 30;<br /> <br /> /**<br /> * [Настройки здесь]<br /> * e-mail администраторов, куда слать уведомления.<br /> */<br /> private String[] EMAILS = {&quot;***@***.ru&quot;};<br /> <br /> @Override<br /> public void execute(Setup setup, ConnectionSet set)<br /> throws Exception<br /> {<br /> print( &quot;CashCheck Autoprint: ZReport...&quot; );<br /> try<br /> {<br /> CashCheckUtils.ZReport(CashCheckUtils.getPrinter( kkmNum ), kkmPass);<br /> print( &quot;CashCheck Autoprint: ZReport was made!&quot; );<br /> sendMails(setup, &quot;CashCheck Autoprint: ZReport was made!&quot;, &quot;subj&quot;);<br /> }<br /> catch(BGException e)<br /> {<br /> print( &quot;CashCheck Autoprint: ZReport ERROR: &quot; + e.getMessage() );<br /> sendMails(setup, &quot;CashCheck Autoprint: ZReport ERROR&quot;, e.printStackTraceToString());<br /> }<br /> }<br /> <br /> private void sendMails(Setup setup, String subject, String body)<br /> {<br /> MailMsg mailmsg = new MailMsg(setup);<br /> for(String email : EMAILS)<br /> {<br /> try<br /> {<br /> print(&quot;CashCheck Autoprint: Send e-mail to &quot;+email+&quot;...&quot;);<br /> mailmsg.sendMessage(email, subject, body);<br /> }<br /> catch (Exception e)<br /> {<br /> error(&quot;CashCheck Autoprint: Error send e-mail: &quot;+e.toString());<br /> }<br /> }<br /> }<br /> }<br /> &lt;/source&gt;</div> DimOn http://wiki.bitel.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0 Заглавная страница 2017-07-03T09:07:57Z <p>DimOn:&#32;/* Плагин CashCheck */</p> <hr /> <div>== О BiTel Wiki ==<br /> Здесь вы можете получить больше информации о продуктах BiTel: BGBilling, BGCRM, а также поделиться своим опытом с другими пользователями. В то время как документация часто предоставляет общие сведения о системе и ее настройках, в WiKi приводятся конкретные примеры.<br /> <br /> * &lt;b&gt;[[Как выложить статью на WiKi]]&lt;/b&gt;<br /> * [[Оформление статей]]<br /> * [http://forum.bitel.ru/ Форум BiTel]<br /> <br /> == Специалисты ==<br /> Уважаемые &quot;продвинутые пользователи&quot;. Здесь вы можете располагать записи со своими контактами для оказания воздмездной или безвозмездной помощи по настройке системы BGBilling пользователям, не столь далеко продвинувшимся. Желательно указывать ваши контактные данные и &quot;специализацию&quot;. Отзывы по исполнителям можно оставить/почитать [http://forum.bitel.ru/viewtopic.php?t=9329 на форуме].<br /> {| border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;<br /> |- valign=top align=&quot;center&quot; bgcolor=&quot;#eeeeee&quot; <br /> | Имя || Специализация || Контакт || Примечания<br /> |-<br /> | Олег Алтынников || Установка, настройка, поддержка биллинга, миграция с других|| E-mail: murano@linkray.ru, ICQ: 462851472 || Написание скриптов, интеграция с любым оборудованием (IPTV, Интернет, DPI, Телефония), проекты любой сложности под любые задачи, автоматизация, оптимизация работы, Linux/FreeBSD и многое другое<br /> |-<br /> |-<br /> | Рустам Тазуркаев || Mikrotik, переход с NetUp, CISCO || [[Изображение:Cpec_2_contact.png]] &lt;!-- ICQ: 648986--&gt; ||<br /> |-<br /> | Михаил Чернобаев || Скрипты биллинга, Java-расширения, интеграция с другими системами || Тел. +79619322588 || Автоматизация бизнес-процессов: скриптование в биллинге, расширение BGBS API, разработка инструментов интеграции с другими системами. Переход на BGBilling. Возможны крупные проекты.<br /> |- <br /> | Борис Близнюков || Скрипты биллинга, CISCO, Voip, Mera || [[Изображение:Cpec_4_contact.png]] &lt;!--ICQ: 1996944--&gt; || Только бесплатные краткие консультации. Очень хороший специалист по CISCO.<br /> |-<br /> | Андрей Бехтерев || Cisco, UNIX, ISP, Asterisk || ICQ: 7021464 WEB: http://behterev.su/ || Обширный спектр оборудования. Консалтинг.<br /> |-<br /> | Гершевич М.М. || Доработка конфигурации 1С и прочего ПО. || Тел. +79248454888 +7-(4162)-238-777 WEB: http://www.amurimpulse.ru/ mail: mike1008@mail.ru || Консалтинг. Информационная безопасность. Интеграция биллинга. Крупные проекты. Работа под заказ.<br /> |-<br /> | Андрей Зюзенков || Android, Linux, Eltex, Asterisk, BGBilling || [https://bghelp.ru Сайт], e-mail: info@bghelp.ru || Интеграция, мобильные приложения на Android<br /> |-<br /> | Семён Кошечкин || Java || email/gtalk: [[Файл:Cpec_5_contact.jpg]]|| Скрипты, дополнения, модуль Inet. [[%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:Contributions/Cromeshnic|wiki]]<br /> |-<br /> |-<br /> | Конференция BGBilling || Вопросы касаемо системы BGBilling || https://t.me/bgbilling || Администраторы АСР BGBillig (иногда и разработчики) помогают друг другу в разных вопросах.<br /> |}<br /> <br /> == BGBilling ==<br /> === Установка ===<br /> * [[Установка на gentoo]]<br /> * [[Установка на Sun Solaris]]<br /> * [[Установка на Slackware]]<br /> * [[Установка на FreeBSD]]<br /> * [[Установка на Ubuntu 8 Desktop]]<br /> * [[Установка на Ubuntu 9.10 Desktop]]<br /> <br /> <br /> ==== Перенос данных в биллинг ====<br /> *[[Пример конвертера данных из csv-файлов в базу BGBilling]]<br /> *[[Пример конвертера данных из CSV-файлов в базу BGBilling - 2]]<br /> *[[Пример конвертера данных из CSV-файлов в базу BGBilling - 3]]<br /> *[[Конвертер базы Netup]]<br /> *[[Примеры конвертеров данных из других биллинговых систем]]<br /> <br /> === Администрирование ===<br /> * [[Разграничение прав действий]]<br /> * [[Настройка безопасности сервера биллинга и компонентов биллинга]]<br /> * [[Принудительный останов процессов биллинга]]<br /> * [[Использование подписанного SSL сертификата]]<br /> * [[Запуск scheduler и data_loader с другими портами управления]]<br /> * [[bg-snmp-management|Мониторинг java-процессов по snmp]]<br /> * [[Пример юнита для systemd]]<br /> * [[Скрипты автостарта демонов bgbilling для Debian]]<br /> * [[javaws|Запуск BGBillingClient через Java Web Start]]<br /> * [[Мониторинг Inet-Radius через JMX]]<br /> * [[Интеграция существующего сертификата и приватного ключа SSL в хранилище keystore]]<br /> <br /> === Настройка вспомогательного ПО ===<br /> *[[Проксирование обращений к BGBillingServer посредством nginx]]<br /> <br /> ==== WildFly личный кабинет ====<br /> *[[Включение https]]<br /> <br /> ==== MySQL ====<br /> *[[Рекомендации по настройке MySQL]]<br /> *[[database backup|Backup MySQL базы с помощью snapshot'ов (Linux, LVM)]]<br /> *[[Настройка MySQL репликации]]<br /> *[[Установка триггера в MySQL для отслеживания изменений]]<br /> *[[Скрипт восстановления MySQL репликации]]<br /> *[[Simple DB backup]]<br /> *[[Galera]]<br /> <br /> ==== NetFlow ====<br /> *[[Настройка NetFlow-агента IPCAD]]<br /> *[[Разделение NetFlow-потоков]]<br /> <br /> === Технологии ===<br /> *[[BGBilling_XSLT|XSLT]]<br /> <br /> === Разработка ===<br /> *[[Отладка action'ов в IntelliJ IDEA]]<br /> *[[Разработка динамического кода в IDE Eclipse]]<br /> <br /> === [[XSLT]] шаблоны ===<br /> *[[Добавление параметров договора на страницу личного кабинета]]<br /> &lt;!-- *[[Красивые графики статистики в модуле IPN]] --&gt;<br /> *[[Карточки договора]]<br /> *[[Создание XSLT/FO шаблона со штрихкодами]]<br /> *[[Подстановка данных в зависимости от текущего пользователя биллинга]]<br /> *[[Генерация прайса модуля IP телефонии в карточке договора]]<br /> <br /> ==== Счета ====<br /> *[[Печать счета-фактуры и акта на отдельных листах]]<br /> *[[Расширенные счета модуля бухгалтерии]]<br /> *[[Квитанция телефонии физ. лицам]]<br /> *[[Шаблоны вывода названия месяца]]<br /> *[[Изменения в шаблоне в зависимости от месяца документа]]<br /> *[[Добавление новых шрифтов в FO шаблоны]]<br /> <br /> === Интеграция с внешними системами ===<br /> * [[Прямая интеграция с платежными терминалами ЭСФОР / SFOUR]]<br /> * [[Интеграция с платежной системой с использованием модуля Card]]<br /> * [[Интеграция с платежной системой Robokassa]]<br /> * [[SMS рассылка через SMPP]]<br /> * [[SMS рассылка через SMPP по средствам дин кода в 5.2]]<br /> * [[Система учета &quot;Заявки и Наряды&quot; на java]]<br /> * [[Bash скрипт-отсылка смс через телефон при отсутствие ping на заданный узел]]<br /> * [[Запросы в личный кабинет пользователя сторонними системами]]<br /> * [[Запросы к серверу биллинга сторонними системами]]<br /> <br /> ==== 1С ====<br /> * [[BGBilling-1C]]<br /> * [[amurimpulse.ru bgbilling]]<br /> * [[Integrator 1C-BGBilling]]<br /> * [[Пример обращения к биллингу из 1С v.7.7]]<br /> * [[Пример интеграции с 1С v.7.7]]<br /> * [[Пример интеграции с 1С v.8.1]]<br /> * [[Пример интеграции с 1С через custom API]]<br /> * [[Установка unload_status счета через HTTP-запрос]]<br /> ==== Android ====<br /> *[[Разработка мобильных приложений на Android]]<br /> <br /> === Динамический код (скрипты BGBS для старых версий) ===<br /> *[[Логгирование в скриптах поведения]]<br /> <br /> ==== Динамический код ====<br /> *[[Конвертирование адреса]]<br /> *[[Глобальная синхронзация услуг модуля npay с тарифным планом]]<br /> *[[Новый номер договора группе договоров]]<br /> *[[Скрипт проверки таймзон (timezone, tz, tzdata) в java]]<br /> <br /> ==== Комплексные решения ====<br /> *[[Предоставление тестового периода пользования услугой]]<br /> *[[Организация системы отслеживания и отключения КТВ должников на BGBS с использованием CRM плагина]]<br /> *[[Автоматизация подключений VPN-клиентов с использованием CRM плагина]]<br /> *[[Пример автоматизации подключения новых клиентов]]<br /> <br /> ==== Глобальные скрипты ====<br /> *[[Скрипт глобальный отмены перехода на тарифы при неоплате]]<br /> *[[Скрипт предоставление скидки пенсионерам]]<br /> *[[Скрипт создания субдоговоров по шаблону]]<br /> *[[Глобальное событие запуска сервера]]<br /> *[[Перемещение в группу через 3 месяца если не было движения денег в наработке]]<br /> *[[Поиск и изменение статусов у договоров]]<br /> *[[Получение списка доступных действий в SQL]]<br /> *[[Глобальный скрипт для удаления старых таблиц]]<br /> <br /> ==== Пользовательские библиотеки скриптов ====<br /> *[[Пересчеты и бонусы]]<br /> *[[Архивирование логов netflow и radius accaunting]]<br /> <br /> ==== Ядро ====<br /> *[[Смена тарифного плана по заданию пользователя]]<br /> *[[Валидация текстового параметра]]<br /> *[[Проверка ИНН/КПП при вводе]]<br /> *[[Проверка параметра договора перед изменением]]<br /> *[[Обработка смены параметра договора]]<br /> *[[Создание списка дополнительных действий для договора]]<br /> *[[Обработка события создания договора]]<br /> *[[Обработка события &quot;добавление услуги RSCM в договор&quot; . Скипт сменяет тариф, подключает абонплату ]]<br /> *[[Приостановление договора клиентом через WEB]]<br /> *[[Скрипт проверки баланса и отключения договора]]<br /> *[[Изменение стандартной логики перетирания статусов]]<br /> *[[Пример продажи OEM ключей с помощью скрипта]]<br /> *[[Пример копирования тарифного плана]]<br /> *[[Получение текущего пользователя биллинга]]<br /> *[[Запуск скрипта до и после акшена]]<br /> *[[Примеры скриптов до и после акшена]]<br /> *[[Примеры динамического кода акшена и веб-сервисов]]<br /> *[[Начисление бонусов на счет при платежах определенного типа]]<br /> *[[Включение должников по приходу платежа]]<br /> *[[Снижение лимита при внесении расхода]]<br /> *[[Изменение суммы лимита определенной группе договоров]]<br /> *[[Синхронизация услуг договора в соответствии с тарифными планами]]<br /> *[[Добавление группы и снятие в зависимости от статуса]]<br /> *[[Управление статусом договора по состоянию баланса]]<br /> *[[Запрет на вход в личный кабинет с закрытых договоров]]<br /> *[[Переход на понижающий тариф только со следующего месяца]]<br /> *[[Пример создания своего интерфейса в клиенте]]<br /> *[[Метки услуг]]<br /> *[[Сравнение прав пользователей]]<br /> *[[Свой список шаблонов договоров]]<br /> *[[Модификация приходящего платежа (снятие процента)]]<br /> *[[Подкрашивание договоров в поиске]]<br /> *[[Пример добавления пунктов в ЛК редиректящих на url]]<br /> <br /> ==== Модуль Bill ====<br /> *[[Создание счета в модуле Bill]]<br /> *[[Создание счета из суммы платежей по классу договоров]]<br /> *[[Создание счета по таблице позиций]]<br /> *[[Создание счета и счет-фактур в модуле Bill(выполнение тех же действий что и руками)]]<br /> *[[Создание счетов на предоплату]]<br /> *[[Распечатка счетов в pdf по событию генерации счета]]<br /> *[[Внешняя программа на JAVA для синхронизации номеров счетов и актов выполненных работ (версия BGBilling 5.0)]]<br /> *[[Автоматическая отправка счетов через глобальный скрипт поведения]]<br /> <br /> ==== Модуль DialUp ====<br /> *[[Запуск переначисления в модуле DialUp]]<br /> *[[Передача ACCEPT вместо REJECT вместе с доп. аттрибутами]]<br /> *[[Обработка запроса учетного периода]]<br /> *[[Переинициализация тарифа в пределах сессии | Обработка запроса учетного периода (переинициализация тарифа в пределах сессии) ]]<br /> *[[Ограничение доступа для различных групп пользователей для BGRadiusDialup]]<br /> *[[Детальное информирование абонентов о причинах ошибки 691]]<br /> *[[Аутентификация с учетом Calling-Id-Station]]<br /> *[[Доп. действие сброса активных соединений]]<br /> *[[Открытие абонплаты по первой установке соединения]]<br /> *[[Пересчет трафика по данным Radius (при потерянных Netflow-логах)]]<br /> *[[Отключение Fake сессий при приходе платежа]]<br /> *[[Ограничение доступа на основе объектов]]<br /> <br /> ==== Модуль DialUp / Cкрипты предобработки RADIUS запросов ====<br /> * [[Уcтановка услуги типа &quot;Время&quot; для BGRadiusDialup]]<br /> * [[Установка фиксированного пароля]]<br /> * [[Нормализация параметра Acct-Session-Id у маршрутизатора Cisco]]<br /> * [[Разделение атрибута User-Name на логин и пароль]]<br /> * [[Вынос MAC адреса из cisco-avp-pair в Calling-Station-Id]]<br /> * [[Копирование Тunnel-Client-Endpoint/Tunnel-Server-Endpoint в Calling-Station-Id/Called-Station-Id]]<br /> * [[Замена radius-атрибутов при авторизации]]<br /> <br /> ==== Модуль Inet / Cкрипты предобработки RADIUS запросов ====<br /> * [[Вынос MAC адреса из cisco-avp-pair в Calling-Station-Id для модуля Inet]]<br /> <br /> ==== Модуль СerberСrypt ====<br /> *[[Изменение подписки карты через web (cerbercrypt)]]<br /> *[[Управление подписками через веб (cerbercrypt)]]<br /> *[[Дин.код для синхронизации pairing с внешнего cas]]<br /> *[[Скрипт активации/деактивации карты при добавлении/удалении]]<br /> <br /> ==== Модуль NPay ====<br /> *[[Определение размера абонентской платы]]<br /> *[[Запуск переначисления в модуле NPay]]<br /> *[[Дебетовые абонплаты. Снятие штрафа за разблокировку.]]<br /> *[[Снятие абонентской платы в дебитовых договорах]]<br /> *[[Предварительное уведомление о блокировке по дебетовым абонплатам]]<br /> *[[ Начисление абонплат по схеме 15-15 ]]<br /> *[[Персональные цены для договоров]]<br /> <br /> ==== Модуль Phone ====<br /> *[[При создании поинта модуля Phone добавление в него абонплат]]<br /> *[[Закрытие_телефонных_договоров]]<br /> <br /> ==== Модуль RSCM ====<br /> *[[Запуск переначисления в модуле RSCM]]<br /> *[[Перенос суммы расхода в наработку RSCM модуля]]<br /> <br /> ==== Модуль VoiceIp ====<br /> *[[Определение стоимости звонка VoiceIp]]<br /> <br /> ==== Модуль VoiceIp / Cкрипты предобработки RADIUS запросов ====<br /> * [[Идентификация Voip оператора по подсети (транзит)]]<br /> * [[Установка параметров звонка Voip]]<br /> * [[Установка фиксированного пароля]]<br /> * [[Разделение атрибута User-Name на логин и пароль]]<br /> * [[Замена radius-атрибутов при авторизации]]<br /> <br /> ==== Плагин CRM ====<br /> *[[Обработка выполненных задач в журнале задач]]<br /> *[[Обработка задач по событию ядра &quot;Поступление платежа&quot;, создание новой задачи и изменение существующей]]<br /> *[[Пример получения информации о задаче]]<br /> *[[Уведомления монтажников о новых активных задачах путем отправки SMS XML запросом]]<br /> <br /> ==== Плагин CashCheck ====<br /> *[[Чек: добавление позиции]]<br /> *[[Чек: завершение формирования]]<br /> *[[Примеры скриптов CashCheck]]<br /> *[[Примеры скриптов обработки онлайн-платежей]]<br /> <br /> ==== Плагин Documents ====<br /> *[[Создание копий документа на договорах]]<br /> <br /> ==== Модуль Inet ====<br /> *[[Скрипт активации учетного периода]]<br /> *[[Скрипт закрытия соединений]]<br /> <br /> === Решения для модулей и плагинов ===<br /> <br /> ==== Модуль DialUP ====<br /> *[[Настройка Lucent Ascend MAX6000 в качестве DialUP сервера]]<br /> *[[Настройка Dial-IN сервера FreeBSD PPPD]]<br /> *[[Настройка VPN сервера LINUX PPPD + POPTOP]]<br /> *[[Настройка шейпера в LINUX PPPD]]<br /> *[[Настройка VPN сервера FreeBSD MPD]]<br /> *[[Настройка PPPoE сервера на Cisco-роутере]]<br /> *[[Настройка PPPoE и/или РРТР (VPN) на Mikrotik]]<br /> *[[Проблема с прохождением update пакетов и сброса сессий в Debian и Ubuntu дистрибутивах]]<br /> *[[Настройка Dial-IN Windows RRAS сервера]]<br /> *[[VPN доступ с повременной тарификацией на базе FreeBSD MPD]]<br /> *[[Организация семейства UNLIMIT тарифов на базе FreeBSD MPD]]<br /> *[[Примеры тарифных планов VPN/DialUp]]<br /> *[[Отключение сессий по PoD на CISCO]]<br /> *[[Пример скрипта управления уровнями BGRadiusDialup]]<br /> *[[Настройка cisco с поддеркой ISG]]<br /> *[[Настройка BGBilling c поддеркой ISG]]<br /> *[[Настройка BGBilling с RedBack SmartEdge (PPPOE)]]<br /> <br /> ==== Модуль E-Mail ====<br /> *[[Почтовая система Exim + Cyrus + OpenLDAP на FreeBSD]]<br /> *[[Postfix/MySQL/BGBilling]]<br /> *[[Postfix+dovecot+ldap]]<br /> *[[Postfix+Mysql+Virtual domains]]<br /> <br /> ==== Модуль Inet ====<br /> *[[Inet FAQ]]<br /> *[[Схемы подключения]]<br /> *[[Расширения]]<br /> *[[Конвертеры из IPN в INET]]<br /> *[[Конвертер: логины Dialup в сервисы inet]]<br /> *[[WiFi-портал с активацией по sms ]]<br /> *[[WiFi-портал с оплатой картой через assist ]]<br /> <br /> ==== Модуль IPN ====<br /> *[[IP/VPN]]<br /> *[[Примеры тарифных планов IPN]]<br /> *[[Настройка BGIPNNetflowCollector]]<br /> *[[Методика определения причины отсутствия трафика в отчете договора]]<br /> *[[Связка с flow-tools]]<br /> *[[Экспорт Netflow-данных в формат Nfdump]]<br /> *[[Реалиазация шлюза на Cisco]]<br /> *[[Реализация шлюзов на BeanShell,примеры стандартных и других шлюзов]] (Manad, Cisco, Zyxel, Mikrotik)<br /> *[[Изменения в manad для работы с одним pipe на множество IP адресов]]<br /> *[[FreeBSD manad, понимающий изменения правил в тарифах]]<br /> *[[Табличный FreeBSD manad, понимающий изменения правил в тарифах]]<br /> *[[Пример реализации скриптового универсального шлюза]]<br /> *[[Конвертер привязок услуг dialup в привязки ipn]]<br /> *[[Реализация скрипта Manad]]<br /> *[[Настройка шлюза Mikrotik]]<br /> *[[Обновление номеров интерфейсов при замене роутера]]<br /> <br /> ==== Модуль Phone ====<br /> * [[Конвертация и загрузка тарифов Телефонии в биллинг]]<br /> * [[Примеры тарифных планов Телефонии]]<br /> * [[Примеры реализации конверторов логов]]<br /> * [[Генератор отчётности для Совинтел]]<br /> <br /> ==== Модуль Reports ====<br /> *[[Редактирование отчетов в iReport]]<br /> *[[Примеры отчётов]]<br /> *[[Использование отчётов для организации универсального поиска]]<br /> *[[Табличные отчёты с динамическими столбцами]]<br /> *[[Табличные отчёты в динамическом коде]]<br /> *[[Сохранение JasperReports-отчёта на сервере в pdf]]<br /> <br /> ==== Модуль TV ====<br /> *[[Активация/добавление модуля на договор через дополнительное действие]]<br /> <br /> ==== Модуль VoiceIP ====<br /> *[[Интеграция Asterisk и BGBilling (Accounting) посредством скрипта предобработки запросов Radius]]<br /> *[[Интеграция Asterisk и BGBilling (Accounting) посредством изменения программного кода Asterisk]]<br /> *[[Интеграция c MVTS]]<br /> *[[Интеграция c Cisco Call Manager Express (CME)]]<br /> *[[Карточная IVR система на базе Cisco]]<br /> *[[Примеры IVR скриптов для Cisco]]<br /> *[[Пример настройки Cisco AS5350]]<br /> *[[Продажа пакетов минут на направления]]<br /> <br /> ==== Плагин Dispatch ====<br /> *[[Импорт старой схемы рассылок баланса в Dispatch]]<br /> <br /> === SQL-запросы ===<br /> *[[Схема связки таблиц тарифов]]<br /> *[[Разные SQL-запросы]]<br /> *[[SQL-запрос: кто сколько платит на каждом тарифе]]<br /> *[[Получение цен тарифов]]<br /> *[[Работа с группами, битовые маски]]<br /> *[[наработка по абонентке и услугам за месяц]]<br /> <br /> ==== CerberCrypt ====<br /> *[[Модуль CerberCrypt: Разные SQL-запросы]]<br /> *[[Модуль CerberCrypt: Поиск битых SQL-связей]]<br /> <br /> === Веб-Интерфейс ===<br /> *[[Свой action в личном кабинете]]<br /> **[[WebAction_CustomSuspend]] - управление статусом договора (v5.0)<br /> *[[Изменение параметров договора из личного кабинета]]<br /> *[[Как убрать ненужные действия в web]]<br /> <br /> === Протоколы ===<br /> *[[Протокол дилерский платежей]]<br /> *[[Протоколы, поддержанные в модуле MPS]]<br /> *[[Протоколы, поддержанные в модуле Phone]]<br /> *[[Медиа: Enaza.zip]]<br /> *[[Медиа: Payonline.zip]]<br /> <br /> === FAQ ===<br /> * [[Не запускается служба под Windows (BGBillingServer, BGCashcheckServer итд)]]<br /> * [[Вопросы вместо русских букв]]<br /> * [[Что происходит с пользователями при рестарте сервера биллинга и BGRadiusDialup]]<br /> * [[Тарификация максимального трафика]]<br /> * [[Field ... doesn't have a default value ]]<br /> * [[Character set ‘cp1251' is not a compiled character set and is not specified in the ‘C:\mysql\\share\charsets\Index.xml’ file ]]<br /> * [[com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown database 'bgbilling' ]]<br /> * [[Договор не отображается в поиске]]<br /> * [[PPPD проблема с сессиями больше 4ГБ]]<br /> * [[Меню личного кабинета]]<br /> * [[Java.lang.NoClassDefFoundError:_javax/xml/bind/DataBindingException|FreeBSD: Java.lang.NoClassDefFoundError: javax/xml/bind/DataBindingException]]<br /> * [[Manad: после некоторого количества договоров начинает передавать данные на биллинг неправильно ]]<br /> * [[Ошибка выполнения скиптов: Undefined argument:]]<br /> * [[Ошибка в логе &quot;Too many open files&quot;]]<br /> * [[Ошибка в логе &quot;java.lang.OutOfMemoryError : unable to create new native Thread&quot;]]<br /> * [[Ошибка в клиенте &quot;Action NOT FOUND!..&quot;]]<br /> * [[Inet FAQ]]<br /> * [[java.lang.NoSuchMethodError]]<br /> * [[Много таблиц npay_add_cost_detail и npay_detail]]<br /> * [[Тормозит клиент BG под Windows]]<br /> * [[Unable to load authentication plugin]]<br /> <br /> == BGCRM ==<br /> <br /> === Настройка вспомогательного ПО ===<br /> * [[Проксирование обращений к BGCRM посредством nginx]]<br /> <br /> === Плагин BGBilling ===<br /> * [[Синхронизация справочников адресов с BGBilling]]<br /> * [[Активация доверительного платежа в привязанном к процессу договоре биллинга]]<br /> * [[Импорт контрагентов из договоров, sql запрос]]<br /> <br /> === Плагин Document ===<br /> * [[Примеры шаблонов для генерации документов]]<br /> * [[Примеры шаблонов для генерации документов (устаревшее)]]<br /> * [[Пустой шаблон]]<br /> <br /> === Плагин Report ===<br /> * [[Примеры отчётов BGCRM]]<br /> <br /> === Комплексные решения ===<br /> *[[Организация отключения должников КТВ]]<br /> *[[Интеграция с Asterisk для обработки входящих звонков]]<br /> <br /> === Интеграция с внешними системами ===<br /> *[[Asterisk - пример обращения от АТС]]<br /> *[[ВКонтакте - пример интеграции]]<br /> <br /> === Примеры динамического кода ===<br /> *[[Проверка уникальности контрагента по ИНН]]<br /> *[[Проверка уникальности контрагента по паспортным данным]]<br /> *[[Переключение статуса процессов по наступлению момента времени]]<br /> *[[Повышение приоритета процессов]]<br /> *[[Проверка правки параметра процесса]]<br /> *[[Изменение описания процесса по правке параметра]]<br /> *[[Обработка событий процесса согласования]]<br /> *[[Генерация новостей исполнителям при изменении процессов]]<br /> *[[Уведомление на email]]<br /> <br /> === Примеры JEXL конфигураций, скриптов обработки событий ===<br /> *[[Простая обработка событий процесса]]<br /> <br /> == DBInfo ==<br /> * [[Описание программы]]<br /> * [[Установка и настройка программы]]<br /> * [[Исходный код программы]]<br /> <br /> == Разработка ПО ==<br /> В данном разделе собираются рекомендации по разработке ПО. Это накопленная годами и пополняемая база знания призвана упростить обучение в первую очередь разработчиков, работающих с применяемыми в BiTel технологиями: Java, Web (JS, HTML), СУБД MySQL, LINUX, GIT. И разрабатывающих схожие приложения: тиражируемые продукты для автоматизации процессов организаций. Всё предельно конкретно, поэтому большая часть примеров будет приведена на Java.<br /> Однако значительная часть описываемых проблем и принципов довольно фундоментальна и может быть полезна разработчиками в иных областях.<br /> <br /> === В общем ===<br /> * [[Разработка]]<br /> * [[Оптимизация]]<br /> * [[Логирование]]<br /> * [[Сборка и публикация проекта]]<br /> <br /> === Java разработка ===<br /> * [[Работа с git в Eclipse(EGit)]]<br /> * [[Выявление неисправностей приложений]]<br /> * [[Обращение к Web-сервису]]<br /> * [[Работа с SQL в Java]]<br /> * [[Встроенный Application сервер в приложении]]<br /> * [[Потоки в Java]]<br /> * [[Обработка ошибок]]<br /> <br /> ==== Полезные Java библиотеки ====<br /> {| border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;<br /> |- valign=top align=&quot;center&quot; bgcolor=&quot;#eeeeee&quot; <br /> | Наименование || Область применения<br /> |-<br /> | [[Jimi - обработка изображений | JIMI]] || Обработка изображений<br /> |}<br /> <br /> === Технологии, используемые в проектах ===<br /> * [[XML]]<br /> * [[XSLT]]<br /> * [[FO(P)]]<br /> * [[REGEXP]]<br /> * [[MySQL REGEXP]]<br /> <br /> === Вспомогательные технологии ===<br /> * [[Сборщик Apache ANT]]<br /> * [[Сбор и анализ сетевого трафика]]<br /> * [[SSH]]<br /> * [[Оптимизация запросов в MySQL]]<br /> <br /> === Требования BiTel к оформлению ===<br /> * [[Java кода]]<br /> * [[MySQL кода]]</div> DimOn http://wiki.bitel.ru/index.php/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80_%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D1%83%D0%BD%D0%BA%D1%82%D0%BE%D0%B2_%D0%B2_%D0%9B%D0%9A_%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82%D1%8F%D1%89%D0%B8%D1%85_%D0%BD%D0%B0_url Пример добавления пунктов в ЛК редиректящих на url 2017-02-20T11:16:10Z <p>DimOn:&#32;</p> <hr /> <div>Реализация дин.веб-экшена, который перекидывает на разные урлы. Для добавления как пункты веб-меню.<br /> Например, для создания ссылок на платёжные системы:<br /> * Оплата Банковской картой - https://c.cloudpayments.ru/xxx/<br /> * Оплата через Сбербанк Онлайн - https://online.sberbank.ru/<br /> <br /> Дин.код такой:<br /> <br /> &lt;source lang=&quot;java&quot;&gt;package ru.xxx;<br /> <br /> import static ru.bitel.bgbilling.common.bean.BGBaseConstants.REQUEST_ATTR_CONTENT_TYPE;<br /> import java.io.IOException;<br /> import bitel.billing.server.ActionResultContentType;<br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.kernel.container.web.action.AbstractAction;<br /> <br /> public class ActionWebMenuRedirect<br /> extends AbstractAction<br /> {<br /> public void cloudpayments()<br /> throws BGException<br /> {<br /> forward(&quot;https://c.cloudpayments.ru/xxx/&quot;);<br /> }<br /> <br /> public void sbol()<br /> throws BGException<br /> {<br /> forward(&quot;https://online.sberbank.ru/&quot;);<br /> }<br /> <br /> private void forward(String url)<br /> throws BGException<br /> {<br /> try<br /> {<br /> context.getRequest().setAttribute( REQUEST_ATTR_CONTENT_TYPE, ActionResultContentType.binary );<br /> context.getResponse().sendRedirect( url );<br /> }<br /> catch( IOException e )<br /> {<br /> throw new BGException( e ); <br /> }<br /> }<br /> }&lt;/source&gt;<br /> <br /> Настройка конфига сервера, для создания нового [дин.]экшена:<br /> <br /> &lt;source lang=&quot;text&quot;&gt;dynaction:ru.xxx.web.ActionWebMenuRedirect=ru.xxx.ActionWebMenuRedirect&lt;/source&gt;<br /> <br /> Для справки: переход срабатывает на такие ссылки итоговые:<br /> <br /> * http://.../bgbilling/webexecuter?action=WebMenuRedirect&amp;mid=0&amp;module=ru.xxx&amp;operation=cloudpayments<br /> * http://.../bgbilling/webexecuter?action=WebMenuRedirect&amp;mid=0&amp;module=ru.xxx&amp;operation=sbol<br /> <br /> В итоге настройки двух пунктов веб-меню:<br /> <br /> 1)<br /> <br /> action: WebMenuRedirect&amp;operation=cloudpayments<br /> <br /> moduleId: 0<br /> <br /> moduleName: ru.xxx<br /> <br /> moduleTitle: ?<br /> <br /> title: Оплата Банковской картой<br /> <br /> 2)<br /> <br /> action: WebMenuRedirect&amp;operation=sbol<br /> <br /> moduleId: 0<br /> <br /> moduleName: ru.xxx<br /> <br /> moduleTitle: ?<br /> <br /> title: Оплата через Сбербанк Онлайн<br /> <br /> Веб-меню добавить так: добавляете любой пункт, потом правите параметры action итд.<br /> Не забывайте, что веб-меню либо надо повесить на нужный договор явно (в договоре в клиенте отдельная вкладка), либо назначить это меню &quot;по умолчанию&quot; (настройка в веб-меню уже), чтобы он везде был и у всех.<br /> <br /> --[[Участник:DimOn|dimOn]] 11:15, 20 февраля 2017 (UTC)</div> DimOn http://wiki.bitel.ru/index.php/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80_%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D1%83%D0%BD%D0%BA%D1%82%D0%BE%D0%B2_%D0%B2_%D0%9B%D0%9A_%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82%D1%8F%D1%89%D0%B8%D1%85_%D0%BD%D0%B0_url Пример добавления пунктов в ЛК редиректящих на url 2017-02-20T11:15:13Z <p>DimOn:&#32;</p> <hr /> <div>Реализация дин.веб-экшена, который перекидывает на разные урлы. Для добавления как пункты веб-меню.<br /> Например, для создания ссылок на платёжные системы:<br /> * Оплата Банковской картой - https://c.cloudpayments.ru/xxx/<br /> * Оплата через Сбербанк Онлайн - https://online.sberbank.ru/<br /> <br /> Дин.код такой:<br /> <br /> &lt;source lang=&quot;java&quot;&gt;package ru.xxx;<br /> <br /> import static ru.bitel.bgbilling.common.bean.BGBaseConstants.REQUEST_ATTR_CONTENT_TYPE;<br /> import java.io.IOException;<br /> import bitel.billing.server.ActionResultContentType;<br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.kernel.container.web.action.AbstractAction;<br /> <br /> public class ActionWebMenuRedirect<br /> extends AbstractAction<br /> {<br /> public void cloudpayments()<br /> throws BGException<br /> {<br /> forward(&quot;https://c.cloudpayments.ru/xxx/&quot;);<br /> }<br /> <br /> public void sbol()<br /> throws BGException<br /> {<br /> forward(&quot;https://online.sberbank.ru/&quot;);<br /> }<br /> <br /> private void forward(String url)<br /> throws BGException<br /> {<br /> try<br /> {<br /> context.getRequest().setAttribute( REQUEST_ATTR_CONTENT_TYPE, ActionResultContentType.binary );<br /> context.getResponse().sendRedirect( url );<br /> }<br /> catch( IOException e )<br /> {<br /> throw new BGException( e ); <br /> }<br /> }<br /> }&lt;/source&gt;<br /> <br /> Настройка конфига сервера, для создания нового [дин.]экшена:<br /> <br /> &lt;source lang=&quot;text&quot;&gt;dynaction:ru.xxx.web.ActionWebMenuRedirect=ru.xxx.ActionWebMenuRedirect&lt;/source&gt;<br /> <br /> Для справки: переход срабатывает на такие ссылки итоговые:<br /> <br /> * http://.../bgbilling/webexecuter?action=WebMenuRedirect&amp;mid=0&amp;module=ru.telenet&amp;operation=cloudpayments<br /> * http://.../bgbilling/webexecuter?action=WebMenuRedirect&amp;mid=0&amp;module=ru.telenet&amp;operation=sbol<br /> <br /> В итоге настройки двух пунктов веб-меню:<br /> <br /> 1)<br /> <br /> action: WebMenuRedirect&amp;operation=cloudpayments<br /> <br /> moduleId: 0<br /> <br /> moduleName: ru.xxx<br /> <br /> moduleTitle: ?<br /> <br /> title: Оплата Банковской картой<br /> <br /> 2)<br /> <br /> action: WebMenuRedirect&amp;operation=sbol<br /> <br /> moduleId: 0<br /> <br /> moduleName: ru.xxx<br /> <br /> moduleTitle: ?<br /> <br /> title: Оплата через Сбербанк Онлайн<br /> <br /> Веб-меню добавить так: добавляете любой пункт, потом правите параметры action итд.<br /> Не забывайте, что веб-меню либо надо повесить на нужный договор явно (в договоре в клиенте отдельная вкладка), либо назначить это меню &quot;по умолчанию&quot; (настройка в веб-меню уже), чтобы он везде был и у всех.<br /> <br /> --[[Участник:DimOn|dimOn]] 11:15, 20 февраля 2017 (UTC)</div> DimOn http://wiki.bitel.ru/index.php/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80_%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D1%83%D0%BD%D0%BA%D1%82%D0%BE%D0%B2_%D0%B2_%D0%9B%D0%9A_%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82%D1%8F%D1%89%D0%B8%D1%85_%D0%BD%D0%B0_url Пример добавления пунктов в ЛК редиректящих на url 2017-02-20T11:14:58Z <p>DimOn:&#32;Новая страница: «Реализация дин.веб-экшена, который перекидывает на разные урлы. Для добавления как пункты …»</p> <hr /> <div>Реализация дин.веб-экшена, который перекидывает на разные урлы. Для добавления как пункты веб-меню.<br /> Например, для создания ссылок на платёжные системы:<br /> * Оплата Банковской картой - https://c.cloudpayments.ru/xxx/<br /> * Оплата через Сбербанк Онлайн - https://online.sberbank.ru/<br /> <br /> Дин.код такой:<br /> <br /> &lt;source lang=&quot;java&quot;&gt;package ru.xxx;<br /> <br /> import static ru.bitel.bgbilling.common.bean.BGBaseConstants.REQUEST_ATTR_CONTENT_TYPE;<br /> import java.io.IOException;<br /> import bitel.billing.server.ActionResultContentType;<br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.kernel.container.web.action.AbstractAction;<br /> <br /> public class ActionWebMenuRedirect<br /> extends AbstractAction<br /> {<br /> public void cloudpayments()<br /> throws BGException<br /> {<br /> forward(&quot;https://c.cloudpayments.ru/xxx/&quot;);<br /> }<br /> <br /> public void sbol()<br /> throws BGException<br /> {<br /> forward(&quot;https://online.sberbank.ru/&quot;);<br /> }<br /> <br /> private void forward(String url)<br /> throws BGException<br /> {<br /> try<br /> {<br /> context.getRequest().setAttribute( REQUEST_ATTR_CONTENT_TYPE, ActionResultContentType.binary );<br /> context.getResponse().sendRedirect( url );<br /> }<br /> catch( IOException e )<br /> {<br /> throw new BGException( e ); <br /> }<br /> }<br /> }&lt;/source&gt;<br /> <br /> Настройка конфига сервера, для создания нового [дин.]экшена:<br /> <br /> &lt;source lang=&quot;text&quot;&gt;dynaction:ru.xxx.web.ActionWebMenuRedirect=ru.xxx.ActionWebMenuRedirect&lt;/source&gt;<br /> <br /> Для справки: переход срабатывает на такие ссылки итоговые:<br /> <br /> * http://.../bgbilling/webexecuter?action=WebMenuRedirect&amp;mid=0&amp;module=ru.telenet&amp;operation=cloudpayments<br /> * http://.../bgbilling/webexecuter?action=WebMenuRedirect&amp;mid=0&amp;module=ru.telenet&amp;operation=sbol<br /> <br /> В итоге настройки двух пунктов веб-меню:<br /> <br /> 1)<br /> <br /> action: WebMenuRedirect&amp;operation=cloudpayments<br /> <br /> moduleId: 0<br /> <br /> moduleName: ru.xxx<br /> <br /> moduleTitle: ?<br /> <br /> title: Оплата Банковской картой<br /> <br /> 2)<br /> <br /> action: WebMenuRedirect&amp;operation=sbol<br /> <br /> moduleId: 0<br /> <br /> moduleName: ru.xxx<br /> <br /> moduleTitle: ?<br /> <br /> title: Оплата через Сбербанк Онлайн<br /> <br /> Веб-меню добавить так: добавляете любой пункт, потом правите параметры action итд.<br /> Не забывайте, что веб-меню либо надо повесить на нужный договор явно (в договоре в клиенте отдельная вкладка), либо назначить это меню &quot;по умолчанию&quot; (настройка в веб-меню уже), чтобы он везде был и у всех.</div> DimOn http://wiki.bitel.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0 Заглавная страница 2017-02-20T11:10:08Z <p>DimOn:&#32;/* Ядро */</p> <hr /> <div>== О BiTel Wiki ==<br /> Здесь вы можете получить больше информации о продуктах BiTel: BGBilling, BGCRM, а также поделиться своим опытом с другими пользователями. В то время как документация часто предоставляет общие сведения о системе и ее настройках, в WiKi приводятся конкретные примеры.<br /> <br /> * &lt;b&gt;[[Как выложить статью на WiKi]]&lt;/b&gt;<br /> * [[Оформление статей]]<br /> * [http://forum.bitel.ru/ Форум BiTel]<br /> <br /> == Специалисты ==<br /> Уважаемые &quot;продвинутые пользователи&quot;. Здесь вы можете располагать записи со своими контактами для оказания воздмездной или безвозмездной помощи по настройке системы BGBilling пользователям, не столь далеко продвинувшимся. Желательно указывать ваши контактные данные и &quot;специализацию&quot;. Отзывы по исполнителям можно оставить/почитать [http://forum.bitel.ru/viewtopic.php?t=9329 на форуме].<br /> {| border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;<br /> |- valign=top align=&quot;center&quot; bgcolor=&quot;#eeeeee&quot; <br /> | Имя || Специализация || Контакт || Примечания<br /> |-<br /> | Олег Алтынников || Установка, настройка, поддержка биллинга, миграция с других|| E-mail: murano@linkray.ru, ICQ: 462851472 || Написание скриптов, интеграция с любым оборудованием (IPTV, Интернет, DPI, Телефония), проекты любой сложности под любые задачи, автоматизация, оптимизация работы, Linux/FreeBSD и многое другое<br /> |-<br /> |-<br /> | Рустам Тазуркаев || Mikrotik, переход с NetUp, CISCO || [[Изображение:Cpec_2_contact.png]] &lt;!-- ICQ: 648986--&gt; ||<br /> |-<br /> | Михаил Чернобаев || Скрипты биллинга, Java-расширения, интеграция с другими системами || Тел. +79619322588 || Автоматизация бизнес-процессов: скриптование в биллинге, расширение BGBS API, разработка инструментов интеграции с другими системами. Переход на BGBilling. Возможны крупные проекты.<br /> |- <br /> | Борис Близнюков || Скрипты биллинга, CISCO, Voip, Mera || [[Изображение:Cpec_4_contact.png]] &lt;!--ICQ: 1996944--&gt; || Только бесплатные краткие консультации. Очень хороший специалист по CISCO.<br /> |-<br /> | Андрей Бехтерев || Cisco, UNIX, ISP, Asterisk || ICQ: 7021464 WEB: http://behterev.su/ || Обширный спектр оборудования. Консалтинг.<br /> |-<br /> | Гершевич М.М. || Доработка конфигурации 1С и прочего ПО. || Тел. +79248454888 +7-(4162)-238-777 WEB: http://www.amurimpulse.ru/ mail: mike1008@mail.ru || Консалтинг. Информационная безопасность. Интеграция биллинга. Крупные проекты. Работа под заказ.<br /> |-<br /> | Андрей Зюзенков || Android, Linux, Eltex, Asterisk, BGBilling || [https://bghelp.ru Сайт], e-mail: info@bghelp.ru || Интеграция, мобильные приложения на Android<br /> |-<br /> | Семён Кошечкин || Java || email/gtalk: [[Файл:Cpec_5_contact.jpg]]|| Скрипты, дополнения, модуль Inet. [[%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:Contributions/Cromeshnic|wiki]]<br /> |-<br /> |-<br /> | Конференция BGBilling || вопросы касаемо системы BGBilling || https://telegram.me/joinchat/A3Nz5QUFAbB_o0HKOdNYRw || Администраторы АСР BGBillig(иногда и разработчики) помогают друг другу в разных вопросах.<br /> |}<br /> <br /> == BGBilling ==<br /> === Установка ===<br /> * [[Установка на gentoo]]<br /> * [[Установка на Sun Solaris]]<br /> * [[Установка на Slackware]]<br /> * [[Установка на FreeBSD]]<br /> * [[Установка на Ubuntu 8 Desktop]]<br /> * [[Установка на Ubuntu 9.10 Desktop]]<br /> <br /> <br /> ==== Перенос данных в биллинг ====<br /> *[[Пример конвертера данных из csv-файлов в базу BGBilling]]<br /> *[[Пример конвертера данных из CSV-файлов в базу BGBilling - 2]]<br /> *[[Пример конвертера данных из CSV-файлов в базу BGBilling - 3]]<br /> *[[Конвертер базы Netup]]<br /> *[[Примеры конвертеров данных из других биллинговых систем]]<br /> <br /> === Администрирование ===<br /> * [[Разграничение прав действий]]<br /> * [[Настройка безопасности сервера биллинга и компонентов биллинга]]<br /> * [[Принудительный останов процессов биллинга]]<br /> * [[Использование подписанного SSL сертификата]]<br /> * [[Запуск scheduler и data_loader с другими портами управления]]<br /> * [[bg-snmp-management|Мониторинг java-процессов по snmp]]<br /> * [[Пример юнита для systemd]]<br /> * [[Скрипты автостарта демонов bgbilling для Debian]]<br /> * [[javaws|Запуск BGBillingClient через Java Web Start]]<br /> * [[Мониторинг Inet-Radius через JMX]]<br /> * [[Интеграция существующего сертификата и приватного ключа SSL в хранилище keystore]]<br /> <br /> === Настройка вспомогательного ПО ===<br /> *[[Проксирование обращений к BGBillingServer посредством nginx]]<br /> <br /> ==== WildFly личный кабинет ====<br /> *[[Включение https]]<br /> <br /> ==== MySQL ====<br /> *[[Рекомендации по настройке MySQL]]<br /> *[[database backup|Backup MySQL базы с помощью snapshot'ов (Linux, LVM)]]<br /> *[[Настройка MySQL репликации]]<br /> *[[Установка триггера в MySQL для отслеживания изменений]]<br /> *[[Скрипт восстановления MySQL репликации]]<br /> *[[Simple DB backup]]<br /> *[[Galera]]<br /> <br /> ==== NetFlow ====<br /> *[[Настройка NetFlow-агента IPCAD]]<br /> *[[Разделение NetFlow-потоков]]<br /> <br /> === Технологии ===<br /> *[[BGBilling_XSLT|XSLT]]<br /> <br /> === Разработка ===<br /> *[[Отладка action'ов в IntelliJ IDEA]]<br /> *[[Разработка динамического кода в IDE Eclipse]]<br /> <br /> === [[XSLT]] шаблоны ===<br /> *[[Добавление параметров договора на страницу личного кабинета]]<br /> &lt;!-- *[[Красивые графики статистики в модуле IPN]] --&gt;<br /> *[[Карточки договора]]<br /> *[[Создание XSLT/FO шаблона со штрихкодами]]<br /> *[[Подстановка данных в зависимости от текущего пользователя биллинга]]<br /> *[[Генерация прайса модуля IP телефонии в карточке договора]]<br /> <br /> ==== Счета ====<br /> *[[Печать счета-фактуры и акта на отдельных листах]]<br /> *[[Расширенные счета модуля бухгалтерии]]<br /> *[[Квитанция телефонии физ. лицам]]<br /> *[[Шаблоны вывода названия месяца]]<br /> *[[Изменения в шаблоне в зависимости от месяца документа]]<br /> *[[Добавление новых шрифтов в FO шаблоны]]<br /> <br /> === Интеграция с внешними системами ===<br /> * [[Прямая интеграция с платежными терминалами ЭСФОР / SFOUR]]<br /> * [[Интеграция с платежной системой с использованием модуля Card]]<br /> * [[Интеграция с платежной системой Robokassa]]<br /> * [[SMS рассылка через SMPP]]<br /> * [[SMS рассылка через SMPP по средствам дин кода в 5.2]]<br /> * [[Система учета &quot;Заявки и Наряды&quot; на java]]<br /> * [[Bash скрипт-отсылка смс через телефон при отсутствие ping на заданный узел]]<br /> * [[Запросы в личный кабинет пользователя сторонними системами]]<br /> * [[Запросы к серверу биллинга сторонними системами]]<br /> <br /> ==== 1С ====<br /> * [[BGBilling-1C]]<br /> * [[amurimpulse.ru bgbilling]]<br /> * [[Integrator 1C-BGBilling]]<br /> * [[Пример обращения к биллингу из 1С v.7.7]]<br /> * [[Пример интеграции с 1С v.7.7]]<br /> * [[Пример интеграции с 1С v.8.1]]<br /> * [[Пример интеграции с 1С через custom API]]<br /> * [[Установка unload_status счета через HTTP-запрос]]<br /> ==== Android ====<br /> *[[Разработка мобильных приложений на Android]]<br /> <br /> === Динамический код (скрипты BGBS для старых версий) ===<br /> *[[Логгирование в скриптах поведения]]<br /> <br /> ==== Динамический код ====<br /> *[[Конвертирование адреса]]<br /> *[[Глобальная синхронзация услуг модуля npay с тарифным планом]]<br /> *[[Новый номер договора группе договоров]]<br /> *[[Скрипт проверки таймзон (timezone, tz, tzdata) в java]]<br /> <br /> ==== Комплексные решения ====<br /> *[[Предоставление тестового периода пользования услугой]]<br /> *[[Организация системы отслеживания и отключения КТВ должников на BGBS с использованием CRM плагина]]<br /> *[[Автоматизация подключений VPN-клиентов с использованием CRM плагина]]<br /> *[[Пример автоматизации подключения новых клиентов]]<br /> <br /> ==== Глобальные скрипты ====<br /> *[[Скрипт глобальный отмены перехода на тарифы при неоплате]]<br /> *[[Скрипт предоставление скидки пенсионерам]]<br /> *[[Скрипт создания субдоговоров по шаблону]]<br /> *[[Глобальное событие запуска сервера]]<br /> *[[Перемещение в группу через 3 месяца если не было движения денег в наработке]]<br /> *[[Поиск и изменение статусов у договоров]]<br /> *[[Получение списка доступных действий в SQL]]<br /> *[[Глобальный скрипт для удаления старых таблиц]]<br /> <br /> ==== Пользовательские библиотеки скриптов ====<br /> *[[Пересчеты и бонусы]]<br /> *[[Архивирование логов netflow и radius accaunting]]<br /> <br /> ==== Ядро ====<br /> *[[Смена тарифного плана по заданию пользователя]]<br /> *[[Валидация текстового параметра]]<br /> *[[Проверка ИНН/КПП при вводе]]<br /> *[[Проверка параметра договора перед изменением]]<br /> *[[Обработка смены параметра договора]]<br /> *[[Создание списка дополнительных действий для договора]]<br /> *[[Обработка события создания договора]]<br /> *[[Обработка события &quot;добавление услуги RSCM в договор&quot; . Скипт сменяет тариф, подключает абонплату ]]<br /> *[[Приостановление договора клиентом через WEB]]<br /> *[[Скрипт проверки баланса и отключения договора]]<br /> *[[Изменение стандартной логики перетирания статусов]]<br /> *[[Пример продажи OEM ключей с помощью скрипта]]<br /> *[[Пример копирования тарифного плана]]<br /> *[[Получение текущего пользователя биллинга]]<br /> *[[Запуск скрипта до и после акшена]]<br /> *[[Примеры скриптов до и после акшена]]<br /> *[[Примеры динамического кода акшена и веб-сервисов]]<br /> *[[Начисление бонусов на счет при платежах определенного типа]]<br /> *[[Включение должников по приходу платежа]]<br /> *[[Снижение лимита при внесении расхода]]<br /> *[[Изменение суммы лимита определенной группе договоров]]<br /> *[[Синхронизация услуг договора в соответствии с тарифными планами]]<br /> *[[Добавление группы и снятие в зависимости от статуса]]<br /> *[[Управление статусом договора по состоянию баланса]]<br /> *[[Запрет на вход в личный кабинет с закрытых договоров]]<br /> *[[Переход на понижающий тариф только со следующего месяца]]<br /> *[[Пример создания своего интерфейса в клиенте]]<br /> *[[Метки услуг]]<br /> *[[Сравнение прав пользователей]]<br /> *[[Свой список шаблонов договоров]]<br /> *[[Модификация приходящего платежа (снятие процента)]]<br /> *[[Подкрашивание договоров в поиске]]<br /> *[[Пример добавления пунктов в ЛК редиректящих на url]]<br /> <br /> ==== Модуль Bill ====<br /> *[[Создание счета в модуле Bill]]<br /> *[[Создание счета из суммы платежей по классу договоров]]<br /> *[[Создание счета по таблице позиций]]<br /> *[[Создание счета и счет-фактур в модуле Bill(выполнение тех же действий что и руками)]]<br /> *[[Создание счетов на предоплату]]<br /> *[[Распечатка счетов в pdf по событию генерации счета]]<br /> *[[Внешняя программа на JAVA для синхронизации номеров счетов и актов выполненных работ (версия BGBilling 5.0)]]<br /> *[[Автоматическая отправка счетов через глобальный скрипт поведения]]<br /> <br /> ==== Модуль DialUp ====<br /> *[[Запуск переначисления в модуле DialUp]]<br /> *[[Передача ACCEPT вместо REJECT вместе с доп. аттрибутами]]<br /> *[[Обработка запроса учетного периода]]<br /> *[[Переинициализация тарифа в пределах сессии | Обработка запроса учетного периода (переинициализация тарифа в пределах сессии) ]]<br /> *[[Ограничение доступа для различных групп пользователей для BGRadiusDialup]]<br /> *[[Детальное информирование абонентов о причинах ошибки 691]]<br /> *[[Аутентификация с учетом Calling-Id-Station]]<br /> *[[Доп. действие сброса активных соединений]]<br /> *[[Открытие абонплаты по первой установке соединения]]<br /> *[[Пересчет трафика по данным Radius (при потерянных Netflow-логах)]]<br /> *[[Отключение Fake сессий при приходе платежа]]<br /> *[[Ограничение доступа на основе объектов]]<br /> <br /> ==== Модуль DialUp / Cкрипты предобработки RADIUS запросов ====<br /> * [[Уcтановка услуги типа &quot;Время&quot; для BGRadiusDialup]]<br /> * [[Установка фиксированного пароля]]<br /> * [[Нормализация параметра Acct-Session-Id у маршрутизатора Cisco]]<br /> * [[Разделение атрибута User-Name на логин и пароль]]<br /> * [[Вынос MAC адреса из cisco-avp-pair в Calling-Station-Id]]<br /> * [[Копирование Тunnel-Client-Endpoint/Tunnel-Server-Endpoint в Calling-Station-Id/Called-Station-Id]]<br /> * [[Замена radius-атрибутов при авторизации]]<br /> <br /> ==== Модуль Inet / Cкрипты предобработки RADIUS запросов ====<br /> * [[Вынос MAC адреса из cisco-avp-pair в Calling-Station-Id для модуля Inet]]<br /> <br /> ==== Модуль СerberСrypt ====<br /> *[[Изменение подписки карты через web (cerbercrypt)]]<br /> *[[Управление подписками через веб (cerbercrypt)]]<br /> *[[Дин.код для синхронизации pairing с внешнего cas]]<br /> *[[Скрипт активации/деактивации карты при добавлении/удалении]]<br /> <br /> ==== Модуль NPay ====<br /> *[[Определение размера абонентской платы]]<br /> *[[Запуск переначисления в модуле NPay]]<br /> *[[Дебетовые абонплаты. Снятие штрафа за разблокировку.]]<br /> *[[Снятие абонентской платы в дебитовых договорах]]<br /> *[[Предварительное уведомление о блокировке по дебетовым абонплатам]]<br /> *[[ Начисление абонплат по схеме 15-15 ]]<br /> <br /> ==== Модуль Phone ====<br /> *[[При создании поинта модуля Phone добавление в него абонплат]]<br /> *[[Закрытие_телефонных_договоров]]<br /> <br /> ==== Модуль RSCM ====<br /> *[[Запуск переначисления в модуле RSCM]]<br /> *[[Перенос суммы расхода в наработку RSCM модуля]]<br /> <br /> ==== Модуль VoiceIp ====<br /> *[[Определение стоимости звонка VoiceIp]]<br /> <br /> ==== Модуль VoiceIp / Cкрипты предобработки RADIUS запросов ====<br /> * [[Идентификация Voip оператора по подсети (транзит)]]<br /> * [[Установка параметров звонка Voip]]<br /> * [[Установка фиксированного пароля]]<br /> * [[Разделение атрибута User-Name на логин и пароль]]<br /> * [[Замена radius-атрибутов при авторизации]]<br /> <br /> ==== Плагин CRM ====<br /> *[[Обработка выполненных задач в журнале задач]]<br /> *[[Обработка задач по событию ядра &quot;Поступление платежа&quot;, создание новой задачи и изменение существующей]]<br /> *[[Пример получения информации о задаче]]<br /> *[[Уведомления монтажников о новых активных задачах путем отправки SMS XML запросом]]<br /> <br /> ==== Плагин CashCheck ====<br /> *[[Чек: добавление позиции]]<br /> *[[Чек: завершение формирования]]<br /> *[[Примеры скриптов CashCheck]]<br /> <br /> ==== Плагин Documents ====<br /> *[[Создание копий документа на договорах]]<br /> <br /> ==== Модуль Inet ====<br /> *[[Скрипт активации учетного периода]]<br /> *[[Скрипт закрытия соединений]]<br /> <br /> === Решения для модулей и плагинов ===<br /> <br /> ==== Модуль DialUP ====<br /> *[[Настройка Lucent Ascend MAX6000 в качестве DialUP сервера]]<br /> *[[Настройка Dial-IN сервера FreeBSD PPPD]]<br /> *[[Настройка VPN сервера LINUX PPPD + POPTOP]]<br /> *[[Настройка шейпера в LINUX PPPD]]<br /> *[[Настройка VPN сервера FreeBSD MPD]]<br /> *[[Настройка PPPoE сервера на Cisco-роутере]]<br /> *[[Настройка PPPoE и/или РРТР (VPN) на Mikrotik]]<br /> *[[Проблема с прохождением update пакетов и сброса сессий в Debian и Ubuntu дистрибутивах]]<br /> *[[Настройка Dial-IN Windows RRAS сервера]]<br /> *[[VPN доступ с повременной тарификацией на базе FreeBSD MPD]]<br /> *[[Организация семейства UNLIMIT тарифов на базе FreeBSD MPD]]<br /> *[[Примеры тарифных планов VPN/DialUp]]<br /> *[[Отключение сессий по PoD на CISCO]]<br /> *[[Пример скрипта управления уровнями BGRadiusDialup]]<br /> *[[Настройка cisco с поддеркой ISG]]<br /> *[[Настройка BGBilling c поддеркой ISG]]<br /> *[[Настройка BGBilling с RedBack SmartEdge (PPPOE)]]<br /> <br /> ==== Модуль E-Mail ====<br /> *[[Почтовая система Exim + Cyrus + OpenLDAP на FreeBSD]]<br /> *[[Postfix/MySQL/BGBilling]]<br /> *[[Postfix+dovecot+ldap]]<br /> *[[Postfix+Mysql+Virtual domains]]<br /> <br /> ==== Модуль Inet ====<br /> *[[Inet FAQ]]<br /> *[[Схемы подключения]]<br /> *[[Расширения]]<br /> *[[Конвертеры из IPN в INET]]<br /> *[[Конвертер: логины Dialup в сервисы inet]]<br /> *[[WiFi-портал с активацией по sms ]]<br /> <br /> ==== Модуль IPN ====<br /> *[[IP/VPN]]<br /> *[[Примеры тарифных планов IPN]]<br /> *[[Настройка BGIPNNetflowCollector]]<br /> *[[Методика определения причины отсутствия трафика в отчете договора]]<br /> *[[Связка с flow-tools]]<br /> *[[Экспорт Netflow-данных в формат Nfdump]]<br /> *[[Реалиазация шлюза на Cisco]]<br /> *[[Реализация шлюзов на BeanShell,примеры стандартных и других шлюзов]] (Manad, Cisco, Zyxel, Mikrotik)<br /> *[[Изменения в manad для работы с одним pipe на множество IP адресов]]<br /> *[[FreeBSD manad, понимающий изменения правил в тарифах]]<br /> *[[Табличный FreeBSD manad, понимающий изменения правил в тарифах]]<br /> *[[Пример реализации скриптового универсального шлюза]]<br /> *[[Конвертер привязок услуг dialup в привязки ipn]]<br /> *[[Реализация скрипта Manad]]<br /> *[[Настройка шлюза Mikrotik]]<br /> *[[Обновление номеров интерфейсов при замене роутера]]<br /> <br /> ==== Модуль Phone ====<br /> * [[Конвертация и загрузка тарифов Телефонии в биллинг]]<br /> * [[Примеры тарифных планов Телефонии]]<br /> * [[Примеры реализации конверторов логов]]<br /> * [[Генератор отчётности для Совинтел]]<br /> <br /> ==== Модуль Reports ====<br /> *[[Редактирование отчетов в iReport]]<br /> *[[Примеры отчётов]]<br /> *[[Использование отчётов для организации универсального поиска]]<br /> *[[Табличные отчёты с динамическими столбцами]]<br /> *[[Табличные отчёты в динамическом коде]]<br /> *[[Сохранение JasperReports-отчёта на сервере в pdf]]<br /> <br /> ==== Модуль TV ====<br /> *[[Активация/добавление модуля на договор через дополнительное действие]]<br /> <br /> ==== Модуль VoiceIP ====<br /> *[[Интеграция Asterisk и BGBilling (Accounting) посредством скрипта предобработки запросов Radius]]<br /> *[[Интеграция Asterisk и BGBilling (Accounting) посредством изменения программного кода Asterisk]]<br /> *[[Интеграция c MVTS]]<br /> *[[Интеграция c Cisco Call Manager Express (CME)]]<br /> *[[Карточная IVR система на базе Cisco]]<br /> *[[Примеры IVR скриптов для Cisco]]<br /> *[[Пример настройки Cisco AS5350]]<br /> *[[Продажа пакетов минут на направления]]<br /> <br /> ==== Плагин Dispatch ====<br /> *[[Импорт старой схемы рассылок баланса в Dispatch]]<br /> <br /> === SQL-запросы ===<br /> *[[Схема связки таблиц тарифов]]<br /> *[[Разные SQL-запросы]]<br /> *[[SQL-запрос: кто сколько платит на каждом тарифе]]<br /> *[[Получение цен тарифов]]<br /> *[[Работа с группами, битовые маски]]<br /> *[[наработка по абонентке и услугам за месяц]]<br /> <br /> ==== CerberCrypt ====<br /> *[[Модуль CerberCrypt: Разные SQL-запросы]]<br /> *[[Модуль CerberCrypt: Поиск битых SQL-связей]]<br /> <br /> === Веб-Интерфейс ===<br /> *[[Свой action в личном кабинете]]<br /> **[[WebAction_CustomSuspend]] - управление статусом договора (v5.0)<br /> *[[Изменение параметров договора из личного кабинета]]<br /> *[[Как убрать ненужные действия в web]]<br /> <br /> === Протоколы ===<br /> *[[Протокол дилерский платежей]]<br /> *[[Протоколы, поддержанные в модуле MPS]]<br /> *[[Протоколы, поддержанные в модуле Phone]]<br /> *[[Медиа: Enaza.zip]]<br /> *[[Медиа: Payonline.zip]]<br /> <br /> === FAQ ===<br /> * [[Не запускается служба под Windows (BGBillingServer, BGCashcheckServer итд)]]<br /> * [[Вопросы вместо русских букв]]<br /> * [[Что происходит с пользователями при рестарте сервера биллинга и BGRadiusDialup]]<br /> * [[Тарификация максимального трафика]]<br /> * [[Field ... doesn't have a default value ]]<br /> * [[Character set ‘cp1251' is not a compiled character set and is not specified in the ‘C:\mysql\\share\charsets\Index.xml’ file ]]<br /> * [[com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown database 'bgbilling' ]]<br /> * [[Договор не отображается в поиске]]<br /> * [[PPPD проблема с сессиями больше 4ГБ]]<br /> * [[Меню личного кабинета]]<br /> * [[Java.lang.NoClassDefFoundError:_javax/xml/bind/DataBindingException|FreeBSD: Java.lang.NoClassDefFoundError: javax/xml/bind/DataBindingException]]<br /> * [[Manad: после некоторого количества договоров начинает передавать данные на биллинг неправильно ]]<br /> * [[Ошибка выполнения скиптов: Undefined argument:]]<br /> * [[Ошибка в логе &quot;Too many open files&quot;]]<br /> * [[Ошибка в логе &quot;java.lang.OutOfMemoryError : unable to create new native Thread&quot;]]<br /> * [[Ошибка в клиенте &quot;Action NOT FOUND!..&quot;]]<br /> * [[Inet FAQ]]<br /> * [[java.lang.NoSuchMethodError]]<br /> * [[Много таблиц npay_add_cost_detail и npay_detail]]<br /> * [[Тормозит клиент BG под Windows]]<br /> * [[Unable to load authentication plugin]]<br /> <br /> == BGCRM ==<br /> <br /> === Настройка вспомогательного ПО ===<br /> * [[Проксирование обращений к BGCRM посредством nginx]]<br /> <br /> === Плагин BGBilling ===<br /> * [[Синхронизация справочников адресов с BGBilling]]<br /> * [[Активация доверительного платежа в привязанном к процессу договоре биллинга]]<br /> * [[Импорт контрагентов из договоров, sql запрос]]<br /> <br /> === Плагин Document ===<br /> * [[Примеры шаблонов для генерации документов]]<br /> * [[Примеры шаблонов для генерации документов (устаревшее)]]<br /> * [[Пустой шаблон]]<br /> <br /> === Плагин Report ===<br /> * [[Примеры отчётов BGCRM]]<br /> <br /> === Комплексные решения ===<br /> *[[Организация отключения должников КТВ]]<br /> *[[Интеграция с Asterisk для обработки входящих звонков]]<br /> <br /> === Интеграция с внешними системами ===<br /> *[[Asterisk - пример обращения от АТС]]<br /> *[[ВКонтакте - пример интеграции]]<br /> <br /> === Примеры динамического кода ===<br /> *[[Проверка уникальности контрагента по ИНН]]<br /> *[[Проверка уникальности контрагента по паспортным данным]]<br /> *[[Переключение статуса процессов по наступлению момента времени]]<br /> *[[Повышение приоритета процессов]]<br /> *[[Проверка правки параметра процесса]]<br /> *[[Изменение описания процесса по правке параметра]]<br /> *[[Обработка событий процесса согласования]]<br /> *[[Генерация новостей исполнителям при изменении процессов]]<br /> *[[Уведомление на email]]<br /> <br /> === Примеры JEXL конфигураций, скриптов обработки событий ===<br /> *[[Простая обработка событий процесса]]<br /> <br /> == DBInfo ==<br /> * [[Описание программы]]<br /> * [[Установка и настройка программы]]<br /> * [[Исходный код программы]]<br /> <br /> == Разработка ПО ==<br /> В данном разделе собираются рекомендации по разработке ПО. Это накопленная годами и пополняемая база знания призвана упростить обучение в первую очередь разработчиков, работающих с применяемыми в BiTel технологиями: Java, Web (JS, HTML), СУБД MySQL, LINUX, GIT. И разрабатывающих схожие приложения: тиражируемые продукты для автоматизации процессов организаций. Всё предельно конкретно, поэтому большая часть примеров будет приведена на Java.<br /> Однако значительная часть описываемых проблем и принципов довольно фундоментальна и может быть полезна разработчиками в иных областях.<br /> <br /> === В общем ===<br /> * [[Разработка]]<br /> * [[Оптимизация]]<br /> * [[Логирование]]<br /> * [[Сборка и публикация проекта]]<br /> <br /> === Java разработка ===<br /> * [[Работа с git в Eclipse(EGit)]]<br /> * [[Выявление неисправностей приложений]]<br /> * [[Обращение к Web-сервису]]<br /> * [[Работа с SQL в Java]]<br /> * [[Встроенный Application сервер в приложении]]<br /> * [[Потоки в Java]]<br /> * [[Обработка ошибок]]<br /> <br /> ==== Полезные Java библиотеки ====<br /> {| border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;<br /> |- valign=top align=&quot;center&quot; bgcolor=&quot;#eeeeee&quot; <br /> | Наименование || Область применения<br /> |-<br /> | [[Jimi - обработка изображений | JIMI]] || Обработка изображений<br /> |}<br /> <br /> === Технологии, используемые в проектах ===<br /> * [[XML]]<br /> * [[XSLT]]<br /> * [[FO(P)]]<br /> * [[REGEXP]]<br /> * [[MySQL REGEXP]]<br /> <br /> === Вспомогательные технологии ===<br /> * [[Сборщик Apache ANT]]<br /> * [[Сбор и анализ сетевого трафика]]<br /> * [[SSH]]<br /> * [[Оптимизация запросов в MySQL]]<br /> <br /> === Требования BiTel к оформлению ===<br /> * [[Java кода]]<br /> * [[MySQL кода]]</div> DimOn http://wiki.bitel.ru/index.php/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%B0%D0%BA%D1%88%D0%B5%D0%BD%D0%B0_%D0%B8_%D0%B2%D0%B5%D0%B1-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%BE%D0%B2 Примеры динамического кода акшена и веб-сервисов 2016-05-16T07:32:42Z <p>DimOn:&#32;/* Динамические веб-сервисы */</p> <hr /> <div>Динамическим кодом в данном случае можно как писать новые экшены (практическое значение имеют больше веб-экшены, т.е. экшены веб-интерфейса) и веб-сервисы, так и обёртывать существующие, т.е. заменять их, а внутри вызывать родительский метод, или не вызывать в зависимости от обстоятельств. Этим можно полностью заменить функционал такой, как [[запуск скрипта до и после акшена]]. Помимо того, что область применения шире, ещё динамичемским кодом просто быстрее, удобнее и надёжнее. В данном разделе рассмотрим примеры скриптов, совершенно аналогичные упомянутым в разделе «[[примеры скриптов до и после акшена]]», за исключением задачи &quot;проверка смены статуса&quot;, которую в старом механизме реализовать вообще невозможно, т.к. смена статуса реализована только в веб-сервисах и событий там никаких нету.<br /> <br /> == Динамические экшены ==<br /> <br /> В случае старых экшенов в конфигурацию сервера прописываются динамические классы, и то, что они заменяют. Динамический класс позволяет получить, чтобы потом заменить (обернуть) вызов метода родного класса.<br /> Параметр в конфиге примерно такой:<br /> &lt;source lang=&quot;text&quot;&gt;dynaction:&lt;модуль&gt;.&lt;режим.&gt;&lt;экшенкласснаме&gt;=дин.класс&lt;/source&gt;<br /> Примеры:<br /> &lt;source lang=&quot;text&quot;&gt;dynaction:contract.ActionCheckContractLimitUpdate=дин.класс<br /> dynaction:ru.bitel.bgbilling.plugins.crm.ActionUpdateRegisterTask=дин.класс<br /> dynaction:contract.web.ActionAdditionalAction=дин.класс&lt;/source&gt;<br /> '''Обратите внимание: там указывается НЕ package класса, а строка по указанной схеме.''' Класс может быть простой кастомный, унаследованный от самого корневого класса, но удобнее наследовать от самого перегружаемого класса, если потенциально нужна хоть какая-то логика из него. Внутри дин.класса при необходимости надо сделать явным образом вызов родительского метода (super.doAction, например). Если нужно только вывести ошибку, например, то унаследованный метод не нужно вызывать, очевидно. При поиске реализации соответствующего экшена сначала ищутся динамические классы прописанные. Дальше ничего не проверяется, что нашлось то и вернулось, т.е. если прописан dynaction, но косячный, то дальше не ищется, незачем.<br /> <br /> Для нашего примера прописать нужно следующее:<br /> &lt;source lang=&quot;text&quot;&gt;dynaction:contract.ActionUpdateContractLimit=ru.xxx.ActionUpdateContractLimit<br /> dynaction:ru.bitel.bgbilling.plugins.crm.ActionUpdateRegisterTask=ru.xxx.ActionUpdateRegisterTask&lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.sql.SQLException;<br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> import ru.bitel.common.Utils;<br /> <br /> /**<br /> * Перегруженный экшен для проверки некоторых параметров:<br /> * 2. Скрипт реализующий запрет изменения &quot;лимита&quot; договора в случае если поле комментарий пустое.<br /> * <br /> * В конфиг сервера прописывается:<br /> * dynaction:contract.ActionUpdateContractLimit=ru.xxx.ActionUpdateContractLimit<br /> * @author dimon<br /> */<br /> public class ActionUpdateContractLimit<br /> extends bitel.billing.server.contract.action.ActionUpdateContractLimit<br /> {<br /> @Override<br /> public void doAction() <br /> throws SQLException, BGException<br /> {<br /> //[2]<br /> //module=contract<br /> //action=UpdateContractLimit<br /> //comment=%ED%E5%E3%E5%ED<br /> // получаем параметры как в экшене<br /> String comment = getParameter( &quot;comment&quot;, &quot;&quot; );<br /> // если 1) комментарий пустой =&gt; ругаемся<br /> if( Utils.isBlankString( comment ) )<br /> {<br /> throw new BGMessageException( &quot;Введите комментарий&quot; );<br /> }<br /> // иначе вызываем родительский метод<br /> super.doAction();<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.sql.SQLException;<br /> import java.util.Date;<br /> <br /> import bitel.billing.common.TimeUtils;<br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> import ru.bitel.bgbilling.plugins.crm.common.model.RegisterTask;<br /> import ru.bitel.bgbilling.plugins.crm.server.dao.RegisterTaskManager;<br /> import ru.bitel.common.Utils;<br /> <br /> /**<br /> * Перегруженный экшен для проверки некоторых параметров:<br /> * 1. Скрипт реализующий запрет изменения &quot;срока&quot; задачи в плагине CRM всем кроме того кто задачу создал, а так же кроме отдельно обозначенного администратора.<br /> * 4. CRM: Нужно сделать так чтобы задачу нельзя было закрыть если поле &quot;Резолюция&quot; пустое.<br /> * <br /> * В конфиг сервера прописывается:<br /> * dynaction:ru.bitel.bgbilling.plugins.crm.ActionUpdateRegisterTask=ru.xxx.ActionUpdateRegisterTask<br /> * @author dimon<br /> */<br /> public class ActionUpdateRegisterTask<br /> extends ru.bitel.bgbilling.plugins.crm.server.action.ActionUpdateRegisterTask<br /> {<br /> /** ид отдельно обозначенного администратора */<br /> private final int ADMIN_USER = 1;<br /> <br /> @Override<br /> public void doAction() <br /> throws SQLException, BGException<br /> {<br /> // [1]<br /> // module=ru.bitel.bgbilling.plugins.crm<br /> // action=UpdateRegisterTask<br /> // id=32<br /> // target_date_and_time=21.04.2010+00%3A00<br /> // получаем параметры как в экшене<br /> int id = getIntParameter( &quot;id&quot;, -1 );<br /> Date targetDate = getDateParameter( &quot;target_date_and_time&quot;, &quot;dd.MM.yyyy HH:mm&quot;, null );<br /> if( targetDate == null )<br /> {<br /> targetDate = getDateParameter( &quot;target_date&quot;, &quot;dd.MM.yyyy&quot;, null );<br /> }<br /> // получаем таск<br /> RegisterTaskManager manager = new RegisterTaskManager( con );<br /> RegisterTask task = manager.getTaskById( id );<br /> // если 1) юзер не админ, и 2) юзер не тот кто создал задачу, то 3) проверяем время и если оно не такое =&gt; ругаемся<br /> if( userID != ADMIN_USER &amp;&amp; userID != task.getCreateUserId() &amp;&amp; !TimeUtils.dateEqual( targetDate, task.getTargetDate() ) )<br /> {<br /> throw new BGMessageException( &quot;Вам нельзя менять срок задачи&quot; );<br /> }<br /> // [4]<br /> // module=ru.bitel.bgbilling.plugins.crm<br /> // action=UpdateRegisterTask<br /> // status=2<br /> // resolution=%F0%E5%E7%EE%EB%FE%F6%E8%FF<br /> // получаем параметры как в экшене<br /> int status = getIntParameter( &quot;status&quot;, 0 );<br /> String resolution = getParameter( &quot;resolution&quot;, &quot;&quot; );<br /> //System.out.println(&quot;status=&quot;+status);<br /> //System.out.println(&quot;resolution=&quot;+resolution);<br /> // если 1) статус &quot;закрыто&quot; и 2) резолюция пустая =&gt; ругаемся<br /> if( status == 2 &amp;&amp; Utils.isBlankString( resolution ) )<br /> {<br /> throw new BGMessageException( &quot;Для закрытия заполните резолюцию&quot; );<br /> }<br /> // иначе вызываем родительский метод<br /> super.doAction();<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> ----<br /> <br /> В данном примере пользователям запрещено добавлять новый тарифный план датой ранее следующей за текущей, а так же запрещено закрывать тарифные планы датой ранее текущей.<br /> На пользователей входящих в группу администраторов ADMIN_GROUP = 1 данные ограничения не распространяются.<br /> Если на договоре нет никаких тарифных планов - разрешено указывать любые даты (т.е. если добавляемый тариф будет единственным - можно выставлять произвольные интервалы. Так было необходимо)<br /> <br /> &lt;source lang=&quot;text&quot;&gt;dynaction:contract.ActionUpdateContractTariffPlan=ru.xxx.updateContractTariffPlan&lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.sql.ResultSet;<br /> import java.sql.SQLException;<br /> import java.util.Calendar;<br /> import java.util.Date;<br /> import java.util.List;<br /> <br /> import bitel.billing.common.TimeUtils;<br /> import bitel.billing.server.admin.bgsecure.bean.UserGroupManager;<br /> <br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> <br /> <br /> public class updateContractTariffPlan <br /> extends bitel.billing.server.contract.action.ActionUpdateContractTariffPlan<br /> {<br /> //ID группы администраторов<br /> private final int ADMIN_GROUP = 1;<br /> <br /> @Override<br /> public void doAction() <br /> throws SQLException, BGException<br /> {<br /> UserGroupManager userGroupManager = new UserGroupManager(con);<br /> List&lt;Integer&gt; groups = userGroupManager.getUserGroups(userID);<br /> Calendar calendar = Calendar.getInstance();<br /> Date today = calendar.getTime();<br /> calendar.add(Calendar.DAY_OF_YEAR, 1);<br /> Date tomorrow = calendar.getTime();<br /> String id = getParameter(&quot;id&quot;, &quot;&quot;);<br /> Date date2 = TimeUtils.convertStringToDate(getParameter( &quot;date2&quot;, &quot;&quot; ));<br /> Date date1 = TimeUtils.convertStringToDate(getParameter( &quot;date1&quot;, &quot;&quot; ));<br /> <br /> if(!groups.contains(ADMIN_GROUP))<br /> {<br /> if(!id.equals(&quot;new&quot;) &amp; TimeUtils.dateBefore(date2, today))<br /> {<br /> throw new BGMessageException( &quot;Дата закрытия тарифного плана не может быть ранее текущей&quot; );<br /> }<br /> if(id.equals(&quot;new&quot;) &amp; TimeUtils.dateBefore(date1, tomorrow))<br /> {<br /> String query = &quot; SELECT COUNT(id) FROM contract_tariff WHERE cid=? &quot;;<br /> java.sql.PreparedStatement ps = con.prepareStatement( query );<br /> ps.setInt(1, cid);<br /> ResultSet rs = ps.executeQuery();<br /> while ( rs.next() )<br /> {<br /> int count = rs.getInt(1);<br /> if(count &gt; 0 )<br /> {<br /> throw new BGMessageException( &quot;Тарифный план должен устанавливаться датой следующей за текущей&quot; );<br /> }<br /> }<br /> rs.close();<br /> ps.close();<br /> }<br /> }<br /> // иначе вызываем родительский метод<br /> super.doAction();<br /> }<br /> }<br /> <br /> &lt;/source&gt;<br /> --[[Участник:Phricker]] 11:23, 17 февраля 2014 (UTC)<br /> <br /> == Динамические веб-сервисы ==<br /> <br /> Динамический класс позволяет заменить (обернуть) вызов метода вебсервиса. В отличие от старых методов экшенов в данном случае необходимо напрямую указать какой именно интерфейс вызова перегружается.<br /> Параметр в конфиге такой:<br /> &lt;source lang=&quot;text&quot;&gt;dynservice:&lt;модуль&gt;.&lt;интерфейс_сервиса&gt;=&lt;дин.класс&gt;&lt;/source&gt;<br /> Например:<br /> &lt;source lang=&quot;text&quot;&gt;dynservice:ru.bitel.bgbilling.kernel.contract.status.ContractStatusMonitorService=дин.класс&lt;/source&gt;<br /> Или если вызов, например, такой: &lt;nowiki&gt;http://.../bgbilling/executer/ru.bitel.bgbilling.modules.inet.api/666/InetServService?wsdl -&gt; {http://service.common.api.inet.modules.bgbilling.bitel.ru/}InetServService:inetServTypeList&lt;/nowiki&gt;<br /> &lt;source lang=&quot;text&quot;&gt;dynservice:ru.bitel.bgbilling.modules.inet.api.InetServService=дин.класс&lt;/source&gt;<br /> <br /> Точно также удобнее унаследовать от родного Impl-класса соответствующего сервиса, чем писать с нуля.<br /> <br /> '''Обратите внимание: там указывается НЕ package класса, а строка по указанной схеме.'''<br /> <br /> Обратите внимание, что в динамическом коде нужно ещё раз указать имплементацию интерфейса даже в этом случае наследования от старой имплементации (несмотря на то, что очевидно, родительский класс уже реализует указываемый интерфейс и по правилам ООП и так понятно что потомок тоже реализует, а по правилам Java не нужно указывать ещё раз implements ContractStatusMonitorService как в примере ниже).<br /> <br /> Внутри дин.класса при необходимости надо перегрузить нужный метод (или несколько), а после сделать (или не сделать, если обёртка отработала сама всё, например, вывела ошибку) явным образом вызов соответствующего родительского метода (super.blabla(foo,bar)).<br /> При поиске реализации сервиса сначала ищется среди динамических классов, но если в динкоде класс заявлен, но косячный, то дальше не ищем, незачем.<br /> <br /> Для нашего примера прописать нужно следующее:<br /> <br /> &lt;source lang=&quot;text&quot;&gt;dynservice:ru.bitel.bgbilling.kernel.contract.status.ContractStatusMonitorService=ru.xxx.ContractStatusMonitorServiceImpl&lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.util.Date;<br /> <br /> import javax.jws.WebService;<br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> import ru.bitel.bgbilling.kernel.contract.status.common.ContractStatusMonitorService;<br /> import ru.bitel.common.Utils;<br /> <br /> /**<br /> * Перегруженный вебсервис для проверки некоторых параметров:<br /> * 3. Скрипт реализующий запрет изменения &quot;Статуса&quot; договора в случае если поле комментарий пустое.<br /> * <br /> * В конфиг сервера прописывается:<br /> * dynservice:ru.bitel.bgbilling.kernel.contract.status.ContractStatusMonitorService=ru.xxx.ContractStatusMonitorServiceImpl<br /> * @author dimon<br /> */<br /> @WebService(endpointInterface = &quot;ru.bitel.bgbilling.kernel.contract.status.common.ContractStatusMonitorService&quot;)<br /> public class ContractStatusMonitorServiceImpl<br /> extends ru.bitel.bgbilling.kernel.contract.status.server.service.ContractStatusMonitorServiceImpl<br /> implements ContractStatusMonitorService<br /> {<br /> @Override<br /> public void changeContractStatus( int[] cids, int statusId, Date dateFrom, Date dateTo, String comment )<br /> throws BGException<br /> {<br /> //System.out.println(&quot;\t!\tchangeContractStatus&quot;);<br /> // [3]<br /> // ContractStatusMonitorService:changeContractStatus<br /> // @WebParam( name = &quot;comment&quot; ) String comment<br /> if( Utils.isBlankString( comment ) )<br /> {<br /> throw new BGMessageException( &quot;Введите комментарий&quot; );<br /> }<br /> super.changeContractStatus( cids, statusId, dateFrom, dateTo, comment );<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> --[[Участник:DimOn|dimOn]] 12:00, 28 ноября 2012 (UTC)</div> DimOn http://wiki.bitel.ru/index.php/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%B0%D0%BA%D1%88%D0%B5%D0%BD%D0%B0_%D0%B8_%D0%B2%D0%B5%D0%B1-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%BE%D0%B2 Примеры динамического кода акшена и веб-сервисов 2016-05-16T07:31:12Z <p>DimOn:&#32;/* Динамические веб-сервисы */</p> <hr /> <div>Динамическим кодом в данном случае можно как писать новые экшены (практическое значение имеют больше веб-экшены, т.е. экшены веб-интерфейса) и веб-сервисы, так и обёртывать существующие, т.е. заменять их, а внутри вызывать родительский метод, или не вызывать в зависимости от обстоятельств. Этим можно полностью заменить функционал такой, как [[запуск скрипта до и после акшена]]. Помимо того, что область применения шире, ещё динамичемским кодом просто быстрее, удобнее и надёжнее. В данном разделе рассмотрим примеры скриптов, совершенно аналогичные упомянутым в разделе «[[примеры скриптов до и после акшена]]», за исключением задачи &quot;проверка смены статуса&quot;, которую в старом механизме реализовать вообще невозможно, т.к. смена статуса реализована только в веб-сервисах и событий там никаких нету.<br /> <br /> == Динамические экшены ==<br /> <br /> В случае старых экшенов в конфигурацию сервера прописываются динамические классы, и то, что они заменяют. Динамический класс позволяет получить, чтобы потом заменить (обернуть) вызов метода родного класса.<br /> Параметр в конфиге примерно такой:<br /> &lt;source lang=&quot;text&quot;&gt;dynaction:&lt;модуль&gt;.&lt;режим.&gt;&lt;экшенкласснаме&gt;=дин.класс&lt;/source&gt;<br /> Примеры:<br /> &lt;source lang=&quot;text&quot;&gt;dynaction:contract.ActionCheckContractLimitUpdate=дин.класс<br /> dynaction:ru.bitel.bgbilling.plugins.crm.ActionUpdateRegisterTask=дин.класс<br /> dynaction:contract.web.ActionAdditionalAction=дин.класс&lt;/source&gt;<br /> '''Обратите внимание: там указывается НЕ package класса, а строка по указанной схеме.''' Класс может быть простой кастомный, унаследованный от самого корневого класса, но удобнее наследовать от самого перегружаемого класса, если потенциально нужна хоть какая-то логика из него. Внутри дин.класса при необходимости надо сделать явным образом вызов родительского метода (super.doAction, например). Если нужно только вывести ошибку, например, то унаследованный метод не нужно вызывать, очевидно. При поиске реализации соответствующего экшена сначала ищутся динамические классы прописанные. Дальше ничего не проверяется, что нашлось то и вернулось, т.е. если прописан dynaction, но косячный, то дальше не ищется, незачем.<br /> <br /> Для нашего примера прописать нужно следующее:<br /> &lt;source lang=&quot;text&quot;&gt;dynaction:contract.ActionUpdateContractLimit=ru.xxx.ActionUpdateContractLimit<br /> dynaction:ru.bitel.bgbilling.plugins.crm.ActionUpdateRegisterTask=ru.xxx.ActionUpdateRegisterTask&lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.sql.SQLException;<br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> import ru.bitel.common.Utils;<br /> <br /> /**<br /> * Перегруженный экшен для проверки некоторых параметров:<br /> * 2. Скрипт реализующий запрет изменения &quot;лимита&quot; договора в случае если поле комментарий пустое.<br /> * <br /> * В конфиг сервера прописывается:<br /> * dynaction:contract.ActionUpdateContractLimit=ru.xxx.ActionUpdateContractLimit<br /> * @author dimon<br /> */<br /> public class ActionUpdateContractLimit<br /> extends bitel.billing.server.contract.action.ActionUpdateContractLimit<br /> {<br /> @Override<br /> public void doAction() <br /> throws SQLException, BGException<br /> {<br /> //[2]<br /> //module=contract<br /> //action=UpdateContractLimit<br /> //comment=%ED%E5%E3%E5%ED<br /> // получаем параметры как в экшене<br /> String comment = getParameter( &quot;comment&quot;, &quot;&quot; );<br /> // если 1) комментарий пустой =&gt; ругаемся<br /> if( Utils.isBlankString( comment ) )<br /> {<br /> throw new BGMessageException( &quot;Введите комментарий&quot; );<br /> }<br /> // иначе вызываем родительский метод<br /> super.doAction();<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.sql.SQLException;<br /> import java.util.Date;<br /> <br /> import bitel.billing.common.TimeUtils;<br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> import ru.bitel.bgbilling.plugins.crm.common.model.RegisterTask;<br /> import ru.bitel.bgbilling.plugins.crm.server.dao.RegisterTaskManager;<br /> import ru.bitel.common.Utils;<br /> <br /> /**<br /> * Перегруженный экшен для проверки некоторых параметров:<br /> * 1. Скрипт реализующий запрет изменения &quot;срока&quot; задачи в плагине CRM всем кроме того кто задачу создал, а так же кроме отдельно обозначенного администратора.<br /> * 4. CRM: Нужно сделать так чтобы задачу нельзя было закрыть если поле &quot;Резолюция&quot; пустое.<br /> * <br /> * В конфиг сервера прописывается:<br /> * dynaction:ru.bitel.bgbilling.plugins.crm.ActionUpdateRegisterTask=ru.xxx.ActionUpdateRegisterTask<br /> * @author dimon<br /> */<br /> public class ActionUpdateRegisterTask<br /> extends ru.bitel.bgbilling.plugins.crm.server.action.ActionUpdateRegisterTask<br /> {<br /> /** ид отдельно обозначенного администратора */<br /> private final int ADMIN_USER = 1;<br /> <br /> @Override<br /> public void doAction() <br /> throws SQLException, BGException<br /> {<br /> // [1]<br /> // module=ru.bitel.bgbilling.plugins.crm<br /> // action=UpdateRegisterTask<br /> // id=32<br /> // target_date_and_time=21.04.2010+00%3A00<br /> // получаем параметры как в экшене<br /> int id = getIntParameter( &quot;id&quot;, -1 );<br /> Date targetDate = getDateParameter( &quot;target_date_and_time&quot;, &quot;dd.MM.yyyy HH:mm&quot;, null );<br /> if( targetDate == null )<br /> {<br /> targetDate = getDateParameter( &quot;target_date&quot;, &quot;dd.MM.yyyy&quot;, null );<br /> }<br /> // получаем таск<br /> RegisterTaskManager manager = new RegisterTaskManager( con );<br /> RegisterTask task = manager.getTaskById( id );<br /> // если 1) юзер не админ, и 2) юзер не тот кто создал задачу, то 3) проверяем время и если оно не такое =&gt; ругаемся<br /> if( userID != ADMIN_USER &amp;&amp; userID != task.getCreateUserId() &amp;&amp; !TimeUtils.dateEqual( targetDate, task.getTargetDate() ) )<br /> {<br /> throw new BGMessageException( &quot;Вам нельзя менять срок задачи&quot; );<br /> }<br /> // [4]<br /> // module=ru.bitel.bgbilling.plugins.crm<br /> // action=UpdateRegisterTask<br /> // status=2<br /> // resolution=%F0%E5%E7%EE%EB%FE%F6%E8%FF<br /> // получаем параметры как в экшене<br /> int status = getIntParameter( &quot;status&quot;, 0 );<br /> String resolution = getParameter( &quot;resolution&quot;, &quot;&quot; );<br /> //System.out.println(&quot;status=&quot;+status);<br /> //System.out.println(&quot;resolution=&quot;+resolution);<br /> // если 1) статус &quot;закрыто&quot; и 2) резолюция пустая =&gt; ругаемся<br /> if( status == 2 &amp;&amp; Utils.isBlankString( resolution ) )<br /> {<br /> throw new BGMessageException( &quot;Для закрытия заполните резолюцию&quot; );<br /> }<br /> // иначе вызываем родительский метод<br /> super.doAction();<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> ----<br /> <br /> В данном примере пользователям запрещено добавлять новый тарифный план датой ранее следующей за текущей, а так же запрещено закрывать тарифные планы датой ранее текущей.<br /> На пользователей входящих в группу администраторов ADMIN_GROUP = 1 данные ограничения не распространяются.<br /> Если на договоре нет никаких тарифных планов - разрешено указывать любые даты (т.е. если добавляемый тариф будет единственным - можно выставлять произвольные интервалы. Так было необходимо)<br /> <br /> &lt;source lang=&quot;text&quot;&gt;dynaction:contract.ActionUpdateContractTariffPlan=ru.xxx.updateContractTariffPlan&lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.sql.ResultSet;<br /> import java.sql.SQLException;<br /> import java.util.Calendar;<br /> import java.util.Date;<br /> import java.util.List;<br /> <br /> import bitel.billing.common.TimeUtils;<br /> import bitel.billing.server.admin.bgsecure.bean.UserGroupManager;<br /> <br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> <br /> <br /> public class updateContractTariffPlan <br /> extends bitel.billing.server.contract.action.ActionUpdateContractTariffPlan<br /> {<br /> //ID группы администраторов<br /> private final int ADMIN_GROUP = 1;<br /> <br /> @Override<br /> public void doAction() <br /> throws SQLException, BGException<br /> {<br /> UserGroupManager userGroupManager = new UserGroupManager(con);<br /> List&lt;Integer&gt; groups = userGroupManager.getUserGroups(userID);<br /> Calendar calendar = Calendar.getInstance();<br /> Date today = calendar.getTime();<br /> calendar.add(Calendar.DAY_OF_YEAR, 1);<br /> Date tomorrow = calendar.getTime();<br /> String id = getParameter(&quot;id&quot;, &quot;&quot;);<br /> Date date2 = TimeUtils.convertStringToDate(getParameter( &quot;date2&quot;, &quot;&quot; ));<br /> Date date1 = TimeUtils.convertStringToDate(getParameter( &quot;date1&quot;, &quot;&quot; ));<br /> <br /> if(!groups.contains(ADMIN_GROUP))<br /> {<br /> if(!id.equals(&quot;new&quot;) &amp; TimeUtils.dateBefore(date2, today))<br /> {<br /> throw new BGMessageException( &quot;Дата закрытия тарифного плана не может быть ранее текущей&quot; );<br /> }<br /> if(id.equals(&quot;new&quot;) &amp; TimeUtils.dateBefore(date1, tomorrow))<br /> {<br /> String query = &quot; SELECT COUNT(id) FROM contract_tariff WHERE cid=? &quot;;<br /> java.sql.PreparedStatement ps = con.prepareStatement( query );<br /> ps.setInt(1, cid);<br /> ResultSet rs = ps.executeQuery();<br /> while ( rs.next() )<br /> {<br /> int count = rs.getInt(1);<br /> if(count &gt; 0 )<br /> {<br /> throw new BGMessageException( &quot;Тарифный план должен устанавливаться датой следующей за текущей&quot; );<br /> }<br /> }<br /> rs.close();<br /> ps.close();<br /> }<br /> }<br /> // иначе вызываем родительский метод<br /> super.doAction();<br /> }<br /> }<br /> <br /> &lt;/source&gt;<br /> --[[Участник:Phricker]] 11:23, 17 февраля 2014 (UTC)<br /> <br /> == Динамические веб-сервисы ==<br /> <br /> Динамический класс позволяет заменить (обернуть) вызов метода вебсервиса. В отличие от старых методов экшенов в данном случае необходимо напрямую указать какой именно интерфейс вызова перегружается.<br /> Параметр в конфиге такой:<br /> &lt;source lang=&quot;text&quot;&gt;dynservice:&lt;модуль&gt;.&lt;интерфейс_сервиса&gt;=&lt;дин.класс&gt;&lt;/source&gt;<br /> Например:<br /> &lt;source lang=&quot;text&quot;&gt;dynservice:ru.bitel.bgbilling.kernel.contract.status.ContractStatusMonitorService=дин.класс&lt;/source&gt;<br /> &lt;source lang=&quot;text&quot;&gt;dynservice:ru.bitel.bgbilling.modules.inet.api.InetServService=дин.класс&lt;/source&gt;<br /> (если вызов, например, такой: http://.../bgbilling/executer/'''ru.bitel.bgbilling.modules.inet.api'''/666/'''InetServService'''?wsdl - {http://service.common.api.inet.modules.bgbilling.bitel.ru/}InetServService:inetServTypeList)<br /> Точно также удобнее унаследовать от родного Impl-класса соответствующего сервиса, чем писать с нуля.<br /> <br /> '''Обратите внимание: там указывается НЕ package класса, а строка по указанной схеме.'''<br /> <br /> Обратите внимание, что в динамическом коде нужно ещё раз указать имплементацию интерфейса даже в этом случае наследования от старой имплементации (несмотря на то, что очевидно, родительский класс уже реализует указываемый интерфейс и по правилам ООП и так понятно что потомок тоже реализует, а по правилам Java не нужно указывать ещё раз implements ContractStatusMonitorService как в примере ниже).<br /> <br /> Внутри дин.класса при необходимости надо перегрузить нужный метод (или несколько), а после сделать (или не сделать, если обёртка отработала сама всё, например, вывела ошибку) явным образом вызов соответствующего родительского метода (super.blabla(foo,bar)).<br /> При поиске реализации сервиса сначала ищется среди динамических классов, но если в динкоде класс заявлен, но косячный, то дальше не ищем, незачем.<br /> <br /> Для нашего примера прописать нужно следующее:<br /> <br /> &lt;source lang=&quot;text&quot;&gt;dynservice:ru.bitel.bgbilling.kernel.contract.status.ContractStatusMonitorService=ru.xxx.ContractStatusMonitorServiceImpl&lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.util.Date;<br /> <br /> import javax.jws.WebService;<br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> import ru.bitel.bgbilling.kernel.contract.status.common.ContractStatusMonitorService;<br /> import ru.bitel.common.Utils;<br /> <br /> /**<br /> * Перегруженный вебсервис для проверки некоторых параметров:<br /> * 3. Скрипт реализующий запрет изменения &quot;Статуса&quot; договора в случае если поле комментарий пустое.<br /> * <br /> * В конфиг сервера прописывается:<br /> * dynservice:ru.bitel.bgbilling.kernel.contract.status.ContractStatusMonitorService=ru.xxx.ContractStatusMonitorServiceImpl<br /> * @author dimon<br /> */<br /> @WebService(endpointInterface = &quot;ru.bitel.bgbilling.kernel.contract.status.common.ContractStatusMonitorService&quot;)<br /> public class ContractStatusMonitorServiceImpl<br /> extends ru.bitel.bgbilling.kernel.contract.status.server.service.ContractStatusMonitorServiceImpl<br /> implements ContractStatusMonitorService<br /> {<br /> @Override<br /> public void changeContractStatus( int[] cids, int statusId, Date dateFrom, Date dateTo, String comment )<br /> throws BGException<br /> {<br /> //System.out.println(&quot;\t!\tchangeContractStatus&quot;);<br /> // [3]<br /> // ContractStatusMonitorService:changeContractStatus<br /> // @WebParam( name = &quot;comment&quot; ) String comment<br /> if( Utils.isBlankString( comment ) )<br /> {<br /> throw new BGMessageException( &quot;Введите комментарий&quot; );<br /> }<br /> super.changeContractStatus( cids, statusId, dateFrom, dateTo, comment );<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> --[[Участник:DimOn|dimOn]] 12:00, 28 ноября 2012 (UTC)</div> DimOn http://wiki.bitel.ru/index.php/%D0%9D%D0%B5_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B0%D0%B5%D1%82%D1%81%D1%8F_%D1%81%D0%BB%D1%83%D0%B6%D0%B1%D0%B0_%D0%BF%D0%BE%D0%B4_Windows_(BGBillingServer,_BGCashcheckServer_%D0%B8%D1%82%D0%B4) Не запускается служба под Windows (BGBillingServer, BGCashcheckServer итд) 2015-12-02T13:07:17Z <p>DimOn:&#32;/* Ссылки */</p> <hr /> <div>Нужно играться с jsl.exe:<br /> jsl.exe -debug<br /> <br /> == Ссылки ==<br /> Тема на форуме:<br /> <br /> [http://bgbilling.ru/forum/viewtopic.php?t=1382 Не запускаеться служба BSBillingServer]<br /> <br /> [http://forum.bitel.ru/viewtopic.php?f=28&amp;t=8292 BGCashcheckServer 5.2 не стартует служба]<br /> <br /> [http://forum.bitel.ru/viewtopic.php?f=28&amp;t=10326 BGCashcheckServer 6.1]</div> DimOn http://wiki.bitel.ru/index.php/%D0%9D%D0%B5_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B0%D0%B5%D1%82%D1%81%D1%8F_%D1%81%D0%BB%D1%83%D0%B6%D0%B1%D0%B0_%D0%BF%D0%BE%D0%B4_Windows_(BGBillingServer,_BGCashcheckServer_%D0%B8%D1%82%D0%B4) Не запускается служба под Windows (BGBillingServer, BGCashcheckServer итд) 2015-12-02T13:06:53Z <p>DimOn:&#32;/* Ссылки */</p> <hr /> <div>Нужно играться с jsl.exe:<br /> jsl.exe -debug<br /> <br /> == Ссылки ==<br /> Тема на форуме:<br /> [http://bgbilling.ru/forum/viewtopic.php?t=1382 Не запускаеться служба BSBillingServer]<br /> [http://forum.bitel.ru/viewtopic.php?f=28&amp;t=8292 BGCashcheckServer 5.2 не стартует служба]<br /> [http://forum.bitel.ru/viewtopic.php?f=28&amp;t=10326 BGCashcheckServer 6.1]</div> DimOn http://wiki.bitel.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0 Заглавная страница 2015-12-02T13:03:32Z <p>DimOn:&#32;/* FAQ */</p> <hr /> <div>== О BiTel Wiki ==<br /> Здесь вы можете получить больше информации о продуктах BiTel: BGBilling, BGCRM, а также поделиться своим опытом с другими пользователями. В то время как документация часто предоставляет общие сведения о системе и ее настройках, в WiKi приводятся конкретные примеры.<br /> <br /> * &lt;b&gt;[[Как выложить статью на WiKi]]&lt;/b&gt;<br /> * [[Оформление статей]]<br /> * [http://forum.bitel.ru/ Форум BiTel]<br /> <br /> == Специалисты ==<br /> Уважаемые &quot;продвинутые пользователи&quot;. Здесь вы можете располагать записи со своими контактами для оказания воздмездной или безвозмездной помощи по настройке системы BGBilling пользователям, не столь далеко продвинувшимся. Желательно указывать ваши контактные данные и &quot;специализацию&quot;. Отзывы по исполнителям можно оставить/почитать [http://forum.bitel.ru/viewtopic.php?t=9329 на форуме].<br /> {| border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;<br /> |- valign=top align=&quot;center&quot; bgcolor=&quot;#eeeeee&quot; <br /> | Имя || Специализация || Контакт || Примечания<br /> |-<br /> | Рустам Тазуркаев || Mikrotik, переход с NetUp, CISCO || [[Изображение:Cpec_2_contact.png]] &lt;!-- ICQ: 648986--&gt; ||<br /> |-<br /> | Михаил Чернобаев || Скрипты биллинга, FreeBSD MPD || ICQ: 262986492 || Скриптование в биллинге, возможны крупные проекты.<br /> |- <br /> | Борис Близнюков || Скрипты биллинга, CISCO, Voip, Mera || [[Изображение:Cpec_4_contact.png]] &lt;!--ICQ: 1996944--&gt; || Только бесплатные краткие консультации. Очень хороший специалист по CISCO.<br /> |-<br /> | Андрей Бехтерев || Cisco, UNIX, ISP, Asterisk || ICQ: 7021464 WEB: http://behterev.su/ || Обширный спектр оборудования. Консалтинг.<br /> |-<br /> | Гершевич М.М. || Доработка конфигурации 1С и прочего ПО. || Тел. +79248454888 +7-(4162)-238-777 WEB: http://www.amurimpulse.ru/ mail: mike1008@mail.ru || Консалтинг. Информационная безопасность. Интеграция биллинга. Крупные проекты. Работа под заказ.<br /> |-<br /> | Андрей Зюзенков || Linux, BGBilling || http://bghelp.ru ICQ: 639121822 jabber: zavndw@jabber.ru e-mail: info@bghelp.ru skype: zavndw || Обслуживание и внедрение BGBilling и BGCRM<br /> |-<br /> | Семён Кошечкин || Java || email/gtalk: [[Файл:Cpec_5_contact.jpg]]|| Скрипты, дополнения, модуль Inet. [[%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:Contributions/Cromeshnic|wiki]]<br /> |-<br /> |-<br /> | Конференция BGBilling || вопросы касаемо системы BGBilling || bgbilling@conference.jabber.ru || Администраторы АСР BGBillig(иногда и разработчики) помогают друг другу в разных вопросах.<br /> |}<br /> <br /> == BGBilling ==<br /> === Установка ===<br /> * [[Установка на gentoo]]<br /> * [[Установка на Sun Solaris]]<br /> * [[Установка на Slackware]]<br /> * [[Установка на FreeBSD]]<br /> * [[Установка на Ubuntu 8 Desktop]]<br /> * [[Установка на Ubuntu 9.10 Desktop]]<br /> <br /> <br /> ==== Перенос данных в биллинг ====<br /> *[[Пример конвертера данных из csv-файлов в базу BGBilling]]<br /> *[[Пример конвертера данных из CSV-файлов в базу BGBilling - 2]]<br /> *[[Пример конвертера данных из CSV-файлов в базу BGBilling - 3]]<br /> *[[Конвертер базы Netup]]<br /> *[[Примеры конвертеров данных из других биллинговых систем]]<br /> <br /> === Администрирование ===<br /> * [[Разграничение прав действий]]<br /> * [[Настройка безопасности сервера биллинга и компонентов биллинга]]<br /> * [[Принудительный останов процессов биллинга]]<br /> * [[Использование подписанного SSL сертификата]]<br /> * [[Запуск scheduler и data_loader с другими портами управления]]<br /> * [[bg-snmp-management|Мониторинг java-процессов по snmp]]<br /> * [[Пример юнита для systemd]]<br /> * [[Скрипты автостарта демонов bgbilling для Debian]]<br /> * [[javaws|Запуск BGBillingClient через Java Web Start]]<br /> * [[Мониторинг Inet-Radius через JMX]]<br /> * [[Интеграция существующего сертификата и приватного ключа SSL в хранилище keystore]]<br /> <br /> === Настройка вспомогательного ПО ===<br /> *[[Проксирование обращений к BGBillingServer посредством nginx]]<br /> <br /> ==== MySQL ====<br /> *[[Рекомендации по настройке MySQL]]<br /> *[[database backup|Backup MySQL базы с помощью snapshot'ов (Linux, LVM)]]<br /> *[[Настройка MySQL репликации]]<br /> *[[Установка триггера в MySQL для отслеживания изменений]]<br /> *[[Скрипт восстановления MySQL репликации]]<br /> *[[Simple DB backup]]<br /> *[[Galera]]<br /> <br /> ==== NetFlow ====<br /> *[[Настройка NetFlow-агента IPCAD]]<br /> *[[Разделение NetFlow-потоков]]<br /> <br /> === Технологии ===<br /> *[[BGBilling_XSLT|XSLT]]<br /> <br /> === Разработка ===<br /> *[[Отладка action'ов в IntelliJ IDEA]]<br /> *[[Разработка динамического кода в IDE Eclipse]]<br /> <br /> === [[XSLT]] шаблоны ===<br /> *[[Добавление параметров договора на страницу личного кабинета]]<br /> &lt;!-- *[[Красивые графики статистики в модуле IPN]] --&gt;<br /> *[[Карточки договора]]<br /> *[[Создание XSLT/FO шаблона со штрихкодами]]<br /> *[[Подстановка данных в зависимости от текущего пользователя биллинга]]<br /> *[[Генерация прайса модуля IP телефонии в карточке договора]]<br /> <br /> ==== Счета ====<br /> *[[Печать счета-фактуры и акта на отдельных листах]]<br /> *[[Расширенные счета модуля бухгалтерии]]<br /> *[[Квитанция телефонии физ. лицам]]<br /> *[[Шаблоны вывода названия месяца]]<br /> *[[Изменения в шаблоне в зависимости от месяца документа]]<br /> *[[Добавление новых шрифтов в FO шаблоны]]<br /> <br /> === Интеграция с внешними системами ===<br /> * [[Прямая интеграция с платежными терминалами ЭСФОР / SFOUR]]<br /> * [[Интеграция с платежной системой с использованием модуля Card]]<br /> * [[Интеграция с платежной системой Robokassa]]<br /> * [[SMS рассылка через SMPP]]<br /> * [[SMS рассылка через SMPP по средствам дин кода в 5.2]]<br /> * [[Система учета &quot;Заявки и Наряды&quot; на java]]<br /> * [[Bash скрипт-отсылка смс через телефон при отсутствие ping на заданный узел]]<br /> * [[Запросы в личный кабинет пользователя сторонними системами]]<br /> * [[Запросы к серверу биллинга сторонними системами]]<br /> <br /> ==== 1С ====<br /> * [[BGBilling-1C]]<br /> * [[amurimpulse.ru bgbilling]]<br /> * [[Integrator 1C-BGBilling]]<br /> * [[Пример обращения к биллингу из 1С v.7.7]]<br /> * [[Пример интеграции с 1С v.7.7]]<br /> * [[Пример интеграции с 1С v.8.1]]<br /> * [[Пример интеграции с 1С через custom API]]<br /> * [[Установка unload_status счета через HTTP-запрос]]<br /> <br /> === Динамический код (скрипты BGBS для старых версий) ===<br /> *[[Логгирование в скриптах поведения]]<br /> <br /> ==== Динамический код ====<br /> *[[Конвертирование адреса]]<br /> *[[Глобальная синхронзация услуг модуля npay с тарифным планом]]<br /> *[[Новый номер договора группе договоров]]<br /> *[[Скрипт проверки таймзон (timezone, tz, tzdata) в java]]<br /> <br /> ==== Комплексные решения ====<br /> *[[Предоставление тестового периода пользования услугой]]<br /> *[[Организация системы отслеживания и отключения КТВ должников на BGBS с использованием CRM плагина]]<br /> *[[Автоматизация подключений VPN-клиентов с использованием CRM плагина]]<br /> *[[Пример автоматизации подключения новых клиентов]]<br /> <br /> ==== Глобальные скрипты ====<br /> *[[Скрипт глобальный отмены перехода на тарифы при неоплате]]<br /> *[[Скрипт предоставление скидки пенсионерам]]<br /> *[[Скрипт создания субдоговоров по шаблону]]<br /> *[[Глобальное событие запуска сервера]]<br /> *[[Перемещение в группу через 3 месяца если не было движения денег в наработке]]<br /> *[[Поиск и изменение статусов у договоров]]<br /> *[[Получение списка доступных действий в SQL]]<br /> *[[Глобальный скрипт для удаления старых таблиц]]<br /> <br /> ==== Пользовательские библиотеки скриптов ====<br /> *[[Пересчеты и бонусы]]<br /> *[[Архивирование логов netflow и radius accaunting]]<br /> <br /> ==== Ядро ====<br /> *[[Смена тарифного плана по заданию пользователя]]<br /> *[[Валидация текстового параметра]]<br /> *[[Проверка ИНН/КПП при вводе]]<br /> *[[Проверка параметра договора перед изменением]]<br /> *[[Обработка смены параметра договора]]<br /> *[[Создание списка дополнительных действий для договора]]<br /> *[[Обработка события создания договора]]<br /> *[[Обработка события &quot;добавление услуги RSCM в договор&quot; . Скипт сменяет тариф, подключает абонплату ]]<br /> *[[Приостановление договора клиентом через WEB]]<br /> *[[Скрипт проверки баланса и отключения договора]]<br /> *[[Изменение стандартной логики перетирания статусов]]<br /> *[[Пример продажи OEM ключей с помощью скрипта]]<br /> *[[Пример копирования тарифного плана]]<br /> *[[Получение текущего пользователя биллинга]]<br /> *[[Запуск скрипта до и после акшена]]<br /> *[[Примеры скриптов до и после акшена]]<br /> *[[Примеры динамического кода акшена и веб-сервисов]]<br /> *[[Начисление бонусов на счет при платежах определенного типа]]<br /> *[[Включение должников по приходу платежа]]<br /> *[[Снижение лимита при внесении расхода]]<br /> *[[Изменение суммы лимита определенной группе договоров]]<br /> *[[Синхронизация услуг договора в соответствии с тарифными планами]]<br /> *[[Добавление группы и снятие в зависимости от статуса]]<br /> *[[Управление статусом договора по состоянию баланса]]<br /> *[[Запрет на вход в личный кабинет с закрытых договоров]]<br /> *[[Переход на понижающий тариф только со следующего месяца]]<br /> *[[Пример создания своего интерфейса в клиенте]]<br /> *[[Метки услуг]]<br /> *[[Сравнение прав пользователей]]<br /> *[[Свой список шаблонов договоров]]<br /> *[[Модификация приходящего платежа (снятие процента)]]<br /> *[[Подкрашивание договоров в поиске]]<br /> <br /> ==== Модуль Bill ====<br /> *[[Создание счета в модуле Bill]]<br /> *[[Создание счета из суммы платежей по классу договоров]]<br /> *[[Создание счета по таблице позиций]]<br /> *[[Создание счета и счет-фактур в модуле Bill(выполнение тех же действий что и руками)]]<br /> *[[Создание счетов на предоплату]]<br /> *[[Распечатка счетов в pdf по событию генерации счета]]<br /> *[[Внешняя программа на JAVA для синхронизации номеров счетов и актов выполненных работ (версия BGBilling 5.0)]]<br /> *[[Автоматическая отправка счетов через глобальный скрипт поведения]]<br /> <br /> ==== Модуль DialUp ====<br /> *[[Запуск переначисления в модуле DialUp]]<br /> *[[Передача ACCEPT вместо REJECT вместе с доп. аттрибутами]]<br /> *[[Обработка запроса учетного периода]]<br /> *[[Переинициализация тарифа в пределах сессии | Обработка запроса учетного периода (переинициализация тарифа в пределах сессии) ]]<br /> *[[Ограничение доступа для различных групп пользователей для BGRadiusDialup]]<br /> *[[Детальное информирование абонентов о причинах ошибки 691]]<br /> *[[Аутентификация с учетом Calling-Id-Station]]<br /> *[[Доп. действие сброса активных соединений]]<br /> *[[Открытие абонплаты по первой установке соединения]]<br /> *[[Пересчет трафика по данным Radius (при потерянных Netflow-логах)]]<br /> *[[Отключение Fake сессий при приходе платежа]]<br /> *[[Ограничение доступа на основе объектов]]<br /> <br /> ==== Модуль DialUp / Cкрипты предобработки RADIUS запросов ====<br /> * [[Уcтановка услуги типа &quot;Время&quot; для BGRadiusDialup]]<br /> * [[Установка фиксированного пароля]]<br /> * [[Нормализация параметра Acct-Session-Id у маршрутизатора Cisco]]<br /> * [[Разделение атрибута User-Name на логин и пароль]]<br /> * [[Вынос MAC адреса из cisco-avp-pair в Calling-Station-Id]]<br /> * [[Копирование Тunnel-Client-Endpoint/Tunnel-Server-Endpoint в Calling-Station-Id/Called-Station-Id]]<br /> * [[Замена radius-атрибутов при авторизации]]<br /> <br /> ==== Модуль Inet / Cкрипты предобработки RADIUS запросов ====<br /> * [[Вынос MAC адреса из cisco-avp-pair в Calling-Station-Id для модуля Inet]]<br /> <br /> ==== Модуль СerberСrypt ====<br /> *[[Изменение подписки карты через web (cerbercrypt)]]<br /> *[[Управление подписками через веб (cerbercrypt)]]<br /> *[[Дин.код для синхронизации pairing с внешнего cas]]<br /> *[[Скрипт активации/деактивации карты при добавлении/удалении]]<br /> <br /> ==== Модуль NPay ====<br /> *[[Определение размера абонентской платы]]<br /> *[[Запуск переначисления в модуле NPay]]<br /> *[[Дебетовые абонплаты. Снятие штрафа за разблокировку.]]<br /> *[[Снятие абонентской платы в дебитовых договорах]]<br /> *[[Предварительное уведомление о блокировке по дебетовым абонплатам]]<br /> <br /> ==== Модуль Phone ====<br /> *[[При создании поинта модуля Phone добавление в него абонплат]]<br /> *[[Закрытие_телефонных_договоров]]<br /> <br /> ==== Модуль RSCM ====<br /> *[[Запуск переначисления в модуле RSCM]]<br /> *[[Перенос суммы расхода в наработку RSCM модуля]]<br /> <br /> ==== Модуль VoiceIp ====<br /> *[[Определение стоимости звонка VoiceIp]]<br /> <br /> ==== Модуль VoiceIp / Cкрипты предобработки RADIUS запросов ====<br /> * [[Идентификация Voip оператора по подсети (транзит)]]<br /> * [[Установка параметров звонка Voip]]<br /> * [[Установка фиксированного пароля]]<br /> * [[Разделение атрибута User-Name на логин и пароль]]<br /> * [[Замена radius-атрибутов при авторизации]]<br /> <br /> ==== Плагин CRM ====<br /> *[[Обработка выполненных задач в журнале задач]]<br /> *[[Обработка задач по событию ядра &quot;Поступление платежа&quot;, создание новой задачи и изменение существующей]]<br /> *[[Пример получения информации о задаче]]<br /> *[[Уведомления монтажников о новых активных задачах путем отправки SMS XML запросом]]<br /> <br /> ==== Плагин CashCheck ====<br /> *[[Чек: добавление позиции]]<br /> *[[Чек: завершение формирования]]<br /> *[[Примеры скриптов CashCheck]]<br /> <br /> ==== Плагин Documents ====<br /> *[[Создание копий документа на договорах]]<br /> <br /> ==== Модуль Inet ====<br /> *[[Скрипт активации учетного периода]]<br /> *[[Скрипт закрытия соединений]]<br /> <br /> === Решения для модулей и плагинов ===<br /> <br /> ==== Модуль DialUP ====<br /> *[[Настройка Lucent Ascend MAX6000 в качестве DialUP сервера]]<br /> *[[Настройка Dial-IN сервера FreeBSD PPPD]]<br /> *[[Настройка VPN сервера LINUX PPPD + POPTOP]]<br /> *[[Настройка шейпера в LINUX PPPD]]<br /> *[[Настройка VPN сервера FreeBSD MPD]]<br /> *[[Настройка PPPoE сервера на Cisco-роутере]]<br /> *[[Настройка PPPoE и/или РРТР (VPN) на Mikrotik]]<br /> *[[Проблема с прохождением update пакетов и сброса сессий в Debian и Ubuntu дистрибутивах]]<br /> *[[Настройка Dial-IN Windows RRAS сервера]]<br /> *[[VPN доступ с повременной тарификацией на базе FreeBSD MPD]]<br /> *[[Организация семейства UNLIMIT тарифов на базе FreeBSD MPD]]<br /> *[[Примеры тарифных планов VPN/DialUp]]<br /> *[[Отключение сессий по PoD на CISCO]]<br /> *[[Пример скрипта управления уровнями BGRadiusDialup]]<br /> *[[Настройка cisco с поддеркой ISG]]<br /> *[[Настройка BGBilling c поддеркой ISG]]<br /> *[[Настройка BGBilling с RedBack SmartEdge (PPPOE)]]<br /> <br /> ==== Модуль E-Mail ====<br /> *[[Почтовая система Exim + Cyrus + OpenLDAP на FreeBSD]]<br /> *[[Postfix/MySQL/BGBilling]]<br /> *[[Postfix+dovecot+ldap]]<br /> *[[Postfix+Mysql+Virtual domains]]<br /> <br /> ==== Модуль Inet ====<br /> *[[Inet FAQ]]<br /> *[[Схемы подключения]]<br /> *[[Расширения]]<br /> *[[Конвертеры из IPN в INET]]<br /> *[[Конвертер: логины Dialup в сервисы inet]]<br /> <br /> ==== Модуль IPN ====<br /> *[[IP/VPN]]<br /> *[[Примеры тарифных планов IPN]]<br /> *[[Настройка BGIPNNetflowCollector]]<br /> *[[Методика определения причины отсутствия трафика в отчете договора]]<br /> *[[Связка с flow-tools]]<br /> *[[Экспорт Netflow-данных в формат Nfdump]]<br /> *[[Реалиазация шлюза на Cisco]]<br /> *[[Реализация шлюзов на BeanShell,примеры стандартных и других шлюзов]] (Manad, Cisco, Zyxel, Mikrotik)<br /> *[[Изменения в manad для работы с одним pipe на множество IP адресов]]<br /> *[[FreeBSD manad, понимающий изменения правил в тарифах]]<br /> *[[Табличный FreeBSD manad, понимающий изменения правил в тарифах]]<br /> *[[Пример реализации скриптового универсального шлюза]]<br /> *[[Конвертер привязок услуг dialup в привязки ipn]]<br /> *[[Реализация скрипта Manad]]<br /> *[[Настройка шлюза Mikrotik]]<br /> *[[Обновление номеров интерфейсов при замене роутера]]<br /> <br /> ==== Модуль Phone ====<br /> * [[Конвертация и загрузка тарифов Телефонии в биллинг]]<br /> * [[Примеры тарифных планов Телефонии]]<br /> * [[Примеры реализации конверторов логов]]<br /> * [[Генератор отчётности для Совинтел]]<br /> <br /> ==== Модуль Reports ====<br /> *[[Редактирование отчетов в iReport]]<br /> *[[Примеры отчётов]]<br /> *[[Использование отчётов для организации универсального поиска]]<br /> *[[Табличные отчёты с динамическими столбцами]]<br /> *[[Табличные отчёты в динамическом коде]]<br /> *[[Сохранение JasperReports-отчёта на сервере в pdf]]<br /> <br /> ==== Модуль TV ====<br /> *[[Активация/добавление модуля на договор через дополнительное действие]]<br /> <br /> ==== Модуль VoiceIP ====<br /> *[[Интеграция Asterisk и BGBilling (Accounting) посредством скрипта предобработки запросов Radius]]<br /> *[[Интеграция Asterisk и BGBilling (Accounting) посредством изменения программного кода Asterisk]]<br /> *[[Интеграция c MVTS]]<br /> *[[Интеграция c Cisco Call Manager Express (CME)]]<br /> *[[Карточная IVR система на базе Cisco]]<br /> *[[Примеры IVR скриптов для Cisco]]<br /> *[[Пример настройки Cisco AS5350]]<br /> *[[Продажа пакетов минут на направления]]<br /> <br /> ==== Плагин Dispatch ====<br /> *[[Импорт старой схемы рассылок баланса в Dispatch]]<br /> <br /> === SQL-запросы ===<br /> *[[Схема связки таблиц тарифов]]<br /> *[[Разные SQL-запросы]]<br /> *[[SQL-запрос: кто сколько платит на каждом тарифе]]<br /> *[[Получение цен тарифов]]<br /> *[[Работа с группами, битовые маски]]<br /> *[[наработка по абонентке и услугам за месяц]]<br /> <br /> ==== CerberCrypt ====<br /> *[[Модуль CerberCrypt: Разные SQL-запросы]]<br /> *[[Модуль CerberCrypt: Поиск битых SQL-связей]]<br /> <br /> === Веб-Интерфейс ===<br /> *[[Свой action в личном кабинете]]<br /> **[[WebAction_CustomSuspend]] - управление статусом договора (v5.0)<br /> *[[Изменение параметров договора из личного кабинета]]<br /> *[[Как убрать ненужные действия в web]]<br /> <br /> === Протоколы ===<br /> *[[Протокол дилерский платежей]]<br /> *[[Протоколы, поддержанные в модуле MPS]]<br /> *[[Протоколы, поддержанные в модуле Phone]]<br /> *[[Медиа: Enaza.zip]]<br /> *[[Медиа: Payonline.zip]]<br /> <br /> === FAQ ===<br /> * [[Не запускается служба под Windows (BGBillingServer, BGCashcheckServer итд)]]<br /> * [[Вопросы вместо русских букв]]<br /> * [[Что происходит с пользователями при рестарте сервера биллинга и BGRadiusDialup]]<br /> * [[Тарификация максимального трафика]]<br /> * [[Field ... doesn't have a default value ]]<br /> * [[Character set ‘cp1251' is not a compiled character set and is not specified in the ‘C:\mysql\\share\charsets\Index.xml’ file ]]<br /> * [[com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown database 'bgbilling' ]]<br /> * [[Договор не отображается в поиске]]<br /> * [[PPPD проблема с сессиями больше 4ГБ]]<br /> * [[Меню личного кабинета]]<br /> * [[Java.lang.NoClassDefFoundError:_javax/xml/bind/DataBindingException|FreeBSD: Java.lang.NoClassDefFoundError: javax/xml/bind/DataBindingException]]<br /> * [[Manad: после некоторого количества договоров начинает передавать данные на биллинг неправильно ]]<br /> * [[Ошибка выполнения скиптов: Undefined argument:]]<br /> * [[Ошибка в логе &quot;Too many open files&quot;]]<br /> * [[Ошибка в клиенте &quot;Action NOT FOUND!..&quot;]]<br /> * [[Inet FAQ]]<br /> * [[java.lang.NoSuchMethodError]]<br /> * [[Много таблиц npay_add_cost_detail и npay_detail]]<br /> * [[Тормозит клиент BG под Windows]]<br /> * [[Unable to load authentication plugin]]<br /> <br /> == BGCRM ==<br /> <br /> === Настройка вспомогательного ПО ===<br /> * [[Проксирование обращений к BGCRM посредством nginx]]<br /> <br /> === Плагин BGBilling ===<br /> * [[Синхронизация справочников адресов с BGBilling]]<br /> * [[Активация доверительного платежа в привязанном к процессу договоре биллинга]]<br /> * [[Импорт контрагентов из договоров, sql запрос]]<br /> <br /> === Плагин Document ===<br /> * [[Примеры шаблонов для генерации документов]]<br /> * [[Пустой шаблон]]<br /> <br /> === Плагин Report ===<br /> * [[Примеры отчётов BGCRM]]<br /> <br /> === Комплексные решения ===<br /> *[[Организация отключения должников КТВ]]<br /> *[[Интеграция с Asterisk для обработки входящих звонков]]<br /> <br /> === Интеграция с внешними системами ===<br /> *[[Asterisk - пример обращения от АТС]]<br /> <br /> === Примеры динамического кода ===<br /> *[[Проверка уникальности контрагента по ИНН]]<br /> *[[Проверка уникальности контрагента по паспортным данным]]<br /> *[[Переключение статуса процессов по наступлению момента времени]]<br /> *[[Повышение приоритета процессов]]<br /> *[[Проверка правки параметра процесса]]<br /> *[[Изменение описания процесса по правке параметра]]<br /> *[[Обработка событий процесса согласования]]<br /> *[[Генерация новостей исполнителям при изменении процессов]]<br /> *[[Уведомление на email]]<br /> <br /> == DBInfo ==<br /> * [[Описание программы]]<br /> * [[Установка и настройка программы]]<br /> * [[Исходный код программы]]<br /> <br /> == Разработка ПО ==<br /> В данном разделе собираются рекомендации по разработке ПО. Это накопленная годами и пополняемая база знания призвана упростить обучение в первую очередь разработчиков, работающих с применяемыми в BiTel технологиями: Java, Web (JS, HTML), СУБД MySQL, LINUX, GIT. И разрабатывающих схожие приложения: тиражируемые продукты для автоматизации процессов организаций. Всё предельно конкретно, поэтому большая часть примеров будет приведена на Java.<br /> Однако значительная часть описываемых проблем и принципов довольно фундоментальна и может быть полезна разработчиками в иных областях.<br /> <br /> === В общем ===<br /> * [[Разработка]]<br /> * [[Оптимизация]]<br /> * [[Логирование]]<br /> * [[Сборка и публикация проекта]]<br /> <br /> === Java разработка ===<br /> * [[Работа с git в Eclipse(EGit)]]<br /> * [[Выявление неисправностей приложений]]<br /> * [[Обращение к Web-сервису]]<br /> * [[Работа с SQL в Java]]<br /> * [[Встроенный Application сервер в приложении]]<br /> * [[Потоки в Java]]<br /> * [[Обработка ошибок]]<br /> <br /> ==== Полезные Java библиотеки ====<br /> {| border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;<br /> |- valign=top align=&quot;center&quot; bgcolor=&quot;#eeeeee&quot; <br /> | Наименование || Область применения<br /> |-<br /> | [[Jimi - обработка изображений | JIMI]] || Обработка изображений<br /> |}<br /> <br /> === Технологии, используемые в проектах ===<br /> * [[XML]]<br /> * [[XSLT]]<br /> * [[FO(P)]]<br /> * [[REGEXP]]<br /> * [[MySQL REGEXP]]<br /> <br /> === Вспомогательные технологии ===<br /> * [[Сборщик Apache ANT]]<br /> * [[Сбор и анализ сетевого трафика]]<br /> * [[SSH]]<br /> * [[Оптимизация запросов в MySQL]]<br /> <br /> === Требования BiTel к оформлению ===<br /> * [[Java кода]]<br /> * [[MySQL кода]]</div> DimOn http://wiki.bitel.ru/index.php/%D0%9D%D0%B5_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B0%D0%B5%D1%82%D1%81%D1%8F_%D1%81%D0%BB%D1%83%D0%B6%D0%B1%D0%B0_BSBillingServer_%D0%BF%D0%BE%D0%B4_Windows Не запускается служба BSBillingServer под Windows 2015-12-02T13:03:02Z <p>DimOn:&#32;переименовал «Не запускается служба BSBillingServer под Windows» в «Не запускается служба под Windows (BGBillingServer, BGCashcheckServer итд)»</p> <hr /> <div>#перенаправление [[Не запускается служба под Windows (BGBillingServer, BGCashcheckServer итд)]]</div> DimOn http://wiki.bitel.ru/index.php/%D0%9D%D0%B5_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B0%D0%B5%D1%82%D1%81%D1%8F_%D1%81%D0%BB%D1%83%D0%B6%D0%B1%D0%B0_%D0%BF%D0%BE%D0%B4_Windows_(BGBillingServer,_BGCashcheckServer_%D0%B8%D1%82%D0%B4) Не запускается служба под Windows (BGBillingServer, BGCashcheckServer итд) 2015-12-02T13:03:02Z <p>DimOn:&#32;переименовал «Не запускается служба BSBillingServer под Windows» в «Не запускается служба под Windows (BGBillingServer, BGCashcheckServer итд)»</p> <hr /> <div>Нужно играться с jsl.exe:<br /> jsl.exe -debug<br /> <br /> == Ссылки ==<br /> Тема на форуме: [http://bgbilling.ru/forum/viewtopic.php?t=1382 Не запускаеться служба BSBillingServer]</div> DimOn http://wiki.bitel.ru/index.php/%D0%9D%D0%B5_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B0%D0%B5%D1%82%D1%81%D1%8F_%D1%81%D0%BB%D1%83%D0%B6%D0%B1%D0%B0_%D0%BF%D0%BE%D0%B4_Windows_(BGBillingServer,_BGCashcheckServer_%D0%B8%D1%82%D0%B4) Не запускается служба под Windows (BGBillingServer, BGCashcheckServer итд) 2015-12-02T12:54:37Z <p>DimOn:&#32;</p> <hr /> <div>Нужно играться с jsl.exe:<br /> jsl.exe -debug<br /> <br /> == Ссылки ==<br /> Тема на форуме: [http://bgbilling.ru/forum/viewtopic.php?t=1382 Не запускаеться служба BSBillingServer]</div> DimOn http://wiki.bitel.ru/index.php/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%BE%D0%BD%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2 Примеры реализации конверторов логов 2015-10-26T11:46:28Z <p>DimOn:&#32;/* MC240 */</p> <hr /> <div>== Siemens EWSD ==<br /> Конвертер на perl из бинарного формата Siemens EWSD v12 в формат биллинга.<br /> <br /> ama.pl осуществляет конвертацию дневного лога в часовые. schedule.pl запускается cron-ом и проверяет директорию, указанную в файле conf на наличие логов и запускает ama.pl с указанием имени файла; файл после конвертирования переносится в папку ./done<br /> <br /> ama.pl после конвертирования выполняет data_loader.sh для добавления задачи на загрузку лога.<br /> Формат названия файла: AMA.yyMMdd.ama.<br /> <br /> [[Медиа:Phone_ama.zip]]<br /> <br /> == ISKRATEL si2000 ==<br /> Конвертер на perl из бинарного формата si2000 в формат биллинга.<br /> <br /> Это архив папки /home/ATS, в которой лежит несколько конвертеров (si2000, md100, mx96). <br /> <br /> Данный конвертер располагается в подпапке si2000. <br /> <br /> Файл convert_si2000.sh(в корне) запускается cron-ом и вызвает файл si2000/si2000_get_logs.pl . Тот работает следующим образом:<br /> <br /> 1. Анализируетет ftp-папку на начличие файлов *.ama и копирует их в папку source (то же бинарный файл, только уже без расшинения кладет как source/year/month/day/hour/log_xxxx).. В папке ftp лежат файлы вида i222220080821161532.ama(2008-год,08-месяц,21-число,16 -, 1532 - номер xxxx). Если такой файл уже есть в папке source, то он игнорируется. <br /> <br /> 2. Вызывает si2000/convert_log.pl, который конвертирует новые полученные файлы в формат биллинга(кладет файлы si2000/year/month/day_hour.zip) <br /> <br /> 3. Вызывает data_loader.sh для добавления задачи на загрузку логов<br /> <br /> пути к локальным и ftp-папке указаны в начале скриптов. <br /> <br /> Конвертер:<br /> <br /> [[Медиа:ATS.zip]]<br /> <br /> Описание формата:<br /> [[Медиа:FUN559000PCR150.PDF.zip]]<br /> <br /> <br /> Вот тут есть еще одна модификация этого конвертера(так как этот вариант не смог распарсить их ama-файлы). возможно , кому-то поможет:<br /> http://forum.bgbilling.ru/viewtopic.php?f=10&amp;t=3962<br /> <br /> <br /> 1) в конвертере найдена ошибка при считывании номера звонящего абонента.<br /> нужно заменить вот этот кусок в файле convert_log.pl<br /> &lt;source lang =&quot;perl&quot; &gt;<br /> my $lac = undef;<br /> my $spis_num = undef;<br /> <br /> my $bytes_lac_len = get_bytes_len( $lac_len );<br /> my $bytes_spis_num_len = get_bytes_len( $spis_num_len );<br /> <br /> if( $lac_len &gt; 0 )<br /> {<br /> read( FILE_IN, $data, $bytes_lac_len );<br /> $lac = get_bcd( $data, $lac_len );<br /> }<br /> if( $spis_num_len &gt; 0 )<br /> {<br /> read( FILE_IN, $data, $bytes_spis_num_len );<br /> $spis_num = get_bcd( $data, $spis_num_len );<br /> }<br /> <br /> my $var_len = $record_len - 16 - $bytes_lac_len - $bytes_spis_num_len;<br /> <br /> &lt;/source&gt;<br /> <br /> На вот этот <br /> &lt;source lang =&quot;perl&quot; &gt;<br /> my $lac = undef;<br /> my $bytes_lac_len = get_bytes_len( $lac_len );<br /> <br /> my $first_digit;<br /> if( $lac_len &gt; 0 )<br /> {<br /> read( FILE_IN, $data, $bytes_lac_len );<br /> $lac = get_bcd( $data, $lac_len );<br /> <br /> if ( $lac_len % 2 == 1 )<br /> {<br /> my $idx = $lac_len / 2;<br /> my $part = substr( $data, $idx, 1 );<br /> my @f = unpack( 'C', $part);<br /> $first_digit = $f[0]&amp;0b00001111;<br /> }<br /> }<br /> <br /> my $spis_num = '';<br /> <br /> my $bytes_summa = get_bytes_len( $lac_len + $spis_num_len );<br /> <br /> if( $spis_num_len &gt; 0 )<br /> {<br /> if ( $first_digit )<br /> {<br /> $spis_num_len--;<br /> $spis_num .= $first_digit;<br /> }<br /> <br /> my $bytes_spis_num_len = get_bytes_len( $spis_num_len );<br /> <br /> read( FILE_IN, $data, $bytes_spis_num_len );<br /> $spis_num .= get_bcd( $data, $spis_num_len );<br /> }<br /> <br /> my $var_len = $record_len - 16 - $bytes_summa;<br /> <br /> &lt;/source &gt;<br /> <br /> Суть исправления в том, что код города и номер считываются подряд . B случае если код города, например 88712(нечетный), а номер 222066, то номер считывался как 220660,так как первая 2-ка просто <br /> выбрасывалась, как остаток BCD-поля, что неверно.<br /> <br /> 2) В конвертере можно считывать порты с помощью замены вот этих строк<br /> <br /> <br /> &lt;source lang=&quot;perl&quot;&gt;<br /> # vhod tract<br /> elsif( $f[0] == 113 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> print &quot;113=&gt;$id\n&quot;;<br /> <br /> $result{113} = $id;<br /> $pos += 9;<br /> }<br /> # ishod tract<br /> elsif( $f[0] == 114 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> print &quot;114=&gt;$id\n&quot;;<br /> <br /> $result{114} = $id;<br /> $pos += 9;<br /> }<br /> <br /> &lt;/source&gt;<br /> на эти <br /> &lt;source lang=&quot;perl&quot;&gt;<br /> # vhod tract<br /> elsif( $f[0] == 113 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> #my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> #kanal(port)<br /> my $id = &quot;$id[0]&quot;;<br /> <br /> print &quot;113=&gt;$id\n&quot;;<br /> <br /> $result{113} = $id;<br /> $pos += 9;<br /> }<br /> # ishod tract<br /> elsif( $f[0] == 114 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> #my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> #kanal(port)<br /> my $id = &quot;$id[0]&quot;;<br /> <br /> <br /> print &quot;114=&gt;$id\n&quot;;<br /> <br /> $result{114} = $id;<br /> $pos += 9;<br /> }<br /> <br /> &lt;/source&gt;<br /> <br /> == ISKRATEL si3000 ==<br /> Есть только описание формата:<br /> [[Медиа:SI3000CDR.PDF.zip]]<br /> <br /> <br /> == Ericsson MD-110 ==<br /> Конвертер на perl из тексового формата Ericsson MD-110 в формат биллинга.<br /> <br /> Это архив папки /home/ATS, в которой лежит несколько конвертеров (si2000, md100, mx96). Данный конвертер располагается в подпапке md100. <br /> <br /> Чтение данных происходи с com-порта ATS. Для этого запускается скрипт md100/start_read_com.sh, который постоянно считавает данные в файл md100/log. <br /> <br /> Файл convert_md110.sh(в корне) запускается cron-ом и вызвает файл md110/md110_convert_hour.pl .. Тот работает так :<br /> <br /> 1. Вызывает скрипт md110/hour_log, который берет данные из файла md100/log, помещает его содержимое в папку source как лог очердного часа (в формате yyyy.mm.dd.hour.log) и очищает log . <br /> <br /> 2. Вызывает md110/convert_log, который конвертирует полученный лог в формат биллинга( кладет файл md110/year/month/day_hour.zip) <br /> <br /> 3. Вызывает data_loader.sh из папки биллинга для добавления задачи на загрузку лога<br /> <br /> пути указаны в начале скриптов. <br /> <br /> Конвертер<br /> [[Медиа:ATS.zip]]<br /> <br /> Примерный формат логов :<br /> &lt;source lang=&quot;bash&quot;&gt;<br /> MMDD HHMM duration number_from number_to port_to<br /> &lt;/source&gt;<br /> <br /> <br /> update: Для избежания зависания com-порта на порте должен был выдаваться сигнал о готовности принимать данные. Поэтому надо изменить файлик start_read_com.sh :<br /> stty -F /dev/ttyS0 ispeed 19200 cs7 clocal crtscts<br /> <br /> == mx96 ==<br /> <br /> В данном разделе речь идёт о неком устройстве '''mx96''' (Actionet_MX). Представленный конвертер знает о следующей ситуации. Имеется доступ по ftp к расшаренным исходным логам. Имена логов имеют вид '''ггммддNN.C35''', где, как несложно догадаться, &quot;гг&quot;, &quot;мм&quot; и &quot;дд&quot; - это день, месяц и год, а NN - номер файла в шестнадцатиричном виде, причём младший байт расположен слева. Номера файлов придуманы неспроста - при перегрузке считающего оборудования и прочих ситуация начинается вестись новый лог, с той же датой, но следующим номером.<br /> С наименованием разобрались, переходим к формату. Конвертер нацелен на работу со следующим форматом данных файла вызова:<br /> <br /> Первые 320 байт файла - заголовок, каждые следующие 123 байта (включая перевод строки и каретки) - отдельная запись вызова.<br /> <br /> Описание записи файла вызовов &quot;C&quot; тип 1 (Документация CLD DAXL 0159r стр.117):<br /> &lt;pre&gt; <br /> Поле Длина Формат Описание<br /> record number 6 nnnnnn 6-значный десятичный порядковый номер<br /> a_mx_nbr 2 nn Номер станции MX абонента А<br /> b_mx_nbr 2 nn Номер станции MX абонента Б<br /> date 8 yyyymmdd Дата начала вызова<br /> time 6 hhmmss Время начала вызова<br /> a_subnbr 10 nn..n Полный номер абонента А (выровненный по левому разряду с пробелами в конце)<br /> b_subnbr 20 nn..n Полный номер абонента Б (выровненный по левому разряду с пробелами в конце)<br /> a_int_type 2 nn Тип интерфейса абонента А: 00...08 определены, 09...99 зарезервированы<br /> b_int_type 2 nn Тип интерфейса абонента Б: 00...08 определены, 09...99 зарезервированы<br /> call_type 3 nnn Тип вызова: десятичное число от 00 до 34<br /> site_a 3 nnn Номер базовой станции абонента А<br /> channel_a 5 nnnnn Номер канала абонента А<br /> site_b 3 nnn Номер базовой станции абонента Б<br /> channel_b 5 nnnnn Номер канала абонента Б<br /> b_subs_q_time 5 nnnnn Время ожидания в очереди к абоненту Б (секунд)<br /> tc_wait_time 5 nnnnn Время ожидания канала связи (секунд)<br /> b_subs_answ_time 5 nnnnn Длительность подачи вызывного сигнала абоненту Б (секунд)<br /> call_duration 5 nnnnn Продолжительность вызова (секунд)<br /> release_mode 3 nnn Режим отбоя вызова (секунд)<br /> spec_func 3 nnn Специальные функции: от 0 до 5<br /> ch_pul_mode 3 nnn Режим тарифных импульсов<br /> ch_pulses 5 nnnnn Тарифные импульсы<br /> call_id 10 nn.n Идентификатор вызова (целое число)<br /> cr_lf 2 0D0A<br /> &lt;/pre&gt;<br /> Рассмотрим конкретный пример лога (первой строкой для наглядности дана маска по данным):<br /> &lt;pre&gt;<br /> NNNNNNAABBDDDDDDDDTTTTTTAAAAAAAAAABBBBBBBBBBBBBBBBBBBBAABBTTTSSSCCCCCSSSCCCCCTTTTTWWWWWTTTTTDDDDDRRRFFFPPPCCCCCIIIIIIIIII<br /> 1 35352008070900001570749 0063929 0 5 4 3 96255 71 0 0 9 9 0 0 0 0 889738557<br /> 2 35352008070823300870341 70355 0 0 4 0 92 0 19965535 0 18 1805 10 0 0 0 896423075<br /> 11 353520080708235902?255/8101?70336 5 0 4255 73 3 12265535 0 6 369 1 0 2 0 889673020<br /> 133 35352008070901172670431 0067481 0 5 4 3 122255 58 0 0 12 43 0 0 0 0 891835870<br /> &lt;/pre&gt;<br /> Имейте ввиду, что форматы разных версий устройства могут различаться (или, возможно, при этом они поддаются какой-либо настройке), так что необходимо править соответствующим образом главное регулярное выражение, производящее разбор.<br /> <br /> Теперь рассмотрим скрипты, составляющие конвертер. Первый из них, '''mx96_get_logs.pl''', основной. Он и выполняет самую рутинную работу - отслеживает не появилось ли на ftp несколько новых файлов, скачивает их в соответствующие локальные директории, разбитые по датам (&lt;рабочий каталог&gt;/source/&lt;год&gt;/&lt;месяц&gt;/&lt;день&gt;) и запускает конвертер форматов, '''convert_log.pl'''. Имейте ввиду - &quot;сегодняшние&quot; логи игнорируются, потому, что данные могут оказаться неполными не только за день, но и за час, что не вполне подходит к нашему случаю.<br /> <br /> Про второй скрипт, '''convert_log.pl''', надо сказать отдельно. Он принимает один параметр - путь к файлам логов. Так как у нас по пути находятся несколько почасовых файлов (от нуля до 1, 2 и более для каждого часа), то становится ясно - конвертируются логи за сутки. Скрипт сам понимает, какой именно лог и по какой дате составлять, исходные пути подсказывают ему это.<br /> <br /> Стоит обратить внимание на то, что все логи, уже скачанные, игнорируются. То есть для переобсчёта надо удалить соответствующие скачанные логи из папки source и перезапустить конвертер (или потерпеть до автоматического перезапуска) - все новые логи будут скачены, разложены по папкам и должным образом обработаны.<br /> <br /> Запуск скрипта производится как обычно:&lt;pre&gt;<br /> nohup mx96_get_logs.pl &gt;&gt; convert.out 2&gt;&amp;1 &amp;<br /> &lt;/pre&gt;<br /> Для автоматизации настраивается crontab (в скрипте convert_mx96.sh содержится похожая на приведённую выше строка запуска)<br /> <br /> Файл crontab:&lt;pre&gt;<br /> SHELL=/bin/sh<br /> # convert<br /> 10 0 * * * /home/ATS/convert_mx96.sh<br /> &lt;/pre&gt;<br /> [[Медиа:mx96scripts.zip]]<br /> <br /> --[[Участник:DimOn|dimOn]]<br /> <br /> == HuaweiV300R006 ==<br /> [[Медиа:huaweiV300R006.zip]]<br /> <br /> Описание формата, пример лога: <br /> [[Медиа:hw300R006_Data.zip]]<br /> <br /> == M200 ==<br /> Тема на форуме: [http://forum.bgbilling.ru/viewtopic.php?f=25&amp;t=3675 Автоматизация загрузки логов из ATC М-200 в BGB]<br /> <br /> == Элком ==<br /> Скрипт обрабатывает первичные логи вида:<br /> &lt;pre&gt;<br /> TML1 | TML2 | Дата | Длит. |Тип| Вызывающий | Вызываемый |<br /> 003 : 051| 044 : 001| 13.11.2010 23:59:22 | 5 | 2 | 9875906090 | 2462526 |<br /> 071 : 062| 005 : 019| 13.11.2010 23:53:23 | 385 | 2 | 3472460202 | 89876087603 |<br /> 004 : 031| 044 : 001| 13.11.2010 23:59:31 | 23 | 2 | 2906090 | 2462526 |<br /> 001 : 023| 044 : 008| 13.11.2010 23:59:00 | 58 | 2 | 2906090 | 2462526 |<br /> 074 : 002| 078 : 060| 13.11.2010 23:58:33 | 92 | 2 | 4483 | 5558 |<br /> 004 : 018| 044 : 004| 13.11.2010 23:59:43 | 22 | 2 | 2906090 | 2462526 |<br /> 074 : 005| 064 : 008| 13.11.2010 23:59:50 | 17 | 2 | 3472900444 | 2636474 |<br /> 003 : 041| 044 : 006| 13.11.2010 23:59:49 | 17 | 2 | 2906090 | 2462526 |<br /> 077 : 025| 017 : 007| 13.11.2010 23:34:29 | 1538 | 2 | 3472460000 | 89174914375 |<br /> 074 : 006| 018 : 061| 13.11.2010 23:59:48 | 18 | 2 | 3472900444 | 89875971613 |<br /> &lt;/pre&gt;<br /> <br /> [[Медиа:Script_elcom_convert.zip]]<br /> <br /> == АТС Linea-UT фирмы Italtel ==<br /> Выгрузка данных о звонках со станции и конвертация.Более подробное описание станции приводится в файле ПО для АТС UT. Описание для установке настройке находится в файле manual.txt.<br /> [[Медиа:colit_v1.0.zip]]<br /> <br /> == Коллектор NGN ==<br /> Эта АТС современная и файлы выкладывает в бинарном формате на ftp.<br /> Скрипт умеет копировать новые файлы по мере их появления, преобразовывает в текст. Имеется настройка правил преобразования.<br /> Для предотвращения двойного запуска использовать flock.<br /> Описание формата в файле CDR format_Rus.doc. <br /> Конвертор для windows BillEn.exe.<br /> Использование виндовой конвертором так:<br /> Сначала выбирать тип ZXSS10 SS1 V2.0.0.5 SUN и только потом файл через Open file.<br /> Описание для установке настройке находится в файле manual.txt.<br /> [[Медиа:ngn.zip]]<br /> <br /> == HUAWEI - NGN SoftX Bill iGWB ==<br /> Эта АТС современная и файлы выкладывает в бинарном формате на ftp.<br /> Скрипт умеет копировать новые файлы по мере их появления с ftp. Преобразовываются в формат биллинга в соответствии с документацией. Имеется настройка правил преобразования.<br /> Для предотвращения двойного запуска использовать flock.<br /> Возможна полная автоматизация выгрузки с ftp, конвертации и загрузки в биллинг логов.<br /> Описание формата пример логов лежит в архиве.<br /> <br /> [[Медиа:HUAWEI_-_NGN_SoftX_Bill_iGWB_CDR_Format.zip‎]]<br /> <br /> <br /> == АТС MC240 и Цифровой шлюз SMG-1016M производства Элтекс ==<br /> [[Сопряжение BG-биллинга и Городской цифровой АТС MC240 и Цифрового шлюза SMG-1016M производства Элтекс]]<br /> <br /> == Почти универсальный конвертер логов для модуля phone ==<br /> Тема на форуме: [http://forum.bgbilling.ru/viewtopic.php?f=25&amp;t=5213 Почти универсальный конвертер логов для модуля phone]<br /> <br /> == MC240 ==<br /> Конвертер MC240. Написан на perl, обрабатывает csv-логи. Добавляет задачи на загрузку через сокет. Довольно гибко настраивается по путям итд. Правила обработки номеров внутри скрипта нужно будет подправить под себя.<br /> <br /> [[Медиа:ms240-dimon.zip]]<br /> <br /> convert.pl - запуск по всем логам, необработанным. convert_log.pl - обработка одного лога. common.pm - настройки, также там много комментариев.<br /> <br /> convert_log.pl: скрипт получает полный путь к исходному логу, конвертирует, раскладывает готовые логи по пути $DEST_PATH, внутри разбивая по источникам и далее по году-месяцу структурой как того требует bgbilling<br /> <br /> Формат имени лога ожидается такой: logYYYYMMDD.csv<br /> Дата на логе реально вчерашняя, т.е. ротация делается в 00:xx и в логе имя вчерашнее.<br /> В конце отправляется 24 команды на загрузку часовых логов.<br /> <br /> Ошибки конвертации номеров кладутся в файл bglogconverter.num.error.log<br /> <br /> Ошибки распознавания логов в файл bglogconverter.run.error.log<br /> <br /> <br /> --[[Участник:DimOn|dimOn]] 10:49, 26 октября 2015 (UTC)</div> DimOn http://wiki.bitel.ru/index.php/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%BE%D0%BD%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2 Примеры реализации конверторов логов 2015-10-26T11:45:52Z <p>DimOn:&#32;/* MC240 */</p> <hr /> <div>== Siemens EWSD ==<br /> Конвертер на perl из бинарного формата Siemens EWSD v12 в формат биллинга.<br /> <br /> ama.pl осуществляет конвертацию дневного лога в часовые. schedule.pl запускается cron-ом и проверяет директорию, указанную в файле conf на наличие логов и запускает ama.pl с указанием имени файла; файл после конвертирования переносится в папку ./done<br /> <br /> ama.pl после конвертирования выполняет data_loader.sh для добавления задачи на загрузку лога.<br /> Формат названия файла: AMA.yyMMdd.ama.<br /> <br /> [[Медиа:Phone_ama.zip]]<br /> <br /> == ISKRATEL si2000 ==<br /> Конвертер на perl из бинарного формата si2000 в формат биллинга.<br /> <br /> Это архив папки /home/ATS, в которой лежит несколько конвертеров (si2000, md100, mx96). <br /> <br /> Данный конвертер располагается в подпапке si2000. <br /> <br /> Файл convert_si2000.sh(в корне) запускается cron-ом и вызвает файл si2000/si2000_get_logs.pl . Тот работает следующим образом:<br /> <br /> 1. Анализируетет ftp-папку на начличие файлов *.ama и копирует их в папку source (то же бинарный файл, только уже без расшинения кладет как source/year/month/day/hour/log_xxxx).. В папке ftp лежат файлы вида i222220080821161532.ama(2008-год,08-месяц,21-число,16 -, 1532 - номер xxxx). Если такой файл уже есть в папке source, то он игнорируется. <br /> <br /> 2. Вызывает si2000/convert_log.pl, который конвертирует новые полученные файлы в формат биллинга(кладет файлы si2000/year/month/day_hour.zip) <br /> <br /> 3. Вызывает data_loader.sh для добавления задачи на загрузку логов<br /> <br /> пути к локальным и ftp-папке указаны в начале скриптов. <br /> <br /> Конвертер:<br /> <br /> [[Медиа:ATS.zip]]<br /> <br /> Описание формата:<br /> [[Медиа:FUN559000PCR150.PDF.zip]]<br /> <br /> <br /> Вот тут есть еще одна модификация этого конвертера(так как этот вариант не смог распарсить их ama-файлы). возможно , кому-то поможет:<br /> http://forum.bgbilling.ru/viewtopic.php?f=10&amp;t=3962<br /> <br /> <br /> 1) в конвертере найдена ошибка при считывании номера звонящего абонента.<br /> нужно заменить вот этот кусок в файле convert_log.pl<br /> &lt;source lang =&quot;perl&quot; &gt;<br /> my $lac = undef;<br /> my $spis_num = undef;<br /> <br /> my $bytes_lac_len = get_bytes_len( $lac_len );<br /> my $bytes_spis_num_len = get_bytes_len( $spis_num_len );<br /> <br /> if( $lac_len &gt; 0 )<br /> {<br /> read( FILE_IN, $data, $bytes_lac_len );<br /> $lac = get_bcd( $data, $lac_len );<br /> }<br /> if( $spis_num_len &gt; 0 )<br /> {<br /> read( FILE_IN, $data, $bytes_spis_num_len );<br /> $spis_num = get_bcd( $data, $spis_num_len );<br /> }<br /> <br /> my $var_len = $record_len - 16 - $bytes_lac_len - $bytes_spis_num_len;<br /> <br /> &lt;/source&gt;<br /> <br /> На вот этот <br /> &lt;source lang =&quot;perl&quot; &gt;<br /> my $lac = undef;<br /> my $bytes_lac_len = get_bytes_len( $lac_len );<br /> <br /> my $first_digit;<br /> if( $lac_len &gt; 0 )<br /> {<br /> read( FILE_IN, $data, $bytes_lac_len );<br /> $lac = get_bcd( $data, $lac_len );<br /> <br /> if ( $lac_len % 2 == 1 )<br /> {<br /> my $idx = $lac_len / 2;<br /> my $part = substr( $data, $idx, 1 );<br /> my @f = unpack( 'C', $part);<br /> $first_digit = $f[0]&amp;0b00001111;<br /> }<br /> }<br /> <br /> my $spis_num = '';<br /> <br /> my $bytes_summa = get_bytes_len( $lac_len + $spis_num_len );<br /> <br /> if( $spis_num_len &gt; 0 )<br /> {<br /> if ( $first_digit )<br /> {<br /> $spis_num_len--;<br /> $spis_num .= $first_digit;<br /> }<br /> <br /> my $bytes_spis_num_len = get_bytes_len( $spis_num_len );<br /> <br /> read( FILE_IN, $data, $bytes_spis_num_len );<br /> $spis_num .= get_bcd( $data, $spis_num_len );<br /> }<br /> <br /> my $var_len = $record_len - 16 - $bytes_summa;<br /> <br /> &lt;/source &gt;<br /> <br /> Суть исправления в том, что код города и номер считываются подряд . B случае если код города, например 88712(нечетный), а номер 222066, то номер считывался как 220660,так как первая 2-ка просто <br /> выбрасывалась, как остаток BCD-поля, что неверно.<br /> <br /> 2) В конвертере можно считывать порты с помощью замены вот этих строк<br /> <br /> <br /> &lt;source lang=&quot;perl&quot;&gt;<br /> # vhod tract<br /> elsif( $f[0] == 113 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> print &quot;113=&gt;$id\n&quot;;<br /> <br /> $result{113} = $id;<br /> $pos += 9;<br /> }<br /> # ishod tract<br /> elsif( $f[0] == 114 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> print &quot;114=&gt;$id\n&quot;;<br /> <br /> $result{114} = $id;<br /> $pos += 9;<br /> }<br /> <br /> &lt;/source&gt;<br /> на эти <br /> &lt;source lang=&quot;perl&quot;&gt;<br /> # vhod tract<br /> elsif( $f[0] == 113 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> #my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> #kanal(port)<br /> my $id = &quot;$id[0]&quot;;<br /> <br /> print &quot;113=&gt;$id\n&quot;;<br /> <br /> $result{113} = $id;<br /> $pos += 9;<br /> }<br /> # ishod tract<br /> elsif( $f[0] == 114 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> #my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> #kanal(port)<br /> my $id = &quot;$id[0]&quot;;<br /> <br /> <br /> print &quot;114=&gt;$id\n&quot;;<br /> <br /> $result{114} = $id;<br /> $pos += 9;<br /> }<br /> <br /> &lt;/source&gt;<br /> <br /> == ISKRATEL si3000 ==<br /> Есть только описание формата:<br /> [[Медиа:SI3000CDR.PDF.zip]]<br /> <br /> <br /> == Ericsson MD-110 ==<br /> Конвертер на perl из тексового формата Ericsson MD-110 в формат биллинга.<br /> <br /> Это архив папки /home/ATS, в которой лежит несколько конвертеров (si2000, md100, mx96). Данный конвертер располагается в подпапке md100. <br /> <br /> Чтение данных происходи с com-порта ATS. Для этого запускается скрипт md100/start_read_com.sh, который постоянно считавает данные в файл md100/log. <br /> <br /> Файл convert_md110.sh(в корне) запускается cron-ом и вызвает файл md110/md110_convert_hour.pl .. Тот работает так :<br /> <br /> 1. Вызывает скрипт md110/hour_log, который берет данные из файла md100/log, помещает его содержимое в папку source как лог очердного часа (в формате yyyy.mm.dd.hour.log) и очищает log . <br /> <br /> 2. Вызывает md110/convert_log, который конвертирует полученный лог в формат биллинга( кладет файл md110/year/month/day_hour.zip) <br /> <br /> 3. Вызывает data_loader.sh из папки биллинга для добавления задачи на загрузку лога<br /> <br /> пути указаны в начале скриптов. <br /> <br /> Конвертер<br /> [[Медиа:ATS.zip]]<br /> <br /> Примерный формат логов :<br /> &lt;source lang=&quot;bash&quot;&gt;<br /> MMDD HHMM duration number_from number_to port_to<br /> &lt;/source&gt;<br /> <br /> <br /> update: Для избежания зависания com-порта на порте должен был выдаваться сигнал о готовности принимать данные. Поэтому надо изменить файлик start_read_com.sh :<br /> stty -F /dev/ttyS0 ispeed 19200 cs7 clocal crtscts<br /> <br /> == mx96 ==<br /> <br /> В данном разделе речь идёт о неком устройстве '''mx96''' (Actionet_MX). Представленный конвертер знает о следующей ситуации. Имеется доступ по ftp к расшаренным исходным логам. Имена логов имеют вид '''ггммддNN.C35''', где, как несложно догадаться, &quot;гг&quot;, &quot;мм&quot; и &quot;дд&quot; - это день, месяц и год, а NN - номер файла в шестнадцатиричном виде, причём младший байт расположен слева. Номера файлов придуманы неспроста - при перегрузке считающего оборудования и прочих ситуация начинается вестись новый лог, с той же датой, но следующим номером.<br /> С наименованием разобрались, переходим к формату. Конвертер нацелен на работу со следующим форматом данных файла вызова:<br /> <br /> Первые 320 байт файла - заголовок, каждые следующие 123 байта (включая перевод строки и каретки) - отдельная запись вызова.<br /> <br /> Описание записи файла вызовов &quot;C&quot; тип 1 (Документация CLD DAXL 0159r стр.117):<br /> &lt;pre&gt; <br /> Поле Длина Формат Описание<br /> record number 6 nnnnnn 6-значный десятичный порядковый номер<br /> a_mx_nbr 2 nn Номер станции MX абонента А<br /> b_mx_nbr 2 nn Номер станции MX абонента Б<br /> date 8 yyyymmdd Дата начала вызова<br /> time 6 hhmmss Время начала вызова<br /> a_subnbr 10 nn..n Полный номер абонента А (выровненный по левому разряду с пробелами в конце)<br /> b_subnbr 20 nn..n Полный номер абонента Б (выровненный по левому разряду с пробелами в конце)<br /> a_int_type 2 nn Тип интерфейса абонента А: 00...08 определены, 09...99 зарезервированы<br /> b_int_type 2 nn Тип интерфейса абонента Б: 00...08 определены, 09...99 зарезервированы<br /> call_type 3 nnn Тип вызова: десятичное число от 00 до 34<br /> site_a 3 nnn Номер базовой станции абонента А<br /> channel_a 5 nnnnn Номер канала абонента А<br /> site_b 3 nnn Номер базовой станции абонента Б<br /> channel_b 5 nnnnn Номер канала абонента Б<br /> b_subs_q_time 5 nnnnn Время ожидания в очереди к абоненту Б (секунд)<br /> tc_wait_time 5 nnnnn Время ожидания канала связи (секунд)<br /> b_subs_answ_time 5 nnnnn Длительность подачи вызывного сигнала абоненту Б (секунд)<br /> call_duration 5 nnnnn Продолжительность вызова (секунд)<br /> release_mode 3 nnn Режим отбоя вызова (секунд)<br /> spec_func 3 nnn Специальные функции: от 0 до 5<br /> ch_pul_mode 3 nnn Режим тарифных импульсов<br /> ch_pulses 5 nnnnn Тарифные импульсы<br /> call_id 10 nn.n Идентификатор вызова (целое число)<br /> cr_lf 2 0D0A<br /> &lt;/pre&gt;<br /> Рассмотрим конкретный пример лога (первой строкой для наглядности дана маска по данным):<br /> &lt;pre&gt;<br /> NNNNNNAABBDDDDDDDDTTTTTTAAAAAAAAAABBBBBBBBBBBBBBBBBBBBAABBTTTSSSCCCCCSSSCCCCCTTTTTWWWWWTTTTTDDDDDRRRFFFPPPCCCCCIIIIIIIIII<br /> 1 35352008070900001570749 0063929 0 5 4 3 96255 71 0 0 9 9 0 0 0 0 889738557<br /> 2 35352008070823300870341 70355 0 0 4 0 92 0 19965535 0 18 1805 10 0 0 0 896423075<br /> 11 353520080708235902?255/8101?70336 5 0 4255 73 3 12265535 0 6 369 1 0 2 0 889673020<br /> 133 35352008070901172670431 0067481 0 5 4 3 122255 58 0 0 12 43 0 0 0 0 891835870<br /> &lt;/pre&gt;<br /> Имейте ввиду, что форматы разных версий устройства могут различаться (или, возможно, при этом они поддаются какой-либо настройке), так что необходимо править соответствующим образом главное регулярное выражение, производящее разбор.<br /> <br /> Теперь рассмотрим скрипты, составляющие конвертер. Первый из них, '''mx96_get_logs.pl''', основной. Он и выполняет самую рутинную работу - отслеживает не появилось ли на ftp несколько новых файлов, скачивает их в соответствующие локальные директории, разбитые по датам (&lt;рабочий каталог&gt;/source/&lt;год&gt;/&lt;месяц&gt;/&lt;день&gt;) и запускает конвертер форматов, '''convert_log.pl'''. Имейте ввиду - &quot;сегодняшние&quot; логи игнорируются, потому, что данные могут оказаться неполными не только за день, но и за час, что не вполне подходит к нашему случаю.<br /> <br /> Про второй скрипт, '''convert_log.pl''', надо сказать отдельно. Он принимает один параметр - путь к файлам логов. Так как у нас по пути находятся несколько почасовых файлов (от нуля до 1, 2 и более для каждого часа), то становится ясно - конвертируются логи за сутки. Скрипт сам понимает, какой именно лог и по какой дате составлять, исходные пути подсказывают ему это.<br /> <br /> Стоит обратить внимание на то, что все логи, уже скачанные, игнорируются. То есть для переобсчёта надо удалить соответствующие скачанные логи из папки source и перезапустить конвертер (или потерпеть до автоматического перезапуска) - все новые логи будут скачены, разложены по папкам и должным образом обработаны.<br /> <br /> Запуск скрипта производится как обычно:&lt;pre&gt;<br /> nohup mx96_get_logs.pl &gt;&gt; convert.out 2&gt;&amp;1 &amp;<br /> &lt;/pre&gt;<br /> Для автоматизации настраивается crontab (в скрипте convert_mx96.sh содержится похожая на приведённую выше строка запуска)<br /> <br /> Файл crontab:&lt;pre&gt;<br /> SHELL=/bin/sh<br /> # convert<br /> 10 0 * * * /home/ATS/convert_mx96.sh<br /> &lt;/pre&gt;<br /> [[Медиа:mx96scripts.zip]]<br /> <br /> --[[Участник:DimOn|dimOn]]<br /> <br /> == HuaweiV300R006 ==<br /> [[Медиа:huaweiV300R006.zip]]<br /> <br /> Описание формата, пример лога: <br /> [[Медиа:hw300R006_Data.zip]]<br /> <br /> == M200 ==<br /> Тема на форуме: [http://forum.bgbilling.ru/viewtopic.php?f=25&amp;t=3675 Автоматизация загрузки логов из ATC М-200 в BGB]<br /> <br /> == Элком ==<br /> Скрипт обрабатывает первичные логи вида:<br /> &lt;pre&gt;<br /> TML1 | TML2 | Дата | Длит. |Тип| Вызывающий | Вызываемый |<br /> 003 : 051| 044 : 001| 13.11.2010 23:59:22 | 5 | 2 | 9875906090 | 2462526 |<br /> 071 : 062| 005 : 019| 13.11.2010 23:53:23 | 385 | 2 | 3472460202 | 89876087603 |<br /> 004 : 031| 044 : 001| 13.11.2010 23:59:31 | 23 | 2 | 2906090 | 2462526 |<br /> 001 : 023| 044 : 008| 13.11.2010 23:59:00 | 58 | 2 | 2906090 | 2462526 |<br /> 074 : 002| 078 : 060| 13.11.2010 23:58:33 | 92 | 2 | 4483 | 5558 |<br /> 004 : 018| 044 : 004| 13.11.2010 23:59:43 | 22 | 2 | 2906090 | 2462526 |<br /> 074 : 005| 064 : 008| 13.11.2010 23:59:50 | 17 | 2 | 3472900444 | 2636474 |<br /> 003 : 041| 044 : 006| 13.11.2010 23:59:49 | 17 | 2 | 2906090 | 2462526 |<br /> 077 : 025| 017 : 007| 13.11.2010 23:34:29 | 1538 | 2 | 3472460000 | 89174914375 |<br /> 074 : 006| 018 : 061| 13.11.2010 23:59:48 | 18 | 2 | 3472900444 | 89875971613 |<br /> &lt;/pre&gt;<br /> <br /> [[Медиа:Script_elcom_convert.zip]]<br /> <br /> == АТС Linea-UT фирмы Italtel ==<br /> Выгрузка данных о звонках со станции и конвертация.Более подробное описание станции приводится в файле ПО для АТС UT. Описание для установке настройке находится в файле manual.txt.<br /> [[Медиа:colit_v1.0.zip]]<br /> <br /> == Коллектор NGN ==<br /> Эта АТС современная и файлы выкладывает в бинарном формате на ftp.<br /> Скрипт умеет копировать новые файлы по мере их появления, преобразовывает в текст. Имеется настройка правил преобразования.<br /> Для предотвращения двойного запуска использовать flock.<br /> Описание формата в файле CDR format_Rus.doc. <br /> Конвертор для windows BillEn.exe.<br /> Использование виндовой конвертором так:<br /> Сначала выбирать тип ZXSS10 SS1 V2.0.0.5 SUN и только потом файл через Open file.<br /> Описание для установке настройке находится в файле manual.txt.<br /> [[Медиа:ngn.zip]]<br /> <br /> == HUAWEI - NGN SoftX Bill iGWB ==<br /> Эта АТС современная и файлы выкладывает в бинарном формате на ftp.<br /> Скрипт умеет копировать новые файлы по мере их появления с ftp. Преобразовываются в формат биллинга в соответствии с документацией. Имеется настройка правил преобразования.<br /> Для предотвращения двойного запуска использовать flock.<br /> Возможна полная автоматизация выгрузки с ftp, конвертации и загрузки в биллинг логов.<br /> Описание формата пример логов лежит в архиве.<br /> <br /> [[Медиа:HUAWEI_-_NGN_SoftX_Bill_iGWB_CDR_Format.zip‎]]<br /> <br /> <br /> == АТС MC240 и Цифровой шлюз SMG-1016M производства Элтекс ==<br /> [[Сопряжение BG-биллинга и Городской цифровой АТС MC240 и Цифрового шлюза SMG-1016M производства Элтекс]]<br /> <br /> == Почти универсальный конвертер логов для модуля phone ==<br /> Тема на форуме: [http://forum.bgbilling.ru/viewtopic.php?f=25&amp;t=5213 Почти универсальный конвертер логов для модуля phone]<br /> <br /> == MC240 ==<br /> Конвертер MC240. Написан на perl, обрабатывает csv-логи. Добавляет задачи на загрузку через сокет. Довольно гибко настраивается по путям итд. Правила обработки номеров внутри скрипта нужно будет подправить под себя.<br /> <br /> [[Медиа:ms240-dimon.zip]]<br /> <br /> convert.pl - запуск по всем логам, необработанным. convert_log.pl - обработка одного лога. common.pm - настройки, также там много комментариев.<br /> <br /> convert_log.pl: скрипт получает полный путь к исходному логу, конвертирует, раскладывает готовые логи по пути $DEST_PATH, внутри разбивая по источникам и далее по году-месяцу структурой как того требует bgbilling<br /> <br /> формат имени лога ожидается такой: logYYYYMMDD.csv<br /> дата на логе реально вчерашняя, т.е. ротация делается в 00:xx и в логе имя вчерашнее<br /> в конце отправляется 24 команды на загрузку часовых логов<br /> ошибки конвертации номеров кладутся в файл bglogconverter.num.error.log<br /> ошибки распознавания логов в файл bglogconverter.run.error.log<br /> <br /> <br /> --[[Участник:DimOn|dimOn]] 10:49, 26 октября 2015 (UTC)</div> DimOn http://wiki.bitel.ru/index.php/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%BE%D0%BD%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2 Примеры реализации конверторов логов 2015-10-26T11:01:05Z <p>DimOn:&#32;/* MC240 */</p> <hr /> <div>== Siemens EWSD ==<br /> Конвертер на perl из бинарного формата Siemens EWSD v12 в формат биллинга.<br /> <br /> ama.pl осуществляет конвертацию дневного лога в часовые. schedule.pl запускается cron-ом и проверяет директорию, указанную в файле conf на наличие логов и запускает ama.pl с указанием имени файла; файл после конвертирования переносится в папку ./done<br /> <br /> ama.pl после конвертирования выполняет data_loader.sh для добавления задачи на загрузку лога.<br /> Формат названия файла: AMA.yyMMdd.ama.<br /> <br /> [[Медиа:Phone_ama.zip]]<br /> <br /> == ISKRATEL si2000 ==<br /> Конвертер на perl из бинарного формата si2000 в формат биллинга.<br /> <br /> Это архив папки /home/ATS, в которой лежит несколько конвертеров (si2000, md100, mx96). <br /> <br /> Данный конвертер располагается в подпапке si2000. <br /> <br /> Файл convert_si2000.sh(в корне) запускается cron-ом и вызвает файл si2000/si2000_get_logs.pl . Тот работает следующим образом:<br /> <br /> 1. Анализируетет ftp-папку на начличие файлов *.ama и копирует их в папку source (то же бинарный файл, только уже без расшинения кладет как source/year/month/day/hour/log_xxxx).. В папке ftp лежат файлы вида i222220080821161532.ama(2008-год,08-месяц,21-число,16 -, 1532 - номер xxxx). Если такой файл уже есть в папке source, то он игнорируется. <br /> <br /> 2. Вызывает si2000/convert_log.pl, который конвертирует новые полученные файлы в формат биллинга(кладет файлы si2000/year/month/day_hour.zip) <br /> <br /> 3. Вызывает data_loader.sh для добавления задачи на загрузку логов<br /> <br /> пути к локальным и ftp-папке указаны в начале скриптов. <br /> <br /> Конвертер:<br /> <br /> [[Медиа:ATS.zip]]<br /> <br /> Описание формата:<br /> [[Медиа:FUN559000PCR150.PDF.zip]]<br /> <br /> <br /> Вот тут есть еще одна модификация этого конвертера(так как этот вариант не смог распарсить их ama-файлы). возможно , кому-то поможет:<br /> http://forum.bgbilling.ru/viewtopic.php?f=10&amp;t=3962<br /> <br /> <br /> 1) в конвертере найдена ошибка при считывании номера звонящего абонента.<br /> нужно заменить вот этот кусок в файле convert_log.pl<br /> &lt;source lang =&quot;perl&quot; &gt;<br /> my $lac = undef;<br /> my $spis_num = undef;<br /> <br /> my $bytes_lac_len = get_bytes_len( $lac_len );<br /> my $bytes_spis_num_len = get_bytes_len( $spis_num_len );<br /> <br /> if( $lac_len &gt; 0 )<br /> {<br /> read( FILE_IN, $data, $bytes_lac_len );<br /> $lac = get_bcd( $data, $lac_len );<br /> }<br /> if( $spis_num_len &gt; 0 )<br /> {<br /> read( FILE_IN, $data, $bytes_spis_num_len );<br /> $spis_num = get_bcd( $data, $spis_num_len );<br /> }<br /> <br /> my $var_len = $record_len - 16 - $bytes_lac_len - $bytes_spis_num_len;<br /> <br /> &lt;/source&gt;<br /> <br /> На вот этот <br /> &lt;source lang =&quot;perl&quot; &gt;<br /> my $lac = undef;<br /> my $bytes_lac_len = get_bytes_len( $lac_len );<br /> <br /> my $first_digit;<br /> if( $lac_len &gt; 0 )<br /> {<br /> read( FILE_IN, $data, $bytes_lac_len );<br /> $lac = get_bcd( $data, $lac_len );<br /> <br /> if ( $lac_len % 2 == 1 )<br /> {<br /> my $idx = $lac_len / 2;<br /> my $part = substr( $data, $idx, 1 );<br /> my @f = unpack( 'C', $part);<br /> $first_digit = $f[0]&amp;0b00001111;<br /> }<br /> }<br /> <br /> my $spis_num = '';<br /> <br /> my $bytes_summa = get_bytes_len( $lac_len + $spis_num_len );<br /> <br /> if( $spis_num_len &gt; 0 )<br /> {<br /> if ( $first_digit )<br /> {<br /> $spis_num_len--;<br /> $spis_num .= $first_digit;<br /> }<br /> <br /> my $bytes_spis_num_len = get_bytes_len( $spis_num_len );<br /> <br /> read( FILE_IN, $data, $bytes_spis_num_len );<br /> $spis_num .= get_bcd( $data, $spis_num_len );<br /> }<br /> <br /> my $var_len = $record_len - 16 - $bytes_summa;<br /> <br /> &lt;/source &gt;<br /> <br /> Суть исправления в том, что код города и номер считываются подряд . B случае если код города, например 88712(нечетный), а номер 222066, то номер считывался как 220660,так как первая 2-ка просто <br /> выбрасывалась, как остаток BCD-поля, что неверно.<br /> <br /> 2) В конвертере можно считывать порты с помощью замены вот этих строк<br /> <br /> <br /> &lt;source lang=&quot;perl&quot;&gt;<br /> # vhod tract<br /> elsif( $f[0] == 113 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> print &quot;113=&gt;$id\n&quot;;<br /> <br /> $result{113} = $id;<br /> $pos += 9;<br /> }<br /> # ishod tract<br /> elsif( $f[0] == 114 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> print &quot;114=&gt;$id\n&quot;;<br /> <br /> $result{114} = $id;<br /> $pos += 9;<br /> }<br /> <br /> &lt;/source&gt;<br /> на эти <br /> &lt;source lang=&quot;perl&quot;&gt;<br /> # vhod tract<br /> elsif( $f[0] == 113 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> #my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> #kanal(port)<br /> my $id = &quot;$id[0]&quot;;<br /> <br /> print &quot;113=&gt;$id\n&quot;;<br /> <br /> $result{113} = $id;<br /> $pos += 9;<br /> }<br /> # ishod tract<br /> elsif( $f[0] == 114 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> #my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> #kanal(port)<br /> my $id = &quot;$id[0]&quot;;<br /> <br /> <br /> print &quot;114=&gt;$id\n&quot;;<br /> <br /> $result{114} = $id;<br /> $pos += 9;<br /> }<br /> <br /> &lt;/source&gt;<br /> <br /> == ISKRATEL si3000 ==<br /> Есть только описание формата:<br /> [[Медиа:SI3000CDR.PDF.zip]]<br /> <br /> <br /> == Ericsson MD-110 ==<br /> Конвертер на perl из тексового формата Ericsson MD-110 в формат биллинга.<br /> <br /> Это архив папки /home/ATS, в которой лежит несколько конвертеров (si2000, md100, mx96). Данный конвертер располагается в подпапке md100. <br /> <br /> Чтение данных происходи с com-порта ATS. Для этого запускается скрипт md100/start_read_com.sh, который постоянно считавает данные в файл md100/log. <br /> <br /> Файл convert_md110.sh(в корне) запускается cron-ом и вызвает файл md110/md110_convert_hour.pl .. Тот работает так :<br /> <br /> 1. Вызывает скрипт md110/hour_log, который берет данные из файла md100/log, помещает его содержимое в папку source как лог очердного часа (в формате yyyy.mm.dd.hour.log) и очищает log . <br /> <br /> 2. Вызывает md110/convert_log, который конвертирует полученный лог в формат биллинга( кладет файл md110/year/month/day_hour.zip) <br /> <br /> 3. Вызывает data_loader.sh из папки биллинга для добавления задачи на загрузку лога<br /> <br /> пути указаны в начале скриптов. <br /> <br /> Конвертер<br /> [[Медиа:ATS.zip]]<br /> <br /> Примерный формат логов :<br /> &lt;source lang=&quot;bash&quot;&gt;<br /> MMDD HHMM duration number_from number_to port_to<br /> &lt;/source&gt;<br /> <br /> <br /> update: Для избежания зависания com-порта на порте должен был выдаваться сигнал о готовности принимать данные. Поэтому надо изменить файлик start_read_com.sh :<br /> stty -F /dev/ttyS0 ispeed 19200 cs7 clocal crtscts<br /> <br /> == mx96 ==<br /> <br /> В данном разделе речь идёт о неком устройстве '''mx96''' (Actionet_MX). Представленный конвертер знает о следующей ситуации. Имеется доступ по ftp к расшаренным исходным логам. Имена логов имеют вид '''ггммддNN.C35''', где, как несложно догадаться, &quot;гг&quot;, &quot;мм&quot; и &quot;дд&quot; - это день, месяц и год, а NN - номер файла в шестнадцатиричном виде, причём младший байт расположен слева. Номера файлов придуманы неспроста - при перегрузке считающего оборудования и прочих ситуация начинается вестись новый лог, с той же датой, но следующим номером.<br /> С наименованием разобрались, переходим к формату. Конвертер нацелен на работу со следующим форматом данных файла вызова:<br /> <br /> Первые 320 байт файла - заголовок, каждые следующие 123 байта (включая перевод строки и каретки) - отдельная запись вызова.<br /> <br /> Описание записи файла вызовов &quot;C&quot; тип 1 (Документация CLD DAXL 0159r стр.117):<br /> &lt;pre&gt; <br /> Поле Длина Формат Описание<br /> record number 6 nnnnnn 6-значный десятичный порядковый номер<br /> a_mx_nbr 2 nn Номер станции MX абонента А<br /> b_mx_nbr 2 nn Номер станции MX абонента Б<br /> date 8 yyyymmdd Дата начала вызова<br /> time 6 hhmmss Время начала вызова<br /> a_subnbr 10 nn..n Полный номер абонента А (выровненный по левому разряду с пробелами в конце)<br /> b_subnbr 20 nn..n Полный номер абонента Б (выровненный по левому разряду с пробелами в конце)<br /> a_int_type 2 nn Тип интерфейса абонента А: 00...08 определены, 09...99 зарезервированы<br /> b_int_type 2 nn Тип интерфейса абонента Б: 00...08 определены, 09...99 зарезервированы<br /> call_type 3 nnn Тип вызова: десятичное число от 00 до 34<br /> site_a 3 nnn Номер базовой станции абонента А<br /> channel_a 5 nnnnn Номер канала абонента А<br /> site_b 3 nnn Номер базовой станции абонента Б<br /> channel_b 5 nnnnn Номер канала абонента Б<br /> b_subs_q_time 5 nnnnn Время ожидания в очереди к абоненту Б (секунд)<br /> tc_wait_time 5 nnnnn Время ожидания канала связи (секунд)<br /> b_subs_answ_time 5 nnnnn Длительность подачи вызывного сигнала абоненту Б (секунд)<br /> call_duration 5 nnnnn Продолжительность вызова (секунд)<br /> release_mode 3 nnn Режим отбоя вызова (секунд)<br /> spec_func 3 nnn Специальные функции: от 0 до 5<br /> ch_pul_mode 3 nnn Режим тарифных импульсов<br /> ch_pulses 5 nnnnn Тарифные импульсы<br /> call_id 10 nn.n Идентификатор вызова (целое число)<br /> cr_lf 2 0D0A<br /> &lt;/pre&gt;<br /> Рассмотрим конкретный пример лога (первой строкой для наглядности дана маска по данным):<br /> &lt;pre&gt;<br /> NNNNNNAABBDDDDDDDDTTTTTTAAAAAAAAAABBBBBBBBBBBBBBBBBBBBAABBTTTSSSCCCCCSSSCCCCCTTTTTWWWWWTTTTTDDDDDRRRFFFPPPCCCCCIIIIIIIIII<br /> 1 35352008070900001570749 0063929 0 5 4 3 96255 71 0 0 9 9 0 0 0 0 889738557<br /> 2 35352008070823300870341 70355 0 0 4 0 92 0 19965535 0 18 1805 10 0 0 0 896423075<br /> 11 353520080708235902?255/8101?70336 5 0 4255 73 3 12265535 0 6 369 1 0 2 0 889673020<br /> 133 35352008070901172670431 0067481 0 5 4 3 122255 58 0 0 12 43 0 0 0 0 891835870<br /> &lt;/pre&gt;<br /> Имейте ввиду, что форматы разных версий устройства могут различаться (или, возможно, при этом они поддаются какой-либо настройке), так что необходимо править соответствующим образом главное регулярное выражение, производящее разбор.<br /> <br /> Теперь рассмотрим скрипты, составляющие конвертер. Первый из них, '''mx96_get_logs.pl''', основной. Он и выполняет самую рутинную работу - отслеживает не появилось ли на ftp несколько новых файлов, скачивает их в соответствующие локальные директории, разбитые по датам (&lt;рабочий каталог&gt;/source/&lt;год&gt;/&lt;месяц&gt;/&lt;день&gt;) и запускает конвертер форматов, '''convert_log.pl'''. Имейте ввиду - &quot;сегодняшние&quot; логи игнорируются, потому, что данные могут оказаться неполными не только за день, но и за час, что не вполне подходит к нашему случаю.<br /> <br /> Про второй скрипт, '''convert_log.pl''', надо сказать отдельно. Он принимает один параметр - путь к файлам логов. Так как у нас по пути находятся несколько почасовых файлов (от нуля до 1, 2 и более для каждого часа), то становится ясно - конвертируются логи за сутки. Скрипт сам понимает, какой именно лог и по какой дате составлять, исходные пути подсказывают ему это.<br /> <br /> Стоит обратить внимание на то, что все логи, уже скачанные, игнорируются. То есть для переобсчёта надо удалить соответствующие скачанные логи из папки source и перезапустить конвертер (или потерпеть до автоматического перезапуска) - все новые логи будут скачены, разложены по папкам и должным образом обработаны.<br /> <br /> Запуск скрипта производится как обычно:&lt;pre&gt;<br /> nohup mx96_get_logs.pl &gt;&gt; convert.out 2&gt;&amp;1 &amp;<br /> &lt;/pre&gt;<br /> Для автоматизации настраивается crontab (в скрипте convert_mx96.sh содержится похожая на приведённую выше строка запуска)<br /> <br /> Файл crontab:&lt;pre&gt;<br /> SHELL=/bin/sh<br /> # convert<br /> 10 0 * * * /home/ATS/convert_mx96.sh<br /> &lt;/pre&gt;<br /> [[Медиа:mx96scripts.zip]]<br /> <br /> --[[Участник:DimOn|dimOn]]<br /> <br /> == HuaweiV300R006 ==<br /> [[Медиа:huaweiV300R006.zip]]<br /> <br /> Описание формата, пример лога: <br /> [[Медиа:hw300R006_Data.zip]]<br /> <br /> == M200 ==<br /> Тема на форуме: [http://forum.bgbilling.ru/viewtopic.php?f=25&amp;t=3675 Автоматизация загрузки логов из ATC М-200 в BGB]<br /> <br /> == Элком ==<br /> Скрипт обрабатывает первичные логи вида:<br /> &lt;pre&gt;<br /> TML1 | TML2 | Дата | Длит. |Тип| Вызывающий | Вызываемый |<br /> 003 : 051| 044 : 001| 13.11.2010 23:59:22 | 5 | 2 | 9875906090 | 2462526 |<br /> 071 : 062| 005 : 019| 13.11.2010 23:53:23 | 385 | 2 | 3472460202 | 89876087603 |<br /> 004 : 031| 044 : 001| 13.11.2010 23:59:31 | 23 | 2 | 2906090 | 2462526 |<br /> 001 : 023| 044 : 008| 13.11.2010 23:59:00 | 58 | 2 | 2906090 | 2462526 |<br /> 074 : 002| 078 : 060| 13.11.2010 23:58:33 | 92 | 2 | 4483 | 5558 |<br /> 004 : 018| 044 : 004| 13.11.2010 23:59:43 | 22 | 2 | 2906090 | 2462526 |<br /> 074 : 005| 064 : 008| 13.11.2010 23:59:50 | 17 | 2 | 3472900444 | 2636474 |<br /> 003 : 041| 044 : 006| 13.11.2010 23:59:49 | 17 | 2 | 2906090 | 2462526 |<br /> 077 : 025| 017 : 007| 13.11.2010 23:34:29 | 1538 | 2 | 3472460000 | 89174914375 |<br /> 074 : 006| 018 : 061| 13.11.2010 23:59:48 | 18 | 2 | 3472900444 | 89875971613 |<br /> &lt;/pre&gt;<br /> <br /> [[Медиа:Script_elcom_convert.zip]]<br /> <br /> == АТС Linea-UT фирмы Italtel ==<br /> Выгрузка данных о звонках со станции и конвертация.Более подробное описание станции приводится в файле ПО для АТС UT. Описание для установке настройке находится в файле manual.txt.<br /> [[Медиа:colit_v1.0.zip]]<br /> <br /> == Коллектор NGN ==<br /> Эта АТС современная и файлы выкладывает в бинарном формате на ftp.<br /> Скрипт умеет копировать новые файлы по мере их появления, преобразовывает в текст. Имеется настройка правил преобразования.<br /> Для предотвращения двойного запуска использовать flock.<br /> Описание формата в файле CDR format_Rus.doc. <br /> Конвертор для windows BillEn.exe.<br /> Использование виндовой конвертором так:<br /> Сначала выбирать тип ZXSS10 SS1 V2.0.0.5 SUN и только потом файл через Open file.<br /> Описание для установке настройке находится в файле manual.txt.<br /> [[Медиа:ngn.zip]]<br /> <br /> == HUAWEI - NGN SoftX Bill iGWB ==<br /> Эта АТС современная и файлы выкладывает в бинарном формате на ftp.<br /> Скрипт умеет копировать новые файлы по мере их появления с ftp. Преобразовываются в формат биллинга в соответствии с документацией. Имеется настройка правил преобразования.<br /> Для предотвращения двойного запуска использовать flock.<br /> Возможна полная автоматизация выгрузки с ftp, конвертации и загрузки в биллинг логов.<br /> Описание формата пример логов лежит в архиве.<br /> <br /> [[Медиа:HUAWEI_-_NGN_SoftX_Bill_iGWB_CDR_Format.zip‎]]<br /> <br /> <br /> == АТС MC240 и Цифровой шлюз SMG-1016M производства Элтекс ==<br /> [[Сопряжение BG-биллинга и Городской цифровой АТС MC240 и Цифрового шлюза SMG-1016M производства Элтекс]]<br /> <br /> == Почти универсальный конвертер логов для модуля phone ==<br /> Тема на форуме: [http://forum.bgbilling.ru/viewtopic.php?f=25&amp;t=5213 Почти универсальный конвертер логов для модуля phone]<br /> <br /> == MC240 ==<br /> Конвертер MC240. Написан на perl, обрабатывает csv-логи. Добавляет задачи на загрузку через сокет. Довольно гибко настраивается по путям итд. Правила обработки номеров внутри скрипта нужно будет подправить под себя.<br /> <br /> [[Медиа:ms240-dimon.zip]]<br /> <br /> --[[Участник:DimOn|dimOn]] 10:49, 26 октября 2015 (UTC)</div> DimOn http://wiki.bitel.ru/index.php/%D0%A4%D0%B0%D0%B9%D0%BB:Ms240-dimon.zip Файл:Ms240-dimon.zip 2015-10-26T11:00:29Z <p>DimOn:&#32;конвертер МС240</p> <hr /> <div>конвертер МС240</div> DimOn http://wiki.bitel.ru/index.php/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%BE%D0%BD%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2 Примеры реализации конверторов логов 2015-10-26T10:49:49Z <p>DimOn:&#32;/* MC240 */</p> <hr /> <div>== Siemens EWSD ==<br /> Конвертер на perl из бинарного формата Siemens EWSD v12 в формат биллинга.<br /> <br /> ama.pl осуществляет конвертацию дневного лога в часовые. schedule.pl запускается cron-ом и проверяет директорию, указанную в файле conf на наличие логов и запускает ama.pl с указанием имени файла; файл после конвертирования переносится в папку ./done<br /> <br /> ama.pl после конвертирования выполняет data_loader.sh для добавления задачи на загрузку лога.<br /> Формат названия файла: AMA.yyMMdd.ama.<br /> <br /> [[Медиа:Phone_ama.zip]]<br /> <br /> == ISKRATEL si2000 ==<br /> Конвертер на perl из бинарного формата si2000 в формат биллинга.<br /> <br /> Это архив папки /home/ATS, в которой лежит несколько конвертеров (si2000, md100, mx96). <br /> <br /> Данный конвертер располагается в подпапке si2000. <br /> <br /> Файл convert_si2000.sh(в корне) запускается cron-ом и вызвает файл si2000/si2000_get_logs.pl . Тот работает следующим образом:<br /> <br /> 1. Анализируетет ftp-папку на начличие файлов *.ama и копирует их в папку source (то же бинарный файл, только уже без расшинения кладет как source/year/month/day/hour/log_xxxx).. В папке ftp лежат файлы вида i222220080821161532.ama(2008-год,08-месяц,21-число,16 -, 1532 - номер xxxx). Если такой файл уже есть в папке source, то он игнорируется. <br /> <br /> 2. Вызывает si2000/convert_log.pl, который конвертирует новые полученные файлы в формат биллинга(кладет файлы si2000/year/month/day_hour.zip) <br /> <br /> 3. Вызывает data_loader.sh для добавления задачи на загрузку логов<br /> <br /> пути к локальным и ftp-папке указаны в начале скриптов. <br /> <br /> Конвертер:<br /> <br /> [[Медиа:ATS.zip]]<br /> <br /> Описание формата:<br /> [[Медиа:FUN559000PCR150.PDF.zip]]<br /> <br /> <br /> Вот тут есть еще одна модификация этого конвертера(так как этот вариант не смог распарсить их ama-файлы). возможно , кому-то поможет:<br /> http://forum.bgbilling.ru/viewtopic.php?f=10&amp;t=3962<br /> <br /> <br /> 1) в конвертере найдена ошибка при считывании номера звонящего абонента.<br /> нужно заменить вот этот кусок в файле convert_log.pl<br /> &lt;source lang =&quot;perl&quot; &gt;<br /> my $lac = undef;<br /> my $spis_num = undef;<br /> <br /> my $bytes_lac_len = get_bytes_len( $lac_len );<br /> my $bytes_spis_num_len = get_bytes_len( $spis_num_len );<br /> <br /> if( $lac_len &gt; 0 )<br /> {<br /> read( FILE_IN, $data, $bytes_lac_len );<br /> $lac = get_bcd( $data, $lac_len );<br /> }<br /> if( $spis_num_len &gt; 0 )<br /> {<br /> read( FILE_IN, $data, $bytes_spis_num_len );<br /> $spis_num = get_bcd( $data, $spis_num_len );<br /> }<br /> <br /> my $var_len = $record_len - 16 - $bytes_lac_len - $bytes_spis_num_len;<br /> <br /> &lt;/source&gt;<br /> <br /> На вот этот <br /> &lt;source lang =&quot;perl&quot; &gt;<br /> my $lac = undef;<br /> my $bytes_lac_len = get_bytes_len( $lac_len );<br /> <br /> my $first_digit;<br /> if( $lac_len &gt; 0 )<br /> {<br /> read( FILE_IN, $data, $bytes_lac_len );<br /> $lac = get_bcd( $data, $lac_len );<br /> <br /> if ( $lac_len % 2 == 1 )<br /> {<br /> my $idx = $lac_len / 2;<br /> my $part = substr( $data, $idx, 1 );<br /> my @f = unpack( 'C', $part);<br /> $first_digit = $f[0]&amp;0b00001111;<br /> }<br /> }<br /> <br /> my $spis_num = '';<br /> <br /> my $bytes_summa = get_bytes_len( $lac_len + $spis_num_len );<br /> <br /> if( $spis_num_len &gt; 0 )<br /> {<br /> if ( $first_digit )<br /> {<br /> $spis_num_len--;<br /> $spis_num .= $first_digit;<br /> }<br /> <br /> my $bytes_spis_num_len = get_bytes_len( $spis_num_len );<br /> <br /> read( FILE_IN, $data, $bytes_spis_num_len );<br /> $spis_num .= get_bcd( $data, $spis_num_len );<br /> }<br /> <br /> my $var_len = $record_len - 16 - $bytes_summa;<br /> <br /> &lt;/source &gt;<br /> <br /> Суть исправления в том, что код города и номер считываются подряд . B случае если код города, например 88712(нечетный), а номер 222066, то номер считывался как 220660,так как первая 2-ка просто <br /> выбрасывалась, как остаток BCD-поля, что неверно.<br /> <br /> 2) В конвертере можно считывать порты с помощью замены вот этих строк<br /> <br /> <br /> &lt;source lang=&quot;perl&quot;&gt;<br /> # vhod tract<br /> elsif( $f[0] == 113 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> print &quot;113=&gt;$id\n&quot;;<br /> <br /> $result{113} = $id;<br /> $pos += 9;<br /> }<br /> # ishod tract<br /> elsif( $f[0] == 114 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> print &quot;114=&gt;$id\n&quot;;<br /> <br /> $result{114} = $id;<br /> $pos += 9;<br /> }<br /> <br /> &lt;/source&gt;<br /> на эти <br /> &lt;source lang=&quot;perl&quot;&gt;<br /> # vhod tract<br /> elsif( $f[0] == 113 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> #my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> #kanal(port)<br /> my $id = &quot;$id[0]&quot;;<br /> <br /> print &quot;113=&gt;$id\n&quot;;<br /> <br /> $result{113} = $id;<br /> $pos += 9;<br /> }<br /> # ishod tract<br /> elsif( $f[0] == 114 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> #my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> #kanal(port)<br /> my $id = &quot;$id[0]&quot;;<br /> <br /> <br /> print &quot;114=&gt;$id\n&quot;;<br /> <br /> $result{114} = $id;<br /> $pos += 9;<br /> }<br /> <br /> &lt;/source&gt;<br /> <br /> == ISKRATEL si3000 ==<br /> Есть только описание формата:<br /> [[Медиа:SI3000CDR.PDF.zip]]<br /> <br /> <br /> == Ericsson MD-110 ==<br /> Конвертер на perl из тексового формата Ericsson MD-110 в формат биллинга.<br /> <br /> Это архив папки /home/ATS, в которой лежит несколько конвертеров (si2000, md100, mx96). Данный конвертер располагается в подпапке md100. <br /> <br /> Чтение данных происходи с com-порта ATS. Для этого запускается скрипт md100/start_read_com.sh, который постоянно считавает данные в файл md100/log. <br /> <br /> Файл convert_md110.sh(в корне) запускается cron-ом и вызвает файл md110/md110_convert_hour.pl .. Тот работает так :<br /> <br /> 1. Вызывает скрипт md110/hour_log, который берет данные из файла md100/log, помещает его содержимое в папку source как лог очердного часа (в формате yyyy.mm.dd.hour.log) и очищает log . <br /> <br /> 2. Вызывает md110/convert_log, который конвертирует полученный лог в формат биллинга( кладет файл md110/year/month/day_hour.zip) <br /> <br /> 3. Вызывает data_loader.sh из папки биллинга для добавления задачи на загрузку лога<br /> <br /> пути указаны в начале скриптов. <br /> <br /> Конвертер<br /> [[Медиа:ATS.zip]]<br /> <br /> Примерный формат логов :<br /> &lt;source lang=&quot;bash&quot;&gt;<br /> MMDD HHMM duration number_from number_to port_to<br /> &lt;/source&gt;<br /> <br /> <br /> update: Для избежания зависания com-порта на порте должен был выдаваться сигнал о готовности принимать данные. Поэтому надо изменить файлик start_read_com.sh :<br /> stty -F /dev/ttyS0 ispeed 19200 cs7 clocal crtscts<br /> <br /> == mx96 ==<br /> <br /> В данном разделе речь идёт о неком устройстве '''mx96''' (Actionet_MX). Представленный конвертер знает о следующей ситуации. Имеется доступ по ftp к расшаренным исходным логам. Имена логов имеют вид '''ггммддNN.C35''', где, как несложно догадаться, &quot;гг&quot;, &quot;мм&quot; и &quot;дд&quot; - это день, месяц и год, а NN - номер файла в шестнадцатиричном виде, причём младший байт расположен слева. Номера файлов придуманы неспроста - при перегрузке считающего оборудования и прочих ситуация начинается вестись новый лог, с той же датой, но следующим номером.<br /> С наименованием разобрались, переходим к формату. Конвертер нацелен на работу со следующим форматом данных файла вызова:<br /> <br /> Первые 320 байт файла - заголовок, каждые следующие 123 байта (включая перевод строки и каретки) - отдельная запись вызова.<br /> <br /> Описание записи файла вызовов &quot;C&quot; тип 1 (Документация CLD DAXL 0159r стр.117):<br /> &lt;pre&gt; <br /> Поле Длина Формат Описание<br /> record number 6 nnnnnn 6-значный десятичный порядковый номер<br /> a_mx_nbr 2 nn Номер станции MX абонента А<br /> b_mx_nbr 2 nn Номер станции MX абонента Б<br /> date 8 yyyymmdd Дата начала вызова<br /> time 6 hhmmss Время начала вызова<br /> a_subnbr 10 nn..n Полный номер абонента А (выровненный по левому разряду с пробелами в конце)<br /> b_subnbr 20 nn..n Полный номер абонента Б (выровненный по левому разряду с пробелами в конце)<br /> a_int_type 2 nn Тип интерфейса абонента А: 00...08 определены, 09...99 зарезервированы<br /> b_int_type 2 nn Тип интерфейса абонента Б: 00...08 определены, 09...99 зарезервированы<br /> call_type 3 nnn Тип вызова: десятичное число от 00 до 34<br /> site_a 3 nnn Номер базовой станции абонента А<br /> channel_a 5 nnnnn Номер канала абонента А<br /> site_b 3 nnn Номер базовой станции абонента Б<br /> channel_b 5 nnnnn Номер канала абонента Б<br /> b_subs_q_time 5 nnnnn Время ожидания в очереди к абоненту Б (секунд)<br /> tc_wait_time 5 nnnnn Время ожидания канала связи (секунд)<br /> b_subs_answ_time 5 nnnnn Длительность подачи вызывного сигнала абоненту Б (секунд)<br /> call_duration 5 nnnnn Продолжительность вызова (секунд)<br /> release_mode 3 nnn Режим отбоя вызова (секунд)<br /> spec_func 3 nnn Специальные функции: от 0 до 5<br /> ch_pul_mode 3 nnn Режим тарифных импульсов<br /> ch_pulses 5 nnnnn Тарифные импульсы<br /> call_id 10 nn.n Идентификатор вызова (целое число)<br /> cr_lf 2 0D0A<br /> &lt;/pre&gt;<br /> Рассмотрим конкретный пример лога (первой строкой для наглядности дана маска по данным):<br /> &lt;pre&gt;<br /> NNNNNNAABBDDDDDDDDTTTTTTAAAAAAAAAABBBBBBBBBBBBBBBBBBBBAABBTTTSSSCCCCCSSSCCCCCTTTTTWWWWWTTTTTDDDDDRRRFFFPPPCCCCCIIIIIIIIII<br /> 1 35352008070900001570749 0063929 0 5 4 3 96255 71 0 0 9 9 0 0 0 0 889738557<br /> 2 35352008070823300870341 70355 0 0 4 0 92 0 19965535 0 18 1805 10 0 0 0 896423075<br /> 11 353520080708235902?255/8101?70336 5 0 4255 73 3 12265535 0 6 369 1 0 2 0 889673020<br /> 133 35352008070901172670431 0067481 0 5 4 3 122255 58 0 0 12 43 0 0 0 0 891835870<br /> &lt;/pre&gt;<br /> Имейте ввиду, что форматы разных версий устройства могут различаться (или, возможно, при этом они поддаются какой-либо настройке), так что необходимо править соответствующим образом главное регулярное выражение, производящее разбор.<br /> <br /> Теперь рассмотрим скрипты, составляющие конвертер. Первый из них, '''mx96_get_logs.pl''', основной. Он и выполняет самую рутинную работу - отслеживает не появилось ли на ftp несколько новых файлов, скачивает их в соответствующие локальные директории, разбитые по датам (&lt;рабочий каталог&gt;/source/&lt;год&gt;/&lt;месяц&gt;/&lt;день&gt;) и запускает конвертер форматов, '''convert_log.pl'''. Имейте ввиду - &quot;сегодняшние&quot; логи игнорируются, потому, что данные могут оказаться неполными не только за день, но и за час, что не вполне подходит к нашему случаю.<br /> <br /> Про второй скрипт, '''convert_log.pl''', надо сказать отдельно. Он принимает один параметр - путь к файлам логов. Так как у нас по пути находятся несколько почасовых файлов (от нуля до 1, 2 и более для каждого часа), то становится ясно - конвертируются логи за сутки. Скрипт сам понимает, какой именно лог и по какой дате составлять, исходные пути подсказывают ему это.<br /> <br /> Стоит обратить внимание на то, что все логи, уже скачанные, игнорируются. То есть для переобсчёта надо удалить соответствующие скачанные логи из папки source и перезапустить конвертер (или потерпеть до автоматического перезапуска) - все новые логи будут скачены, разложены по папкам и должным образом обработаны.<br /> <br /> Запуск скрипта производится как обычно:&lt;pre&gt;<br /> nohup mx96_get_logs.pl &gt;&gt; convert.out 2&gt;&amp;1 &amp;<br /> &lt;/pre&gt;<br /> Для автоматизации настраивается crontab (в скрипте convert_mx96.sh содержится похожая на приведённую выше строка запуска)<br /> <br /> Файл crontab:&lt;pre&gt;<br /> SHELL=/bin/sh<br /> # convert<br /> 10 0 * * * /home/ATS/convert_mx96.sh<br /> &lt;/pre&gt;<br /> [[Медиа:mx96scripts.zip]]<br /> <br /> --[[Участник:DimOn|dimOn]]<br /> <br /> == HuaweiV300R006 ==<br /> [[Медиа:huaweiV300R006.zip]]<br /> <br /> Описание формата, пример лога: <br /> [[Медиа:hw300R006_Data.zip]]<br /> <br /> == M200 ==<br /> Тема на форуме: [http://forum.bgbilling.ru/viewtopic.php?f=25&amp;t=3675 Автоматизация загрузки логов из ATC М-200 в BGB]<br /> <br /> == Элком ==<br /> Скрипт обрабатывает первичные логи вида:<br /> &lt;pre&gt;<br /> TML1 | TML2 | Дата | Длит. |Тип| Вызывающий | Вызываемый |<br /> 003 : 051| 044 : 001| 13.11.2010 23:59:22 | 5 | 2 | 9875906090 | 2462526 |<br /> 071 : 062| 005 : 019| 13.11.2010 23:53:23 | 385 | 2 | 3472460202 | 89876087603 |<br /> 004 : 031| 044 : 001| 13.11.2010 23:59:31 | 23 | 2 | 2906090 | 2462526 |<br /> 001 : 023| 044 : 008| 13.11.2010 23:59:00 | 58 | 2 | 2906090 | 2462526 |<br /> 074 : 002| 078 : 060| 13.11.2010 23:58:33 | 92 | 2 | 4483 | 5558 |<br /> 004 : 018| 044 : 004| 13.11.2010 23:59:43 | 22 | 2 | 2906090 | 2462526 |<br /> 074 : 005| 064 : 008| 13.11.2010 23:59:50 | 17 | 2 | 3472900444 | 2636474 |<br /> 003 : 041| 044 : 006| 13.11.2010 23:59:49 | 17 | 2 | 2906090 | 2462526 |<br /> 077 : 025| 017 : 007| 13.11.2010 23:34:29 | 1538 | 2 | 3472460000 | 89174914375 |<br /> 074 : 006| 018 : 061| 13.11.2010 23:59:48 | 18 | 2 | 3472900444 | 89875971613 |<br /> &lt;/pre&gt;<br /> <br /> [[Медиа:Script_elcom_convert.zip]]<br /> <br /> == АТС Linea-UT фирмы Italtel ==<br /> Выгрузка данных о звонках со станции и конвертация.Более подробное описание станции приводится в файле ПО для АТС UT. Описание для установке настройке находится в файле manual.txt.<br /> [[Медиа:colit_v1.0.zip]]<br /> <br /> == Коллектор NGN ==<br /> Эта АТС современная и файлы выкладывает в бинарном формате на ftp.<br /> Скрипт умеет копировать новые файлы по мере их появления, преобразовывает в текст. Имеется настройка правил преобразования.<br /> Для предотвращения двойного запуска использовать flock.<br /> Описание формата в файле CDR format_Rus.doc. <br /> Конвертор для windows BillEn.exe.<br /> Использование виндовой конвертором так:<br /> Сначала выбирать тип ZXSS10 SS1 V2.0.0.5 SUN и только потом файл через Open file.<br /> Описание для установке настройке находится в файле manual.txt.<br /> [[Медиа:ngn.zip]]<br /> <br /> == HUAWEI - NGN SoftX Bill iGWB ==<br /> Эта АТС современная и файлы выкладывает в бинарном формате на ftp.<br /> Скрипт умеет копировать новые файлы по мере их появления с ftp. Преобразовываются в формат биллинга в соответствии с документацией. Имеется настройка правил преобразования.<br /> Для предотвращения двойного запуска использовать flock.<br /> Возможна полная автоматизация выгрузки с ftp, конвертации и загрузки в биллинг логов.<br /> Описание формата пример логов лежит в архиве.<br /> <br /> [[Медиа:HUAWEI_-_NGN_SoftX_Bill_iGWB_CDR_Format.zip‎]]<br /> <br /> <br /> == АТС MC240 и Цифровой шлюз SMG-1016M производства Элтекс ==<br /> [[Сопряжение BG-биллинга и Городской цифровой АТС MC240 и Цифрового шлюза SMG-1016M производства Элтекс]]<br /> <br /> == Почти универсальный конвертер логов для модуля phone ==<br /> Тема на форуме: [http://forum.bgbilling.ru/viewtopic.php?f=25&amp;t=5213 Почти универсальный конвертер логов для модуля phone]<br /> <br /> == MC240 ==<br /> Конвертер MC240. Написан на perl, обрабатывает csv-логи. Добавляет задачи на загрузку через сокет. Довольно гибко настраивается по путям итд. Правила обработки номеров внутри скрипта нужно будет подправить под себя.<br /> <br /> [[Медиа:20151026-154528-ms240-dimon.tar.gz]]<br /> <br /> --[[Участник:DimOn|dimOn]] 10:49, 26 октября 2015 (UTC)</div> DimOn http://wiki.bitel.ru/index.php/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%BE%D0%BD%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2 Примеры реализации конверторов логов 2015-10-26T10:49:40Z <p>DimOn:&#32;/* MC240 */</p> <hr /> <div>== Siemens EWSD ==<br /> Конвертер на perl из бинарного формата Siemens EWSD v12 в формат биллинга.<br /> <br /> ama.pl осуществляет конвертацию дневного лога в часовые. schedule.pl запускается cron-ом и проверяет директорию, указанную в файле conf на наличие логов и запускает ama.pl с указанием имени файла; файл после конвертирования переносится в папку ./done<br /> <br /> ama.pl после конвертирования выполняет data_loader.sh для добавления задачи на загрузку лога.<br /> Формат названия файла: AMA.yyMMdd.ama.<br /> <br /> [[Медиа:Phone_ama.zip]]<br /> <br /> == ISKRATEL si2000 ==<br /> Конвертер на perl из бинарного формата si2000 в формат биллинга.<br /> <br /> Это архив папки /home/ATS, в которой лежит несколько конвертеров (si2000, md100, mx96). <br /> <br /> Данный конвертер располагается в подпапке si2000. <br /> <br /> Файл convert_si2000.sh(в корне) запускается cron-ом и вызвает файл si2000/si2000_get_logs.pl . Тот работает следующим образом:<br /> <br /> 1. Анализируетет ftp-папку на начличие файлов *.ama и копирует их в папку source (то же бинарный файл, только уже без расшинения кладет как source/year/month/day/hour/log_xxxx).. В папке ftp лежат файлы вида i222220080821161532.ama(2008-год,08-месяц,21-число,16 -, 1532 - номер xxxx). Если такой файл уже есть в папке source, то он игнорируется. <br /> <br /> 2. Вызывает si2000/convert_log.pl, который конвертирует новые полученные файлы в формат биллинга(кладет файлы si2000/year/month/day_hour.zip) <br /> <br /> 3. Вызывает data_loader.sh для добавления задачи на загрузку логов<br /> <br /> пути к локальным и ftp-папке указаны в начале скриптов. <br /> <br /> Конвертер:<br /> <br /> [[Медиа:ATS.zip]]<br /> <br /> Описание формата:<br /> [[Медиа:FUN559000PCR150.PDF.zip]]<br /> <br /> <br /> Вот тут есть еще одна модификация этого конвертера(так как этот вариант не смог распарсить их ama-файлы). возможно , кому-то поможет:<br /> http://forum.bgbilling.ru/viewtopic.php?f=10&amp;t=3962<br /> <br /> <br /> 1) в конвертере найдена ошибка при считывании номера звонящего абонента.<br /> нужно заменить вот этот кусок в файле convert_log.pl<br /> &lt;source lang =&quot;perl&quot; &gt;<br /> my $lac = undef;<br /> my $spis_num = undef;<br /> <br /> my $bytes_lac_len = get_bytes_len( $lac_len );<br /> my $bytes_spis_num_len = get_bytes_len( $spis_num_len );<br /> <br /> if( $lac_len &gt; 0 )<br /> {<br /> read( FILE_IN, $data, $bytes_lac_len );<br /> $lac = get_bcd( $data, $lac_len );<br /> }<br /> if( $spis_num_len &gt; 0 )<br /> {<br /> read( FILE_IN, $data, $bytes_spis_num_len );<br /> $spis_num = get_bcd( $data, $spis_num_len );<br /> }<br /> <br /> my $var_len = $record_len - 16 - $bytes_lac_len - $bytes_spis_num_len;<br /> <br /> &lt;/source&gt;<br /> <br /> На вот этот <br /> &lt;source lang =&quot;perl&quot; &gt;<br /> my $lac = undef;<br /> my $bytes_lac_len = get_bytes_len( $lac_len );<br /> <br /> my $first_digit;<br /> if( $lac_len &gt; 0 )<br /> {<br /> read( FILE_IN, $data, $bytes_lac_len );<br /> $lac = get_bcd( $data, $lac_len );<br /> <br /> if ( $lac_len % 2 == 1 )<br /> {<br /> my $idx = $lac_len / 2;<br /> my $part = substr( $data, $idx, 1 );<br /> my @f = unpack( 'C', $part);<br /> $first_digit = $f[0]&amp;0b00001111;<br /> }<br /> }<br /> <br /> my $spis_num = '';<br /> <br /> my $bytes_summa = get_bytes_len( $lac_len + $spis_num_len );<br /> <br /> if( $spis_num_len &gt; 0 )<br /> {<br /> if ( $first_digit )<br /> {<br /> $spis_num_len--;<br /> $spis_num .= $first_digit;<br /> }<br /> <br /> my $bytes_spis_num_len = get_bytes_len( $spis_num_len );<br /> <br /> read( FILE_IN, $data, $bytes_spis_num_len );<br /> $spis_num .= get_bcd( $data, $spis_num_len );<br /> }<br /> <br /> my $var_len = $record_len - 16 - $bytes_summa;<br /> <br /> &lt;/source &gt;<br /> <br /> Суть исправления в том, что код города и номер считываются подряд . B случае если код города, например 88712(нечетный), а номер 222066, то номер считывался как 220660,так как первая 2-ка просто <br /> выбрасывалась, как остаток BCD-поля, что неверно.<br /> <br /> 2) В конвертере можно считывать порты с помощью замены вот этих строк<br /> <br /> <br /> &lt;source lang=&quot;perl&quot;&gt;<br /> # vhod tract<br /> elsif( $f[0] == 113 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> print &quot;113=&gt;$id\n&quot;;<br /> <br /> $result{113} = $id;<br /> $pos += 9;<br /> }<br /> # ishod tract<br /> elsif( $f[0] == 114 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> print &quot;114=&gt;$id\n&quot;;<br /> <br /> $result{114} = $id;<br /> $pos += 9;<br /> }<br /> <br /> &lt;/source&gt;<br /> на эти <br /> &lt;source lang=&quot;perl&quot;&gt;<br /> # vhod tract<br /> elsif( $f[0] == 113 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> #my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> #kanal(port)<br /> my $id = &quot;$id[0]&quot;;<br /> <br /> print &quot;113=&gt;$id\n&quot;;<br /> <br /> $result{113} = $id;<br /> $pos += 9;<br /> }<br /> # ishod tract<br /> elsif( $f[0] == 114 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> #my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> #kanal(port)<br /> my $id = &quot;$id[0]&quot;;<br /> <br /> <br /> print &quot;114=&gt;$id\n&quot;;<br /> <br /> $result{114} = $id;<br /> $pos += 9;<br /> }<br /> <br /> &lt;/source&gt;<br /> <br /> == ISKRATEL si3000 ==<br /> Есть только описание формата:<br /> [[Медиа:SI3000CDR.PDF.zip]]<br /> <br /> <br /> == Ericsson MD-110 ==<br /> Конвертер на perl из тексового формата Ericsson MD-110 в формат биллинга.<br /> <br /> Это архив папки /home/ATS, в которой лежит несколько конвертеров (si2000, md100, mx96). Данный конвертер располагается в подпапке md100. <br /> <br /> Чтение данных происходи с com-порта ATS. Для этого запускается скрипт md100/start_read_com.sh, который постоянно считавает данные в файл md100/log. <br /> <br /> Файл convert_md110.sh(в корне) запускается cron-ом и вызвает файл md110/md110_convert_hour.pl .. Тот работает так :<br /> <br /> 1. Вызывает скрипт md110/hour_log, который берет данные из файла md100/log, помещает его содержимое в папку source как лог очердного часа (в формате yyyy.mm.dd.hour.log) и очищает log . <br /> <br /> 2. Вызывает md110/convert_log, который конвертирует полученный лог в формат биллинга( кладет файл md110/year/month/day_hour.zip) <br /> <br /> 3. Вызывает data_loader.sh из папки биллинга для добавления задачи на загрузку лога<br /> <br /> пути указаны в начале скриптов. <br /> <br /> Конвертер<br /> [[Медиа:ATS.zip]]<br /> <br /> Примерный формат логов :<br /> &lt;source lang=&quot;bash&quot;&gt;<br /> MMDD HHMM duration number_from number_to port_to<br /> &lt;/source&gt;<br /> <br /> <br /> update: Для избежания зависания com-порта на порте должен был выдаваться сигнал о готовности принимать данные. Поэтому надо изменить файлик start_read_com.sh :<br /> stty -F /dev/ttyS0 ispeed 19200 cs7 clocal crtscts<br /> <br /> == mx96 ==<br /> <br /> В данном разделе речь идёт о неком устройстве '''mx96''' (Actionet_MX). Представленный конвертер знает о следующей ситуации. Имеется доступ по ftp к расшаренным исходным логам. Имена логов имеют вид '''ггммддNN.C35''', где, как несложно догадаться, &quot;гг&quot;, &quot;мм&quot; и &quot;дд&quot; - это день, месяц и год, а NN - номер файла в шестнадцатиричном виде, причём младший байт расположен слева. Номера файлов придуманы неспроста - при перегрузке считающего оборудования и прочих ситуация начинается вестись новый лог, с той же датой, но следующим номером.<br /> С наименованием разобрались, переходим к формату. Конвертер нацелен на работу со следующим форматом данных файла вызова:<br /> <br /> Первые 320 байт файла - заголовок, каждые следующие 123 байта (включая перевод строки и каретки) - отдельная запись вызова.<br /> <br /> Описание записи файла вызовов &quot;C&quot; тип 1 (Документация CLD DAXL 0159r стр.117):<br /> &lt;pre&gt; <br /> Поле Длина Формат Описание<br /> record number 6 nnnnnn 6-значный десятичный порядковый номер<br /> a_mx_nbr 2 nn Номер станции MX абонента А<br /> b_mx_nbr 2 nn Номер станции MX абонента Б<br /> date 8 yyyymmdd Дата начала вызова<br /> time 6 hhmmss Время начала вызова<br /> a_subnbr 10 nn..n Полный номер абонента А (выровненный по левому разряду с пробелами в конце)<br /> b_subnbr 20 nn..n Полный номер абонента Б (выровненный по левому разряду с пробелами в конце)<br /> a_int_type 2 nn Тип интерфейса абонента А: 00...08 определены, 09...99 зарезервированы<br /> b_int_type 2 nn Тип интерфейса абонента Б: 00...08 определены, 09...99 зарезервированы<br /> call_type 3 nnn Тип вызова: десятичное число от 00 до 34<br /> site_a 3 nnn Номер базовой станции абонента А<br /> channel_a 5 nnnnn Номер канала абонента А<br /> site_b 3 nnn Номер базовой станции абонента Б<br /> channel_b 5 nnnnn Номер канала абонента Б<br /> b_subs_q_time 5 nnnnn Время ожидания в очереди к абоненту Б (секунд)<br /> tc_wait_time 5 nnnnn Время ожидания канала связи (секунд)<br /> b_subs_answ_time 5 nnnnn Длительность подачи вызывного сигнала абоненту Б (секунд)<br /> call_duration 5 nnnnn Продолжительность вызова (секунд)<br /> release_mode 3 nnn Режим отбоя вызова (секунд)<br /> spec_func 3 nnn Специальные функции: от 0 до 5<br /> ch_pul_mode 3 nnn Режим тарифных импульсов<br /> ch_pulses 5 nnnnn Тарифные импульсы<br /> call_id 10 nn.n Идентификатор вызова (целое число)<br /> cr_lf 2 0D0A<br /> &lt;/pre&gt;<br /> Рассмотрим конкретный пример лога (первой строкой для наглядности дана маска по данным):<br /> &lt;pre&gt;<br /> NNNNNNAABBDDDDDDDDTTTTTTAAAAAAAAAABBBBBBBBBBBBBBBBBBBBAABBTTTSSSCCCCCSSSCCCCCTTTTTWWWWWTTTTTDDDDDRRRFFFPPPCCCCCIIIIIIIIII<br /> 1 35352008070900001570749 0063929 0 5 4 3 96255 71 0 0 9 9 0 0 0 0 889738557<br /> 2 35352008070823300870341 70355 0 0 4 0 92 0 19965535 0 18 1805 10 0 0 0 896423075<br /> 11 353520080708235902?255/8101?70336 5 0 4255 73 3 12265535 0 6 369 1 0 2 0 889673020<br /> 133 35352008070901172670431 0067481 0 5 4 3 122255 58 0 0 12 43 0 0 0 0 891835870<br /> &lt;/pre&gt;<br /> Имейте ввиду, что форматы разных версий устройства могут различаться (или, возможно, при этом они поддаются какой-либо настройке), так что необходимо править соответствующим образом главное регулярное выражение, производящее разбор.<br /> <br /> Теперь рассмотрим скрипты, составляющие конвертер. Первый из них, '''mx96_get_logs.pl''', основной. Он и выполняет самую рутинную работу - отслеживает не появилось ли на ftp несколько новых файлов, скачивает их в соответствующие локальные директории, разбитые по датам (&lt;рабочий каталог&gt;/source/&lt;год&gt;/&lt;месяц&gt;/&lt;день&gt;) и запускает конвертер форматов, '''convert_log.pl'''. Имейте ввиду - &quot;сегодняшние&quot; логи игнорируются, потому, что данные могут оказаться неполными не только за день, но и за час, что не вполне подходит к нашему случаю.<br /> <br /> Про второй скрипт, '''convert_log.pl''', надо сказать отдельно. Он принимает один параметр - путь к файлам логов. Так как у нас по пути находятся несколько почасовых файлов (от нуля до 1, 2 и более для каждого часа), то становится ясно - конвертируются логи за сутки. Скрипт сам понимает, какой именно лог и по какой дате составлять, исходные пути подсказывают ему это.<br /> <br /> Стоит обратить внимание на то, что все логи, уже скачанные, игнорируются. То есть для переобсчёта надо удалить соответствующие скачанные логи из папки source и перезапустить конвертер (или потерпеть до автоматического перезапуска) - все новые логи будут скачены, разложены по папкам и должным образом обработаны.<br /> <br /> Запуск скрипта производится как обычно:&lt;pre&gt;<br /> nohup mx96_get_logs.pl &gt;&gt; convert.out 2&gt;&amp;1 &amp;<br /> &lt;/pre&gt;<br /> Для автоматизации настраивается crontab (в скрипте convert_mx96.sh содержится похожая на приведённую выше строка запуска)<br /> <br /> Файл crontab:&lt;pre&gt;<br /> SHELL=/bin/sh<br /> # convert<br /> 10 0 * * * /home/ATS/convert_mx96.sh<br /> &lt;/pre&gt;<br /> [[Медиа:mx96scripts.zip]]<br /> <br /> --[[Участник:DimOn|dimOn]]<br /> <br /> == HuaweiV300R006 ==<br /> [[Медиа:huaweiV300R006.zip]]<br /> <br /> Описание формата, пример лога: <br /> [[Медиа:hw300R006_Data.zip]]<br /> <br /> == M200 ==<br /> Тема на форуме: [http://forum.bgbilling.ru/viewtopic.php?f=25&amp;t=3675 Автоматизация загрузки логов из ATC М-200 в BGB]<br /> <br /> == Элком ==<br /> Скрипт обрабатывает первичные логи вида:<br /> &lt;pre&gt;<br /> TML1 | TML2 | Дата | Длит. |Тип| Вызывающий | Вызываемый |<br /> 003 : 051| 044 : 001| 13.11.2010 23:59:22 | 5 | 2 | 9875906090 | 2462526 |<br /> 071 : 062| 005 : 019| 13.11.2010 23:53:23 | 385 | 2 | 3472460202 | 89876087603 |<br /> 004 : 031| 044 : 001| 13.11.2010 23:59:31 | 23 | 2 | 2906090 | 2462526 |<br /> 001 : 023| 044 : 008| 13.11.2010 23:59:00 | 58 | 2 | 2906090 | 2462526 |<br /> 074 : 002| 078 : 060| 13.11.2010 23:58:33 | 92 | 2 | 4483 | 5558 |<br /> 004 : 018| 044 : 004| 13.11.2010 23:59:43 | 22 | 2 | 2906090 | 2462526 |<br /> 074 : 005| 064 : 008| 13.11.2010 23:59:50 | 17 | 2 | 3472900444 | 2636474 |<br /> 003 : 041| 044 : 006| 13.11.2010 23:59:49 | 17 | 2 | 2906090 | 2462526 |<br /> 077 : 025| 017 : 007| 13.11.2010 23:34:29 | 1538 | 2 | 3472460000 | 89174914375 |<br /> 074 : 006| 018 : 061| 13.11.2010 23:59:48 | 18 | 2 | 3472900444 | 89875971613 |<br /> &lt;/pre&gt;<br /> <br /> [[Медиа:Script_elcom_convert.zip]]<br /> <br /> == АТС Linea-UT фирмы Italtel ==<br /> Выгрузка данных о звонках со станции и конвертация.Более подробное описание станции приводится в файле ПО для АТС UT. Описание для установке настройке находится в файле manual.txt.<br /> [[Медиа:colit_v1.0.zip]]<br /> <br /> == Коллектор NGN ==<br /> Эта АТС современная и файлы выкладывает в бинарном формате на ftp.<br /> Скрипт умеет копировать новые файлы по мере их появления, преобразовывает в текст. Имеется настройка правил преобразования.<br /> Для предотвращения двойного запуска использовать flock.<br /> Описание формата в файле CDR format_Rus.doc. <br /> Конвертор для windows BillEn.exe.<br /> Использование виндовой конвертором так:<br /> Сначала выбирать тип ZXSS10 SS1 V2.0.0.5 SUN и только потом файл через Open file.<br /> Описание для установке настройке находится в файле manual.txt.<br /> [[Медиа:ngn.zip]]<br /> <br /> == HUAWEI - NGN SoftX Bill iGWB ==<br /> Эта АТС современная и файлы выкладывает в бинарном формате на ftp.<br /> Скрипт умеет копировать новые файлы по мере их появления с ftp. Преобразовываются в формат биллинга в соответствии с документацией. Имеется настройка правил преобразования.<br /> Для предотвращения двойного запуска использовать flock.<br /> Возможна полная автоматизация выгрузки с ftp, конвертации и загрузки в биллинг логов.<br /> Описание формата пример логов лежит в архиве.<br /> <br /> [[Медиа:HUAWEI_-_NGN_SoftX_Bill_iGWB_CDR_Format.zip‎]]<br /> <br /> <br /> == АТС MC240 и Цифровой шлюз SMG-1016M производства Элтекс ==<br /> [[Сопряжение BG-биллинга и Городской цифровой АТС MC240 и Цифрового шлюза SMG-1016M производства Элтекс]]<br /> <br /> == Почти универсальный конвертер логов для модуля phone ==<br /> Тема на форуме: [http://forum.bgbilling.ru/viewtopic.php?f=25&amp;t=5213 Почти универсальный конвертер логов для модуля phone]<br /> <br /> == MC240 ==<br /> Конвертер MC240. Написан на perl, обрабатывает csv-логи. Добавляет задачи на загрузку через сокет. Довольно гибко настраивается по путям итд. Правила обработки номеров внутри скрипта нужно будет подправить под себя.<br /> <br /> [[Медиа:20151026-154528-ms240-dimon.tar.gz]]<br /> --[[Участник:DimOn|dimOn]] 10:49, 26 октября 2015 (UTC)</div> DimOn http://wiki.bitel.ru/index.php/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%BE%D0%BD%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2 Примеры реализации конверторов логов 2015-10-26T10:49:22Z <p>DimOn:&#32;</p> <hr /> <div>== Siemens EWSD ==<br /> Конвертер на perl из бинарного формата Siemens EWSD v12 в формат биллинга.<br /> <br /> ama.pl осуществляет конвертацию дневного лога в часовые. schedule.pl запускается cron-ом и проверяет директорию, указанную в файле conf на наличие логов и запускает ama.pl с указанием имени файла; файл после конвертирования переносится в папку ./done<br /> <br /> ama.pl после конвертирования выполняет data_loader.sh для добавления задачи на загрузку лога.<br /> Формат названия файла: AMA.yyMMdd.ama.<br /> <br /> [[Медиа:Phone_ama.zip]]<br /> <br /> == ISKRATEL si2000 ==<br /> Конвертер на perl из бинарного формата si2000 в формат биллинга.<br /> <br /> Это архив папки /home/ATS, в которой лежит несколько конвертеров (si2000, md100, mx96). <br /> <br /> Данный конвертер располагается в подпапке si2000. <br /> <br /> Файл convert_si2000.sh(в корне) запускается cron-ом и вызвает файл si2000/si2000_get_logs.pl . Тот работает следующим образом:<br /> <br /> 1. Анализируетет ftp-папку на начличие файлов *.ama и копирует их в папку source (то же бинарный файл, только уже без расшинения кладет как source/year/month/day/hour/log_xxxx).. В папке ftp лежат файлы вида i222220080821161532.ama(2008-год,08-месяц,21-число,16 -, 1532 - номер xxxx). Если такой файл уже есть в папке source, то он игнорируется. <br /> <br /> 2. Вызывает si2000/convert_log.pl, который конвертирует новые полученные файлы в формат биллинга(кладет файлы si2000/year/month/day_hour.zip) <br /> <br /> 3. Вызывает data_loader.sh для добавления задачи на загрузку логов<br /> <br /> пути к локальным и ftp-папке указаны в начале скриптов. <br /> <br /> Конвертер:<br /> <br /> [[Медиа:ATS.zip]]<br /> <br /> Описание формата:<br /> [[Медиа:FUN559000PCR150.PDF.zip]]<br /> <br /> <br /> Вот тут есть еще одна модификация этого конвертера(так как этот вариант не смог распарсить их ama-файлы). возможно , кому-то поможет:<br /> http://forum.bgbilling.ru/viewtopic.php?f=10&amp;t=3962<br /> <br /> <br /> 1) в конвертере найдена ошибка при считывании номера звонящего абонента.<br /> нужно заменить вот этот кусок в файле convert_log.pl<br /> &lt;source lang =&quot;perl&quot; &gt;<br /> my $lac = undef;<br /> my $spis_num = undef;<br /> <br /> my $bytes_lac_len = get_bytes_len( $lac_len );<br /> my $bytes_spis_num_len = get_bytes_len( $spis_num_len );<br /> <br /> if( $lac_len &gt; 0 )<br /> {<br /> read( FILE_IN, $data, $bytes_lac_len );<br /> $lac = get_bcd( $data, $lac_len );<br /> }<br /> if( $spis_num_len &gt; 0 )<br /> {<br /> read( FILE_IN, $data, $bytes_spis_num_len );<br /> $spis_num = get_bcd( $data, $spis_num_len );<br /> }<br /> <br /> my $var_len = $record_len - 16 - $bytes_lac_len - $bytes_spis_num_len;<br /> <br /> &lt;/source&gt;<br /> <br /> На вот этот <br /> &lt;source lang =&quot;perl&quot; &gt;<br /> my $lac = undef;<br /> my $bytes_lac_len = get_bytes_len( $lac_len );<br /> <br /> my $first_digit;<br /> if( $lac_len &gt; 0 )<br /> {<br /> read( FILE_IN, $data, $bytes_lac_len );<br /> $lac = get_bcd( $data, $lac_len );<br /> <br /> if ( $lac_len % 2 == 1 )<br /> {<br /> my $idx = $lac_len / 2;<br /> my $part = substr( $data, $idx, 1 );<br /> my @f = unpack( 'C', $part);<br /> $first_digit = $f[0]&amp;0b00001111;<br /> }<br /> }<br /> <br /> my $spis_num = '';<br /> <br /> my $bytes_summa = get_bytes_len( $lac_len + $spis_num_len );<br /> <br /> if( $spis_num_len &gt; 0 )<br /> {<br /> if ( $first_digit )<br /> {<br /> $spis_num_len--;<br /> $spis_num .= $first_digit;<br /> }<br /> <br /> my $bytes_spis_num_len = get_bytes_len( $spis_num_len );<br /> <br /> read( FILE_IN, $data, $bytes_spis_num_len );<br /> $spis_num .= get_bcd( $data, $spis_num_len );<br /> }<br /> <br /> my $var_len = $record_len - 16 - $bytes_summa;<br /> <br /> &lt;/source &gt;<br /> <br /> Суть исправления в том, что код города и номер считываются подряд . B случае если код города, например 88712(нечетный), а номер 222066, то номер считывался как 220660,так как первая 2-ка просто <br /> выбрасывалась, как остаток BCD-поля, что неверно.<br /> <br /> 2) В конвертере можно считывать порты с помощью замены вот этих строк<br /> <br /> <br /> &lt;source lang=&quot;perl&quot;&gt;<br /> # vhod tract<br /> elsif( $f[0] == 113 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> print &quot;113=&gt;$id\n&quot;;<br /> <br /> $result{113} = $id;<br /> $pos += 9;<br /> }<br /> # ishod tract<br /> elsif( $f[0] == 114 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> print &quot;114=&gt;$id\n&quot;;<br /> <br /> $result{114} = $id;<br /> $pos += 9;<br /> }<br /> <br /> &lt;/source&gt;<br /> на эти <br /> &lt;source lang=&quot;perl&quot;&gt;<br /> # vhod tract<br /> elsif( $f[0] == 113 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> #my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> #kanal(port)<br /> my $id = &quot;$id[0]&quot;;<br /> <br /> print &quot;113=&gt;$id\n&quot;;<br /> <br /> $result{113} = $id;<br /> $pos += 9;<br /> }<br /> # ishod tract<br /> elsif( $f[0] == 114 )<br /> {<br /> my @id = unpack( 'nnCnC', substr( $data, $pos + 1, 8 ) );<br /> #my $id = &quot;$id[0]:$id[1]:$id[2]:$id[3]:$id[4]&quot;;<br /> <br /> #kanal(port)<br /> my $id = &quot;$id[0]&quot;;<br /> <br /> <br /> print &quot;114=&gt;$id\n&quot;;<br /> <br /> $result{114} = $id;<br /> $pos += 9;<br /> }<br /> <br /> &lt;/source&gt;<br /> <br /> == ISKRATEL si3000 ==<br /> Есть только описание формата:<br /> [[Медиа:SI3000CDR.PDF.zip]]<br /> <br /> <br /> == Ericsson MD-110 ==<br /> Конвертер на perl из тексового формата Ericsson MD-110 в формат биллинга.<br /> <br /> Это архив папки /home/ATS, в которой лежит несколько конвертеров (si2000, md100, mx96). Данный конвертер располагается в подпапке md100. <br /> <br /> Чтение данных происходи с com-порта ATS. Для этого запускается скрипт md100/start_read_com.sh, который постоянно считавает данные в файл md100/log. <br /> <br /> Файл convert_md110.sh(в корне) запускается cron-ом и вызвает файл md110/md110_convert_hour.pl .. Тот работает так :<br /> <br /> 1. Вызывает скрипт md110/hour_log, который берет данные из файла md100/log, помещает его содержимое в папку source как лог очердного часа (в формате yyyy.mm.dd.hour.log) и очищает log . <br /> <br /> 2. Вызывает md110/convert_log, который конвертирует полученный лог в формат биллинга( кладет файл md110/year/month/day_hour.zip) <br /> <br /> 3. Вызывает data_loader.sh из папки биллинга для добавления задачи на загрузку лога<br /> <br /> пути указаны в начале скриптов. <br /> <br /> Конвертер<br /> [[Медиа:ATS.zip]]<br /> <br /> Примерный формат логов :<br /> &lt;source lang=&quot;bash&quot;&gt;<br /> MMDD HHMM duration number_from number_to port_to<br /> &lt;/source&gt;<br /> <br /> <br /> update: Для избежания зависания com-порта на порте должен был выдаваться сигнал о готовности принимать данные. Поэтому надо изменить файлик start_read_com.sh :<br /> stty -F /dev/ttyS0 ispeed 19200 cs7 clocal crtscts<br /> <br /> == mx96 ==<br /> <br /> В данном разделе речь идёт о неком устройстве '''mx96''' (Actionet_MX). Представленный конвертер знает о следующей ситуации. Имеется доступ по ftp к расшаренным исходным логам. Имена логов имеют вид '''ггммддNN.C35''', где, как несложно догадаться, &quot;гг&quot;, &quot;мм&quot; и &quot;дд&quot; - это день, месяц и год, а NN - номер файла в шестнадцатиричном виде, причём младший байт расположен слева. Номера файлов придуманы неспроста - при перегрузке считающего оборудования и прочих ситуация начинается вестись новый лог, с той же датой, но следующим номером.<br /> С наименованием разобрались, переходим к формату. Конвертер нацелен на работу со следующим форматом данных файла вызова:<br /> <br /> Первые 320 байт файла - заголовок, каждые следующие 123 байта (включая перевод строки и каретки) - отдельная запись вызова.<br /> <br /> Описание записи файла вызовов &quot;C&quot; тип 1 (Документация CLD DAXL 0159r стр.117):<br /> &lt;pre&gt; <br /> Поле Длина Формат Описание<br /> record number 6 nnnnnn 6-значный десятичный порядковый номер<br /> a_mx_nbr 2 nn Номер станции MX абонента А<br /> b_mx_nbr 2 nn Номер станции MX абонента Б<br /> date 8 yyyymmdd Дата начала вызова<br /> time 6 hhmmss Время начала вызова<br /> a_subnbr 10 nn..n Полный номер абонента А (выровненный по левому разряду с пробелами в конце)<br /> b_subnbr 20 nn..n Полный номер абонента Б (выровненный по левому разряду с пробелами в конце)<br /> a_int_type 2 nn Тип интерфейса абонента А: 00...08 определены, 09...99 зарезервированы<br /> b_int_type 2 nn Тип интерфейса абонента Б: 00...08 определены, 09...99 зарезервированы<br /> call_type 3 nnn Тип вызова: десятичное число от 00 до 34<br /> site_a 3 nnn Номер базовой станции абонента А<br /> channel_a 5 nnnnn Номер канала абонента А<br /> site_b 3 nnn Номер базовой станции абонента Б<br /> channel_b 5 nnnnn Номер канала абонента Б<br /> b_subs_q_time 5 nnnnn Время ожидания в очереди к абоненту Б (секунд)<br /> tc_wait_time 5 nnnnn Время ожидания канала связи (секунд)<br /> b_subs_answ_time 5 nnnnn Длительность подачи вызывного сигнала абоненту Б (секунд)<br /> call_duration 5 nnnnn Продолжительность вызова (секунд)<br /> release_mode 3 nnn Режим отбоя вызова (секунд)<br /> spec_func 3 nnn Специальные функции: от 0 до 5<br /> ch_pul_mode 3 nnn Режим тарифных импульсов<br /> ch_pulses 5 nnnnn Тарифные импульсы<br /> call_id 10 nn.n Идентификатор вызова (целое число)<br /> cr_lf 2 0D0A<br /> &lt;/pre&gt;<br /> Рассмотрим конкретный пример лога (первой строкой для наглядности дана маска по данным):<br /> &lt;pre&gt;<br /> NNNNNNAABBDDDDDDDDTTTTTTAAAAAAAAAABBBBBBBBBBBBBBBBBBBBAABBTTTSSSCCCCCSSSCCCCCTTTTTWWWWWTTTTTDDDDDRRRFFFPPPCCCCCIIIIIIIIII<br /> 1 35352008070900001570749 0063929 0 5 4 3 96255 71 0 0 9 9 0 0 0 0 889738557<br /> 2 35352008070823300870341 70355 0 0 4 0 92 0 19965535 0 18 1805 10 0 0 0 896423075<br /> 11 353520080708235902?255/8101?70336 5 0 4255 73 3 12265535 0 6 369 1 0 2 0 889673020<br /> 133 35352008070901172670431 0067481 0 5 4 3 122255 58 0 0 12 43 0 0 0 0 891835870<br /> &lt;/pre&gt;<br /> Имейте ввиду, что форматы разных версий устройства могут различаться (или, возможно, при этом они поддаются какой-либо настройке), так что необходимо править соответствующим образом главное регулярное выражение, производящее разбор.<br /> <br /> Теперь рассмотрим скрипты, составляющие конвертер. Первый из них, '''mx96_get_logs.pl''', основной. Он и выполняет самую рутинную работу - отслеживает не появилось ли на ftp несколько новых файлов, скачивает их в соответствующие локальные директории, разбитые по датам (&lt;рабочий каталог&gt;/source/&lt;год&gt;/&lt;месяц&gt;/&lt;день&gt;) и запускает конвертер форматов, '''convert_log.pl'''. Имейте ввиду - &quot;сегодняшние&quot; логи игнорируются, потому, что данные могут оказаться неполными не только за день, но и за час, что не вполне подходит к нашему случаю.<br /> <br /> Про второй скрипт, '''convert_log.pl''', надо сказать отдельно. Он принимает один параметр - путь к файлам логов. Так как у нас по пути находятся несколько почасовых файлов (от нуля до 1, 2 и более для каждого часа), то становится ясно - конвертируются логи за сутки. Скрипт сам понимает, какой именно лог и по какой дате составлять, исходные пути подсказывают ему это.<br /> <br /> Стоит обратить внимание на то, что все логи, уже скачанные, игнорируются. То есть для переобсчёта надо удалить соответствующие скачанные логи из папки source и перезапустить конвертер (или потерпеть до автоматического перезапуска) - все новые логи будут скачены, разложены по папкам и должным образом обработаны.<br /> <br /> Запуск скрипта производится как обычно:&lt;pre&gt;<br /> nohup mx96_get_logs.pl &gt;&gt; convert.out 2&gt;&amp;1 &amp;<br /> &lt;/pre&gt;<br /> Для автоматизации настраивается crontab (в скрипте convert_mx96.sh содержится похожая на приведённую выше строка запуска)<br /> <br /> Файл crontab:&lt;pre&gt;<br /> SHELL=/bin/sh<br /> # convert<br /> 10 0 * * * /home/ATS/convert_mx96.sh<br /> &lt;/pre&gt;<br /> [[Медиа:mx96scripts.zip]]<br /> <br /> --[[Участник:DimOn|dimOn]]<br /> <br /> == HuaweiV300R006 ==<br /> [[Медиа:huaweiV300R006.zip]]<br /> <br /> Описание формата, пример лога: <br /> [[Медиа:hw300R006_Data.zip]]<br /> <br /> == M200 ==<br /> Тема на форуме: [http://forum.bgbilling.ru/viewtopic.php?f=25&amp;t=3675 Автоматизация загрузки логов из ATC М-200 в BGB]<br /> <br /> == Элком ==<br /> Скрипт обрабатывает первичные логи вида:<br /> &lt;pre&gt;<br /> TML1 | TML2 | Дата | Длит. |Тип| Вызывающий | Вызываемый |<br /> 003 : 051| 044 : 001| 13.11.2010 23:59:22 | 5 | 2 | 9875906090 | 2462526 |<br /> 071 : 062| 005 : 019| 13.11.2010 23:53:23 | 385 | 2 | 3472460202 | 89876087603 |<br /> 004 : 031| 044 : 001| 13.11.2010 23:59:31 | 23 | 2 | 2906090 | 2462526 |<br /> 001 : 023| 044 : 008| 13.11.2010 23:59:00 | 58 | 2 | 2906090 | 2462526 |<br /> 074 : 002| 078 : 060| 13.11.2010 23:58:33 | 92 | 2 | 4483 | 5558 |<br /> 004 : 018| 044 : 004| 13.11.2010 23:59:43 | 22 | 2 | 2906090 | 2462526 |<br /> 074 : 005| 064 : 008| 13.11.2010 23:59:50 | 17 | 2 | 3472900444 | 2636474 |<br /> 003 : 041| 044 : 006| 13.11.2010 23:59:49 | 17 | 2 | 2906090 | 2462526 |<br /> 077 : 025| 017 : 007| 13.11.2010 23:34:29 | 1538 | 2 | 3472460000 | 89174914375 |<br /> 074 : 006| 018 : 061| 13.11.2010 23:59:48 | 18 | 2 | 3472900444 | 89875971613 |<br /> &lt;/pre&gt;<br /> <br /> [[Медиа:Script_elcom_convert.zip]]<br /> <br /> == АТС Linea-UT фирмы Italtel ==<br /> Выгрузка данных о звонках со станции и конвертация.Более подробное описание станции приводится в файле ПО для АТС UT. Описание для установке настройке находится в файле manual.txt.<br /> [[Медиа:colit_v1.0.zip]]<br /> <br /> == Коллектор NGN ==<br /> Эта АТС современная и файлы выкладывает в бинарном формате на ftp.<br /> Скрипт умеет копировать новые файлы по мере их появления, преобразовывает в текст. Имеется настройка правил преобразования.<br /> Для предотвращения двойного запуска использовать flock.<br /> Описание формата в файле CDR format_Rus.doc. <br /> Конвертор для windows BillEn.exe.<br /> Использование виндовой конвертором так:<br /> Сначала выбирать тип ZXSS10 SS1 V2.0.0.5 SUN и только потом файл через Open file.<br /> Описание для установке настройке находится в файле manual.txt.<br /> [[Медиа:ngn.zip]]<br /> <br /> == HUAWEI - NGN SoftX Bill iGWB ==<br /> Эта АТС современная и файлы выкладывает в бинарном формате на ftp.<br /> Скрипт умеет копировать новые файлы по мере их появления с ftp. Преобразовываются в формат биллинга в соответствии с документацией. Имеется настройка правил преобразования.<br /> Для предотвращения двойного запуска использовать flock.<br /> Возможна полная автоматизация выгрузки с ftp, конвертации и загрузки в биллинг логов.<br /> Описание формата пример логов лежит в архиве.<br /> <br /> [[Медиа:HUAWEI_-_NGN_SoftX_Bill_iGWB_CDR_Format.zip‎]]<br /> <br /> <br /> == АТС MC240 и Цифровой шлюз SMG-1016M производства Элтекс ==<br /> [[Сопряжение BG-биллинга и Городской цифровой АТС MC240 и Цифрового шлюза SMG-1016M производства Элтекс]]<br /> <br /> == Почти универсальный конвертер логов для модуля phone ==<br /> Тема на форуме: [http://forum.bgbilling.ru/viewtopic.php?f=25&amp;t=5213 Почти универсальный конвертер логов для модуля phone]<br /> <br /> == MC240 ==<br /> Конвертер MC240. Написан на perl, обрабатывает csv-логи. Добавляет задачи на загрузку через сокет. Довольно гибко настраивается по путям итд. Правила обработки номеров внутри скрипта нужно будет подправить под себя.<br /> [[Медиа:20151026-154528-ms240-dimon.tar.gz]]</div> DimOn http://wiki.bitel.ru/index.php/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%B0%D0%BA%D1%88%D0%B5%D0%BD%D0%B0_%D0%B8_%D0%B2%D0%B5%D0%B1-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%BE%D0%B2 Примеры динамического кода акшена и веб-сервисов 2015-07-01T10:16:42Z <p>DimOn:&#32;/* Динамические веб-сервисы */</p> <hr /> <div>Динамическим кодом в данном случае можно как писать новые экшены (практическое значение имеют больше веб-экшены, т.е. экшены веб-интерфейса) и веб-сервисы, так и обёртывать существующие, т.е. заменять их, а внутри вызывать родительский метод, или не вызывать в зависимости от обстоятельств. Этим можно полностью заменить функционал такой, как [[запуск скрипта до и после акшена]]. Помимо того, что область применения шире, ещё динамичемским кодом просто быстрее, удобнее и надёжнее. В данном разделе рассмотрим примеры скриптов, совершенно аналогичные упомянутым в разделе «[[примеры скриптов до и после акшена]]», за исключением задачи &quot;проверка смены статуса&quot;, которую в старом механизме реализовать вообще невозможно, т.к. смена статуса реализована только в веб-сервисах и событий там никаких нету.<br /> <br /> == Динамические экшены ==<br /> <br /> В случае старых экшенов в конфигурацию сервера прописываются динамические классы, и то, что они заменяют. Динамический класс позволяет получить, чтобы потом заменить (обернуть) вызов метода родного класса.<br /> Параметр в конфиге примерно такой:<br /> &lt;source lang=&quot;text&quot;&gt;dynaction:&lt;модуль&gt;.&lt;режим.&gt;&lt;экшенкласснаме&gt;=дин.класс&lt;/source&gt;<br /> Примеры:<br /> &lt;source lang=&quot;text&quot;&gt;dynaction:contract.ActionCheckContractLimitUpdate=дин.класс<br /> dynaction:ru.bitel.bgbilling.plugins.crm.ActionUpdateRegisterTask=дин.класс<br /> dynaction:contract.web.ActionAdditionalAction=дин.класс&lt;/source&gt;<br /> '''Обратите внимание: там указывается НЕ package класса, а строка по указанной схеме.''' Класс может быть простой кастомный, унаследованный от самого корневого класса, но удобнее наследовать от самого перегружаемого класса, если потенциально нужна хоть какая-то логика из него. Внутри дин.класса при необходимости надо сделать явным образом вызов родительского метода (super.doAction, например). Если нужно только вывести ошибку, например, то унаследованный метод не нужно вызывать, очевидно. При поиске реализации соответствующего экшена сначала ищутся динамические классы прописанные. Дальше ничего не проверяется, что нашлось то и вернулось, т.е. если прописан dynaction, но косячный, то дальше не ищется, незачем.<br /> <br /> Для нашего примера прописать нужно следующее:<br /> &lt;source lang=&quot;text&quot;&gt;dynaction:contract.ActionUpdateContractLimit=ru.xxx.ActionUpdateContractLimit<br /> dynaction:ru.bitel.bgbilling.plugins.crm.ActionUpdateRegisterTask=ru.xxx.ActionUpdateRegisterTask&lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.sql.SQLException;<br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> import ru.bitel.common.Utils;<br /> <br /> /**<br /> * Перегруженный экшен для проверки некоторых параметров:<br /> * 2. Скрипт реализующий запрет изменения &quot;лимита&quot; договора в случае если поле комментарий пустое.<br /> * <br /> * В конфиг сервера прописывается:<br /> * dynaction:contract.ActionUpdateContractLimit=ru.xxx.ActionUpdateContractLimit<br /> * @author dimon<br /> */<br /> public class ActionUpdateContractLimit<br /> extends bitel.billing.server.contract.action.ActionUpdateContractLimit<br /> {<br /> @Override<br /> public void doAction() <br /> throws SQLException, BGException<br /> {<br /> //[2]<br /> //module=contract<br /> //action=UpdateContractLimit<br /> //comment=%ED%E5%E3%E5%ED<br /> // получаем параметры как в экшене<br /> String comment = getParameter( &quot;comment&quot;, &quot;&quot; );<br /> // если 1) комментарий пустой =&gt; ругаемся<br /> if( Utils.isBlankString( comment ) )<br /> {<br /> throw new BGMessageException( &quot;Введите комментарий&quot; );<br /> }<br /> // иначе вызываем родительский метод<br /> super.doAction();<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.sql.SQLException;<br /> import java.util.Date;<br /> <br /> import bitel.billing.common.TimeUtils;<br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> import ru.bitel.bgbilling.plugins.crm.common.model.RegisterTask;<br /> import ru.bitel.bgbilling.plugins.crm.server.dao.RegisterTaskManager;<br /> import ru.bitel.common.Utils;<br /> <br /> /**<br /> * Перегруженный экшен для проверки некоторых параметров:<br /> * 1. Скрипт реализующий запрет изменения &quot;срока&quot; задачи в плагине CRM всем кроме того кто задачу создал, а так же кроме отдельно обозначенного администратора.<br /> * 4. CRM: Нужно сделать так чтобы задачу нельзя было закрыть если поле &quot;Резолюция&quot; пустое.<br /> * <br /> * В конфиг сервера прописывается:<br /> * dynaction:ru.bitel.bgbilling.plugins.crm.ActionUpdateRegisterTask=ru.xxx.ActionUpdateRegisterTask<br /> * @author dimon<br /> */<br /> public class ActionUpdateRegisterTask<br /> extends ru.bitel.bgbilling.plugins.crm.server.action.ActionUpdateRegisterTask<br /> {<br /> /** ид отдельно обозначенного администратора */<br /> private final int ADMIN_USER = 1;<br /> <br /> @Override<br /> public void doAction() <br /> throws SQLException, BGException<br /> {<br /> // [1]<br /> // module=ru.bitel.bgbilling.plugins.crm<br /> // action=UpdateRegisterTask<br /> // id=32<br /> // target_date_and_time=21.04.2010+00%3A00<br /> // получаем параметры как в экшене<br /> int id = getIntParameter( &quot;id&quot;, -1 );<br /> Date targetDate = getDateParameter( &quot;target_date_and_time&quot;, &quot;dd.MM.yyyy HH:mm&quot;, null );<br /> if( targetDate == null )<br /> {<br /> targetDate = getDateParameter( &quot;target_date&quot;, &quot;dd.MM.yyyy&quot;, null );<br /> }<br /> // получаем таск<br /> RegisterTaskManager manager = new RegisterTaskManager( con );<br /> RegisterTask task = manager.getTaskById( id );<br /> // если 1) юзер не админ, и 2) юзер не тот кто создал задачу, то 3) проверяем время и если оно не такое =&gt; ругаемся<br /> if( userID != ADMIN_USER &amp;&amp; userID != task.getCreateUserId() &amp;&amp; !TimeUtils.dateEqual( targetDate, task.getTargetDate() ) )<br /> {<br /> throw new BGMessageException( &quot;Вам нельзя менять срок задачи&quot; );<br /> }<br /> // [4]<br /> // module=ru.bitel.bgbilling.plugins.crm<br /> // action=UpdateRegisterTask<br /> // status=2<br /> // resolution=%F0%E5%E7%EE%EB%FE%F6%E8%FF<br /> // получаем параметры как в экшене<br /> int status = getIntParameter( &quot;status&quot;, 0 );<br /> String resolution = getParameter( &quot;resolution&quot;, &quot;&quot; );<br /> //System.out.println(&quot;status=&quot;+status);<br /> //System.out.println(&quot;resolution=&quot;+resolution);<br /> // если 1) статус &quot;закрыто&quot; и 2) резолюция пустая =&gt; ругаемся<br /> if( status == 2 &amp;&amp; Utils.isBlankString( resolution ) )<br /> {<br /> throw new BGMessageException( &quot;Для закрытия заполните резолюцию&quot; );<br /> }<br /> // иначе вызываем родительский метод<br /> super.doAction();<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> ----<br /> <br /> В данном примере пользователям запрещено добавлять новый тарифный план датой ранее следующей за текущей, а так же запрещено закрывать тарифные планы датой ранее текущей.<br /> На пользователей входящих в группу администраторов ADMIN_GROUP = 1 данные ограничения не распространяются.<br /> Если на договоре нет никаких тарифных планов - разрешено указывать любые даты (т.е. если добавляемый тариф будет единственным - можно выставлять произвольные интервалы. Так было необходимо)<br /> <br /> &lt;source lang=&quot;text&quot;&gt;dynaction:contract.ActionUpdateContractTariffPlan=ru.xxx.updateContractTariffPlan&lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.sql.ResultSet;<br /> import java.sql.SQLException;<br /> import java.util.Calendar;<br /> import java.util.Date;<br /> import java.util.List;<br /> <br /> import bitel.billing.common.TimeUtils;<br /> import bitel.billing.server.admin.bgsecure.bean.UserGroupManager;<br /> <br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> <br /> <br /> public class updateContractTariffPlan <br /> extends bitel.billing.server.contract.action.ActionUpdateContractTariffPlan<br /> {<br /> //ID группы администраторов<br /> private final int ADMIN_GROUP = 1;<br /> <br /> @Override<br /> public void doAction() <br /> throws SQLException, BGException<br /> {<br /> UserGroupManager userGroupManager = new UserGroupManager(con);<br /> List&lt;Integer&gt; groups = userGroupManager.getUserGroups(userID);<br /> Calendar calendar = Calendar.getInstance();<br /> Date today = calendar.getTime();<br /> calendar.add(Calendar.DAY_OF_YEAR, 1);<br /> Date tomorrow = calendar.getTime();<br /> String id = getParameter(&quot;id&quot;, &quot;&quot;);<br /> Date date2 = TimeUtils.convertStringToDate(getParameter( &quot;date2&quot;, &quot;&quot; ));<br /> Date date1 = TimeUtils.convertStringToDate(getParameter( &quot;date1&quot;, &quot;&quot; ));<br /> <br /> if(!groups.contains(ADMIN_GROUP))<br /> {<br /> if(!id.equals(&quot;new&quot;) &amp; TimeUtils.dateBefore(date2, today))<br /> {<br /> throw new BGMessageException( &quot;Дата закрытия тарифного плана не может быть ранее текущей&quot; );<br /> }<br /> if(id.equals(&quot;new&quot;) &amp; TimeUtils.dateBefore(date1, tomorrow))<br /> {<br /> String query = &quot; SELECT COUNT(id) FROM contract_tariff WHERE cid=? &quot;;<br /> java.sql.PreparedStatement ps = con.prepareStatement( query );<br /> ps.setInt(1, cid);<br /> ResultSet rs = ps.executeQuery();<br /> while ( rs.next() )<br /> {<br /> int count = rs.getInt(1);<br /> if(count &gt; 0 )<br /> {<br /> throw new BGMessageException( &quot;Тарифный план должен устанавливаться датой следующей за текущей&quot; );<br /> }<br /> }<br /> rs.close();<br /> ps.close();<br /> }<br /> }<br /> // иначе вызываем родительский метод<br /> super.doAction();<br /> }<br /> }<br /> <br /> &lt;/source&gt;<br /> --[[Участник:Phricker]] 11:23, 17 февраля 2014 (UTC)<br /> <br /> == Динамические веб-сервисы ==<br /> <br /> Динамический класс позволяет заменить (обернуть) вызов метода вебсервиса. В отличие от старых методов экшенов в данном случае необходимо напрямую указать какой именно интерфейс вызова перегружается.<br /> Параметр в конфиге такой:<br /> &lt;source lang=&quot;text&quot;&gt;dynservice:&lt;модуль&gt;.&lt;интерфейс_сервиса&gt;=&lt;дин.класс&gt;&lt;/source&gt;<br /> Например:<br /> &lt;source lang=&quot;text&quot;&gt;dynservice:ru.bitel.bgbilling.kernel.contract.status.ContractStatusMonitorService=дин.класс&lt;/source&gt;<br /> Точно также удобнее унаследовать от родного Impl-класса соответствующего сервиса, чем писать с нуля.<br /> <br /> '''Обратите внимание: там указывается НЕ package класса, а строка по указанной схеме.'''<br /> <br /> Обратите внимание, что в динамическом коде нужно ещё раз указать имплементацию интерфейса даже в этом случае наследования от старой имплементации (несмотря на то, что очевидно, родительский класс уже реализует указываемый интерфейс и по правилам ООП и так понятно что потомок тоже реализует, а по правилам Java не нужно указывать ещё раз implements ContractStatusMonitorService как в примере ниже).<br /> <br /> Внутри дин.класса при необходимости надо перегрузить нужный метод (или несколько), а после сделать (или не сделать, если обёртка отработала сама всё, например, вывела ошибку) явным образом вызов соответствующего родительского метода (super.blabla(foo,bar)).<br /> При поиске реализации сервиса сначала ищется среди динамических классов, но если в динкоде класс заявлен, но косячный, то дальше не ищем, незачем.<br /> <br /> Для нашего примера прописать нужно следующее:<br /> <br /> &lt;source lang=&quot;text&quot;&gt;dynservice:ru.bitel.bgbilling.kernel.contract.status.ContractStatusMonitorService=ru.xxx.ContractStatusMonitorServiceImpl&lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.util.Date;<br /> <br /> import javax.jws.WebService;<br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> import ru.bitel.bgbilling.kernel.contract.status.common.ContractStatusMonitorService;<br /> import ru.bitel.common.Utils;<br /> <br /> /**<br /> * Перегруженный вебсервис для проверки некоторых параметров:<br /> * 3. Скрипт реализующий запрет изменения &quot;Статуса&quot; договора в случае если поле комментарий пустое.<br /> * <br /> * В конфиг сервера прописывается:<br /> * dynservice:ru.bitel.bgbilling.kernel.contract.status.ContractStatusMonitorService=ru.xxx.ContractStatusMonitorServiceImpl<br /> * @author dimon<br /> */<br /> @WebService(endpointInterface = &quot;ru.bitel.bgbilling.kernel.contract.status.common.ContractStatusMonitorService&quot;)<br /> public class ContractStatusMonitorServiceImpl<br /> extends ru.bitel.bgbilling.kernel.contract.status.server.service.ContractStatusMonitorServiceImpl<br /> implements ContractStatusMonitorService<br /> {<br /> @Override<br /> public void changeContractStatus( int[] cids, int statusId, Date dateFrom, Date dateTo, String comment )<br /> throws BGException<br /> {<br /> //System.out.println(&quot;\t!\tchangeContractStatus&quot;);<br /> // [3]<br /> // ContractStatusMonitorService:changeContractStatus<br /> // @WebParam( name = &quot;comment&quot; ) String comment<br /> if( Utils.isBlankString( comment ) )<br /> {<br /> throw new BGMessageException( &quot;Введите комментарий&quot; );<br /> }<br /> super.changeContractStatus( cids, statusId, dateFrom, dateTo, comment );<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> --[[Участник:DimOn|dimOn]] 12:00, 28 ноября 2012 (UTC)</div> DimOn http://wiki.bitel.ru/index.php/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%B0%D0%BA%D1%88%D0%B5%D0%BD%D0%B0_%D0%B8_%D0%B2%D0%B5%D0%B1-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%BE%D0%B2 Примеры динамического кода акшена и веб-сервисов 2015-07-01T10:16:35Z <p>DimOn:&#32;/* Динамические веб-сервисы */</p> <hr /> <div>Динамическим кодом в данном случае можно как писать новые экшены (практическое значение имеют больше веб-экшены, т.е. экшены веб-интерфейса) и веб-сервисы, так и обёртывать существующие, т.е. заменять их, а внутри вызывать родительский метод, или не вызывать в зависимости от обстоятельств. Этим можно полностью заменить функционал такой, как [[запуск скрипта до и после акшена]]. Помимо того, что область применения шире, ещё динамичемским кодом просто быстрее, удобнее и надёжнее. В данном разделе рассмотрим примеры скриптов, совершенно аналогичные упомянутым в разделе «[[примеры скриптов до и после акшена]]», за исключением задачи &quot;проверка смены статуса&quot;, которую в старом механизме реализовать вообще невозможно, т.к. смена статуса реализована только в веб-сервисах и событий там никаких нету.<br /> <br /> == Динамические экшены ==<br /> <br /> В случае старых экшенов в конфигурацию сервера прописываются динамические классы, и то, что они заменяют. Динамический класс позволяет получить, чтобы потом заменить (обернуть) вызов метода родного класса.<br /> Параметр в конфиге примерно такой:<br /> &lt;source lang=&quot;text&quot;&gt;dynaction:&lt;модуль&gt;.&lt;режим.&gt;&lt;экшенкласснаме&gt;=дин.класс&lt;/source&gt;<br /> Примеры:<br /> &lt;source lang=&quot;text&quot;&gt;dynaction:contract.ActionCheckContractLimitUpdate=дин.класс<br /> dynaction:ru.bitel.bgbilling.plugins.crm.ActionUpdateRegisterTask=дин.класс<br /> dynaction:contract.web.ActionAdditionalAction=дин.класс&lt;/source&gt;<br /> '''Обратите внимание: там указывается НЕ package класса, а строка по указанной схеме.''' Класс может быть простой кастомный, унаследованный от самого корневого класса, но удобнее наследовать от самого перегружаемого класса, если потенциально нужна хоть какая-то логика из него. Внутри дин.класса при необходимости надо сделать явным образом вызов родительского метода (super.doAction, например). Если нужно только вывести ошибку, например, то унаследованный метод не нужно вызывать, очевидно. При поиске реализации соответствующего экшена сначала ищутся динамические классы прописанные. Дальше ничего не проверяется, что нашлось то и вернулось, т.е. если прописан dynaction, но косячный, то дальше не ищется, незачем.<br /> <br /> Для нашего примера прописать нужно следующее:<br /> &lt;source lang=&quot;text&quot;&gt;dynaction:contract.ActionUpdateContractLimit=ru.xxx.ActionUpdateContractLimit<br /> dynaction:ru.bitel.bgbilling.plugins.crm.ActionUpdateRegisterTask=ru.xxx.ActionUpdateRegisterTask&lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.sql.SQLException;<br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> import ru.bitel.common.Utils;<br /> <br /> /**<br /> * Перегруженный экшен для проверки некоторых параметров:<br /> * 2. Скрипт реализующий запрет изменения &quot;лимита&quot; договора в случае если поле комментарий пустое.<br /> * <br /> * В конфиг сервера прописывается:<br /> * dynaction:contract.ActionUpdateContractLimit=ru.xxx.ActionUpdateContractLimit<br /> * @author dimon<br /> */<br /> public class ActionUpdateContractLimit<br /> extends bitel.billing.server.contract.action.ActionUpdateContractLimit<br /> {<br /> @Override<br /> public void doAction() <br /> throws SQLException, BGException<br /> {<br /> //[2]<br /> //module=contract<br /> //action=UpdateContractLimit<br /> //comment=%ED%E5%E3%E5%ED<br /> // получаем параметры как в экшене<br /> String comment = getParameter( &quot;comment&quot;, &quot;&quot; );<br /> // если 1) комментарий пустой =&gt; ругаемся<br /> if( Utils.isBlankString( comment ) )<br /> {<br /> throw new BGMessageException( &quot;Введите комментарий&quot; );<br /> }<br /> // иначе вызываем родительский метод<br /> super.doAction();<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.sql.SQLException;<br /> import java.util.Date;<br /> <br /> import bitel.billing.common.TimeUtils;<br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> import ru.bitel.bgbilling.plugins.crm.common.model.RegisterTask;<br /> import ru.bitel.bgbilling.plugins.crm.server.dao.RegisterTaskManager;<br /> import ru.bitel.common.Utils;<br /> <br /> /**<br /> * Перегруженный экшен для проверки некоторых параметров:<br /> * 1. Скрипт реализующий запрет изменения &quot;срока&quot; задачи в плагине CRM всем кроме того кто задачу создал, а так же кроме отдельно обозначенного администратора.<br /> * 4. CRM: Нужно сделать так чтобы задачу нельзя было закрыть если поле &quot;Резолюция&quot; пустое.<br /> * <br /> * В конфиг сервера прописывается:<br /> * dynaction:ru.bitel.bgbilling.plugins.crm.ActionUpdateRegisterTask=ru.xxx.ActionUpdateRegisterTask<br /> * @author dimon<br /> */<br /> public class ActionUpdateRegisterTask<br /> extends ru.bitel.bgbilling.plugins.crm.server.action.ActionUpdateRegisterTask<br /> {<br /> /** ид отдельно обозначенного администратора */<br /> private final int ADMIN_USER = 1;<br /> <br /> @Override<br /> public void doAction() <br /> throws SQLException, BGException<br /> {<br /> // [1]<br /> // module=ru.bitel.bgbilling.plugins.crm<br /> // action=UpdateRegisterTask<br /> // id=32<br /> // target_date_and_time=21.04.2010+00%3A00<br /> // получаем параметры как в экшене<br /> int id = getIntParameter( &quot;id&quot;, -1 );<br /> Date targetDate = getDateParameter( &quot;target_date_and_time&quot;, &quot;dd.MM.yyyy HH:mm&quot;, null );<br /> if( targetDate == null )<br /> {<br /> targetDate = getDateParameter( &quot;target_date&quot;, &quot;dd.MM.yyyy&quot;, null );<br /> }<br /> // получаем таск<br /> RegisterTaskManager manager = new RegisterTaskManager( con );<br /> RegisterTask task = manager.getTaskById( id );<br /> // если 1) юзер не админ, и 2) юзер не тот кто создал задачу, то 3) проверяем время и если оно не такое =&gt; ругаемся<br /> if( userID != ADMIN_USER &amp;&amp; userID != task.getCreateUserId() &amp;&amp; !TimeUtils.dateEqual( targetDate, task.getTargetDate() ) )<br /> {<br /> throw new BGMessageException( &quot;Вам нельзя менять срок задачи&quot; );<br /> }<br /> // [4]<br /> // module=ru.bitel.bgbilling.plugins.crm<br /> // action=UpdateRegisterTask<br /> // status=2<br /> // resolution=%F0%E5%E7%EE%EB%FE%F6%E8%FF<br /> // получаем параметры как в экшене<br /> int status = getIntParameter( &quot;status&quot;, 0 );<br /> String resolution = getParameter( &quot;resolution&quot;, &quot;&quot; );<br /> //System.out.println(&quot;status=&quot;+status);<br /> //System.out.println(&quot;resolution=&quot;+resolution);<br /> // если 1) статус &quot;закрыто&quot; и 2) резолюция пустая =&gt; ругаемся<br /> if( status == 2 &amp;&amp; Utils.isBlankString( resolution ) )<br /> {<br /> throw new BGMessageException( &quot;Для закрытия заполните резолюцию&quot; );<br /> }<br /> // иначе вызываем родительский метод<br /> super.doAction();<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> ----<br /> <br /> В данном примере пользователям запрещено добавлять новый тарифный план датой ранее следующей за текущей, а так же запрещено закрывать тарифные планы датой ранее текущей.<br /> На пользователей входящих в группу администраторов ADMIN_GROUP = 1 данные ограничения не распространяются.<br /> Если на договоре нет никаких тарифных планов - разрешено указывать любые даты (т.е. если добавляемый тариф будет единственным - можно выставлять произвольные интервалы. Так было необходимо)<br /> <br /> &lt;source lang=&quot;text&quot;&gt;dynaction:contract.ActionUpdateContractTariffPlan=ru.xxx.updateContractTariffPlan&lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.sql.ResultSet;<br /> import java.sql.SQLException;<br /> import java.util.Calendar;<br /> import java.util.Date;<br /> import java.util.List;<br /> <br /> import bitel.billing.common.TimeUtils;<br /> import bitel.billing.server.admin.bgsecure.bean.UserGroupManager;<br /> <br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> <br /> <br /> public class updateContractTariffPlan <br /> extends bitel.billing.server.contract.action.ActionUpdateContractTariffPlan<br /> {<br /> //ID группы администраторов<br /> private final int ADMIN_GROUP = 1;<br /> <br /> @Override<br /> public void doAction() <br /> throws SQLException, BGException<br /> {<br /> UserGroupManager userGroupManager = new UserGroupManager(con);<br /> List&lt;Integer&gt; groups = userGroupManager.getUserGroups(userID);<br /> Calendar calendar = Calendar.getInstance();<br /> Date today = calendar.getTime();<br /> calendar.add(Calendar.DAY_OF_YEAR, 1);<br /> Date tomorrow = calendar.getTime();<br /> String id = getParameter(&quot;id&quot;, &quot;&quot;);<br /> Date date2 = TimeUtils.convertStringToDate(getParameter( &quot;date2&quot;, &quot;&quot; ));<br /> Date date1 = TimeUtils.convertStringToDate(getParameter( &quot;date1&quot;, &quot;&quot; ));<br /> <br /> if(!groups.contains(ADMIN_GROUP))<br /> {<br /> if(!id.equals(&quot;new&quot;) &amp; TimeUtils.dateBefore(date2, today))<br /> {<br /> throw new BGMessageException( &quot;Дата закрытия тарифного плана не может быть ранее текущей&quot; );<br /> }<br /> if(id.equals(&quot;new&quot;) &amp; TimeUtils.dateBefore(date1, tomorrow))<br /> {<br /> String query = &quot; SELECT COUNT(id) FROM contract_tariff WHERE cid=? &quot;;<br /> java.sql.PreparedStatement ps = con.prepareStatement( query );<br /> ps.setInt(1, cid);<br /> ResultSet rs = ps.executeQuery();<br /> while ( rs.next() )<br /> {<br /> int count = rs.getInt(1);<br /> if(count &gt; 0 )<br /> {<br /> throw new BGMessageException( &quot;Тарифный план должен устанавливаться датой следующей за текущей&quot; );<br /> }<br /> }<br /> rs.close();<br /> ps.close();<br /> }<br /> }<br /> // иначе вызываем родительский метод<br /> super.doAction();<br /> }<br /> }<br /> <br /> &lt;/source&gt;<br /> --[[Участник:Phricker]] 11:23, 17 февраля 2014 (UTC)<br /> <br /> == Динамические веб-сервисы ==<br /> <br /> Динамический класс позволяет заменить (обернуть) вызов метода вебсервиса. В отличие от старых методов экшенов в данном случае необходимо напрямую указать какой именно интерфейс вызова перегружается.<br /> Параметр в конфиге такой:<br /> &lt;source lang=&quot;text&quot;&gt;dynservice:&lt;модуль&gt;.&lt;интерфейс_сервиса&gt;=&lt;дин.класс&gt;&lt;/source&gt;<br /> Например:<br /> &lt;source lang=&quot;text&quot;&gt;dynservice:ru.bitel.bgbilling.kernel.contract.status.ContractStatusMonitorService=дин.класс&lt;/source&gt;<br /> Точно также удобнее унаследовать от родного Impl-класса соответствующего сервиса, чем писать с нуля.<br /> <br /> '''Обратите внимание: там указывается НЕ package для класса, а строка по указанной схеме.'''<br /> <br /> Обратите внимание, что в динамическом коде нужно ещё раз указать имплементацию интерфейса даже в этом случае наследования от старой имплементации (несмотря на то, что очевидно, родительский класс уже реализует указываемый интерфейс и по правилам ООП и так понятно что потомок тоже реализует, а по правилам Java не нужно указывать ещё раз implements ContractStatusMonitorService как в примере ниже).<br /> <br /> Внутри дин.класса при необходимости надо перегрузить нужный метод (или несколько), а после сделать (или не сделать, если обёртка отработала сама всё, например, вывела ошибку) явным образом вызов соответствующего родительского метода (super.blabla(foo,bar)).<br /> При поиске реализации сервиса сначала ищется среди динамических классов, но если в динкоде класс заявлен, но косячный, то дальше не ищем, незачем.<br /> <br /> Для нашего примера прописать нужно следующее:<br /> <br /> &lt;source lang=&quot;text&quot;&gt;dynservice:ru.bitel.bgbilling.kernel.contract.status.ContractStatusMonitorService=ru.xxx.ContractStatusMonitorServiceImpl&lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.util.Date;<br /> <br /> import javax.jws.WebService;<br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> import ru.bitel.bgbilling.kernel.contract.status.common.ContractStatusMonitorService;<br /> import ru.bitel.common.Utils;<br /> <br /> /**<br /> * Перегруженный вебсервис для проверки некоторых параметров:<br /> * 3. Скрипт реализующий запрет изменения &quot;Статуса&quot; договора в случае если поле комментарий пустое.<br /> * <br /> * В конфиг сервера прописывается:<br /> * dynservice:ru.bitel.bgbilling.kernel.contract.status.ContractStatusMonitorService=ru.xxx.ContractStatusMonitorServiceImpl<br /> * @author dimon<br /> */<br /> @WebService(endpointInterface = &quot;ru.bitel.bgbilling.kernel.contract.status.common.ContractStatusMonitorService&quot;)<br /> public class ContractStatusMonitorServiceImpl<br /> extends ru.bitel.bgbilling.kernel.contract.status.server.service.ContractStatusMonitorServiceImpl<br /> implements ContractStatusMonitorService<br /> {<br /> @Override<br /> public void changeContractStatus( int[] cids, int statusId, Date dateFrom, Date dateTo, String comment )<br /> throws BGException<br /> {<br /> //System.out.println(&quot;\t!\tchangeContractStatus&quot;);<br /> // [3]<br /> // ContractStatusMonitorService:changeContractStatus<br /> // @WebParam( name = &quot;comment&quot; ) String comment<br /> if( Utils.isBlankString( comment ) )<br /> {<br /> throw new BGMessageException( &quot;Введите комментарий&quot; );<br /> }<br /> super.changeContractStatus( cids, statusId, dateFrom, dateTo, comment );<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> --[[Участник:DimOn|dimOn]] 12:00, 28 ноября 2012 (UTC)</div> DimOn http://wiki.bitel.ru/index.php/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%B0%D0%BA%D1%88%D0%B5%D0%BD%D0%B0_%D0%B8_%D0%B2%D0%B5%D0%B1-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%BE%D0%B2 Примеры динамического кода акшена и веб-сервисов 2015-07-01T10:16:04Z <p>DimOn:&#32;/* Динамические экшены */</p> <hr /> <div>Динамическим кодом в данном случае можно как писать новые экшены (практическое значение имеют больше веб-экшены, т.е. экшены веб-интерфейса) и веб-сервисы, так и обёртывать существующие, т.е. заменять их, а внутри вызывать родительский метод, или не вызывать в зависимости от обстоятельств. Этим можно полностью заменить функционал такой, как [[запуск скрипта до и после акшена]]. Помимо того, что область применения шире, ещё динамичемским кодом просто быстрее, удобнее и надёжнее. В данном разделе рассмотрим примеры скриптов, совершенно аналогичные упомянутым в разделе «[[примеры скриптов до и после акшена]]», за исключением задачи &quot;проверка смены статуса&quot;, которую в старом механизме реализовать вообще невозможно, т.к. смена статуса реализована только в веб-сервисах и событий там никаких нету.<br /> <br /> == Динамические экшены ==<br /> <br /> В случае старых экшенов в конфигурацию сервера прописываются динамические классы, и то, что они заменяют. Динамический класс позволяет получить, чтобы потом заменить (обернуть) вызов метода родного класса.<br /> Параметр в конфиге примерно такой:<br /> &lt;source lang=&quot;text&quot;&gt;dynaction:&lt;модуль&gt;.&lt;режим.&gt;&lt;экшенкласснаме&gt;=дин.класс&lt;/source&gt;<br /> Примеры:<br /> &lt;source lang=&quot;text&quot;&gt;dynaction:contract.ActionCheckContractLimitUpdate=дин.класс<br /> dynaction:ru.bitel.bgbilling.plugins.crm.ActionUpdateRegisterTask=дин.класс<br /> dynaction:contract.web.ActionAdditionalAction=дин.класс&lt;/source&gt;<br /> '''Обратите внимание: там указывается НЕ package класса, а строка по указанной схеме.''' Класс может быть простой кастомный, унаследованный от самого корневого класса, но удобнее наследовать от самого перегружаемого класса, если потенциально нужна хоть какая-то логика из него. Внутри дин.класса при необходимости надо сделать явным образом вызов родительского метода (super.doAction, например). Если нужно только вывести ошибку, например, то унаследованный метод не нужно вызывать, очевидно. При поиске реализации соответствующего экшена сначала ищутся динамические классы прописанные. Дальше ничего не проверяется, что нашлось то и вернулось, т.е. если прописан dynaction, но косячный, то дальше не ищется, незачем.<br /> <br /> Для нашего примера прописать нужно следующее:<br /> &lt;source lang=&quot;text&quot;&gt;dynaction:contract.ActionUpdateContractLimit=ru.xxx.ActionUpdateContractLimit<br /> dynaction:ru.bitel.bgbilling.plugins.crm.ActionUpdateRegisterTask=ru.xxx.ActionUpdateRegisterTask&lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.sql.SQLException;<br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> import ru.bitel.common.Utils;<br /> <br /> /**<br /> * Перегруженный экшен для проверки некоторых параметров:<br /> * 2. Скрипт реализующий запрет изменения &quot;лимита&quot; договора в случае если поле комментарий пустое.<br /> * <br /> * В конфиг сервера прописывается:<br /> * dynaction:contract.ActionUpdateContractLimit=ru.xxx.ActionUpdateContractLimit<br /> * @author dimon<br /> */<br /> public class ActionUpdateContractLimit<br /> extends bitel.billing.server.contract.action.ActionUpdateContractLimit<br /> {<br /> @Override<br /> public void doAction() <br /> throws SQLException, BGException<br /> {<br /> //[2]<br /> //module=contract<br /> //action=UpdateContractLimit<br /> //comment=%ED%E5%E3%E5%ED<br /> // получаем параметры как в экшене<br /> String comment = getParameter( &quot;comment&quot;, &quot;&quot; );<br /> // если 1) комментарий пустой =&gt; ругаемся<br /> if( Utils.isBlankString( comment ) )<br /> {<br /> throw new BGMessageException( &quot;Введите комментарий&quot; );<br /> }<br /> // иначе вызываем родительский метод<br /> super.doAction();<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.sql.SQLException;<br /> import java.util.Date;<br /> <br /> import bitel.billing.common.TimeUtils;<br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> import ru.bitel.bgbilling.plugins.crm.common.model.RegisterTask;<br /> import ru.bitel.bgbilling.plugins.crm.server.dao.RegisterTaskManager;<br /> import ru.bitel.common.Utils;<br /> <br /> /**<br /> * Перегруженный экшен для проверки некоторых параметров:<br /> * 1. Скрипт реализующий запрет изменения &quot;срока&quot; задачи в плагине CRM всем кроме того кто задачу создал, а так же кроме отдельно обозначенного администратора.<br /> * 4. CRM: Нужно сделать так чтобы задачу нельзя было закрыть если поле &quot;Резолюция&quot; пустое.<br /> * <br /> * В конфиг сервера прописывается:<br /> * dynaction:ru.bitel.bgbilling.plugins.crm.ActionUpdateRegisterTask=ru.xxx.ActionUpdateRegisterTask<br /> * @author dimon<br /> */<br /> public class ActionUpdateRegisterTask<br /> extends ru.bitel.bgbilling.plugins.crm.server.action.ActionUpdateRegisterTask<br /> {<br /> /** ид отдельно обозначенного администратора */<br /> private final int ADMIN_USER = 1;<br /> <br /> @Override<br /> public void doAction() <br /> throws SQLException, BGException<br /> {<br /> // [1]<br /> // module=ru.bitel.bgbilling.plugins.crm<br /> // action=UpdateRegisterTask<br /> // id=32<br /> // target_date_and_time=21.04.2010+00%3A00<br /> // получаем параметры как в экшене<br /> int id = getIntParameter( &quot;id&quot;, -1 );<br /> Date targetDate = getDateParameter( &quot;target_date_and_time&quot;, &quot;dd.MM.yyyy HH:mm&quot;, null );<br /> if( targetDate == null )<br /> {<br /> targetDate = getDateParameter( &quot;target_date&quot;, &quot;dd.MM.yyyy&quot;, null );<br /> }<br /> // получаем таск<br /> RegisterTaskManager manager = new RegisterTaskManager( con );<br /> RegisterTask task = manager.getTaskById( id );<br /> // если 1) юзер не админ, и 2) юзер не тот кто создал задачу, то 3) проверяем время и если оно не такое =&gt; ругаемся<br /> if( userID != ADMIN_USER &amp;&amp; userID != task.getCreateUserId() &amp;&amp; !TimeUtils.dateEqual( targetDate, task.getTargetDate() ) )<br /> {<br /> throw new BGMessageException( &quot;Вам нельзя менять срок задачи&quot; );<br /> }<br /> // [4]<br /> // module=ru.bitel.bgbilling.plugins.crm<br /> // action=UpdateRegisterTask<br /> // status=2<br /> // resolution=%F0%E5%E7%EE%EB%FE%F6%E8%FF<br /> // получаем параметры как в экшене<br /> int status = getIntParameter( &quot;status&quot;, 0 );<br /> String resolution = getParameter( &quot;resolution&quot;, &quot;&quot; );<br /> //System.out.println(&quot;status=&quot;+status);<br /> //System.out.println(&quot;resolution=&quot;+resolution);<br /> // если 1) статус &quot;закрыто&quot; и 2) резолюция пустая =&gt; ругаемся<br /> if( status == 2 &amp;&amp; Utils.isBlankString( resolution ) )<br /> {<br /> throw new BGMessageException( &quot;Для закрытия заполните резолюцию&quot; );<br /> }<br /> // иначе вызываем родительский метод<br /> super.doAction();<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> ----<br /> <br /> В данном примере пользователям запрещено добавлять новый тарифный план датой ранее следующей за текущей, а так же запрещено закрывать тарифные планы датой ранее текущей.<br /> На пользователей входящих в группу администраторов ADMIN_GROUP = 1 данные ограничения не распространяются.<br /> Если на договоре нет никаких тарифных планов - разрешено указывать любые даты (т.е. если добавляемый тариф будет единственным - можно выставлять произвольные интервалы. Так было необходимо)<br /> <br /> &lt;source lang=&quot;text&quot;&gt;dynaction:contract.ActionUpdateContractTariffPlan=ru.xxx.updateContractTariffPlan&lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.sql.ResultSet;<br /> import java.sql.SQLException;<br /> import java.util.Calendar;<br /> import java.util.Date;<br /> import java.util.List;<br /> <br /> import bitel.billing.common.TimeUtils;<br /> import bitel.billing.server.admin.bgsecure.bean.UserGroupManager;<br /> <br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> <br /> <br /> public class updateContractTariffPlan <br /> extends bitel.billing.server.contract.action.ActionUpdateContractTariffPlan<br /> {<br /> //ID группы администраторов<br /> private final int ADMIN_GROUP = 1;<br /> <br /> @Override<br /> public void doAction() <br /> throws SQLException, BGException<br /> {<br /> UserGroupManager userGroupManager = new UserGroupManager(con);<br /> List&lt;Integer&gt; groups = userGroupManager.getUserGroups(userID);<br /> Calendar calendar = Calendar.getInstance();<br /> Date today = calendar.getTime();<br /> calendar.add(Calendar.DAY_OF_YEAR, 1);<br /> Date tomorrow = calendar.getTime();<br /> String id = getParameter(&quot;id&quot;, &quot;&quot;);<br /> Date date2 = TimeUtils.convertStringToDate(getParameter( &quot;date2&quot;, &quot;&quot; ));<br /> Date date1 = TimeUtils.convertStringToDate(getParameter( &quot;date1&quot;, &quot;&quot; ));<br /> <br /> if(!groups.contains(ADMIN_GROUP))<br /> {<br /> if(!id.equals(&quot;new&quot;) &amp; TimeUtils.dateBefore(date2, today))<br /> {<br /> throw new BGMessageException( &quot;Дата закрытия тарифного плана не может быть ранее текущей&quot; );<br /> }<br /> if(id.equals(&quot;new&quot;) &amp; TimeUtils.dateBefore(date1, tomorrow))<br /> {<br /> String query = &quot; SELECT COUNT(id) FROM contract_tariff WHERE cid=? &quot;;<br /> java.sql.PreparedStatement ps = con.prepareStatement( query );<br /> ps.setInt(1, cid);<br /> ResultSet rs = ps.executeQuery();<br /> while ( rs.next() )<br /> {<br /> int count = rs.getInt(1);<br /> if(count &gt; 0 )<br /> {<br /> throw new BGMessageException( &quot;Тарифный план должен устанавливаться датой следующей за текущей&quot; );<br /> }<br /> }<br /> rs.close();<br /> ps.close();<br /> }<br /> }<br /> // иначе вызываем родительский метод<br /> super.doAction();<br /> }<br /> }<br /> <br /> &lt;/source&gt;<br /> --[[Участник:Phricker]] 11:23, 17 февраля 2014 (UTC)<br /> <br /> == Динамические веб-сервисы ==<br /> <br /> Динамический класс позволяет заменить (обернуть) вызов метода вебсервиса. В отличие от старых методов экшенов в данном случае необходимо напрямую указать какой именно интерфейс вызова перегружается.<br /> Параметр в конфиге такой:<br /> &lt;source lang=&quot;text&quot;&gt;dynservice:&lt;модуль&gt;.&lt;интерфейс_сервиса&gt;=&lt;дин.класс&gt;&lt;/source&gt;<br /> Например:<br /> &lt;source lang=&quot;text&quot;&gt;dynservice:ru.bitel.bgbilling.kernel.contract.status.ContractStatusMonitorService=дин.класс&lt;/source&gt;<br /> Точно также удобнее унаследовать от родного Impl-класса соответствующего сервиса, чем писать с нуля.<br /> <br /> Обратите внимание, что в динамическом коде нужно ещё раз указать имплементацию интерфейса даже в этом случае наследования от старой имплементации (несмотря на то, что очевидно, родительский класс уже реализует указываемый интерфейс и по правилам ООП и так понятно что потомок тоже реализует, а по правилам Java не нужно указывать ещё раз implements ContractStatusMonitorService как в примере ниже).<br /> <br /> Внутри дин.класса при необходимости надо перегрузить нужный метод (или несколько), а после сделать (или не сделать, если обёртка отработала сама всё, например, вывела ошибку) явным образом вызов соответствующего родительского метода (super.blabla(foo,bar)).<br /> При поиске реализации сервиса сначала ищется среди динамических классов, но если в динкоде класс заявлен, но косячный, то дальше не ищем, незачем.<br /> <br /> Для нашего примера прописать нужно следующее:<br /> <br /> &lt;source lang=&quot;text&quot;&gt;dynservice:ru.bitel.bgbilling.kernel.contract.status.ContractStatusMonitorService=ru.xxx.ContractStatusMonitorServiceImpl&lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.util.Date;<br /> <br /> import javax.jws.WebService;<br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> import ru.bitel.bgbilling.kernel.contract.status.common.ContractStatusMonitorService;<br /> import ru.bitel.common.Utils;<br /> <br /> /**<br /> * Перегруженный вебсервис для проверки некоторых параметров:<br /> * 3. Скрипт реализующий запрет изменения &quot;Статуса&quot; договора в случае если поле комментарий пустое.<br /> * <br /> * В конфиг сервера прописывается:<br /> * dynservice:ru.bitel.bgbilling.kernel.contract.status.ContractStatusMonitorService=ru.xxx.ContractStatusMonitorServiceImpl<br /> * @author dimon<br /> */<br /> @WebService(endpointInterface = &quot;ru.bitel.bgbilling.kernel.contract.status.common.ContractStatusMonitorService&quot;)<br /> public class ContractStatusMonitorServiceImpl<br /> extends ru.bitel.bgbilling.kernel.contract.status.server.service.ContractStatusMonitorServiceImpl<br /> implements ContractStatusMonitorService<br /> {<br /> @Override<br /> public void changeContractStatus( int[] cids, int statusId, Date dateFrom, Date dateTo, String comment )<br /> throws BGException<br /> {<br /> //System.out.println(&quot;\t!\tchangeContractStatus&quot;);<br /> // [3]<br /> // ContractStatusMonitorService:changeContractStatus<br /> // @WebParam( name = &quot;comment&quot; ) String comment<br /> if( Utils.isBlankString( comment ) )<br /> {<br /> throw new BGMessageException( &quot;Введите комментарий&quot; );<br /> }<br /> super.changeContractStatus( cids, statusId, dateFrom, dateTo, comment );<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> --[[Участник:DimOn|dimOn]] 12:00, 28 ноября 2012 (UTC)</div> DimOn http://wiki.bitel.ru/index.php/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%B0%D0%BA%D1%88%D0%B5%D0%BD%D0%B0_%D0%B8_%D0%B2%D0%B5%D0%B1-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%BE%D0%B2 Примеры динамического кода акшена и веб-сервисов 2015-07-01T10:15:54Z <p>DimOn:&#32;/* Динамические экшены */</p> <hr /> <div>Динамическим кодом в данном случае можно как писать новые экшены (практическое значение имеют больше веб-экшены, т.е. экшены веб-интерфейса) и веб-сервисы, так и обёртывать существующие, т.е. заменять их, а внутри вызывать родительский метод, или не вызывать в зависимости от обстоятельств. Этим можно полностью заменить функционал такой, как [[запуск скрипта до и после акшена]]. Помимо того, что область применения шире, ещё динамичемским кодом просто быстрее, удобнее и надёжнее. В данном разделе рассмотрим примеры скриптов, совершенно аналогичные упомянутым в разделе «[[примеры скриптов до и после акшена]]», за исключением задачи &quot;проверка смены статуса&quot;, которую в старом механизме реализовать вообще невозможно, т.к. смена статуса реализована только в веб-сервисах и событий там никаких нету.<br /> <br /> == Динамические экшены ==<br /> <br /> В случае старых экшенов в конфигурацию сервера прописываются динамические классы, и то, что они заменяют. Динамический класс позволяет получить, чтобы потом заменить (обернуть) вызов метода родного класса.<br /> Параметр в конфиге примерно такой:<br /> &lt;source lang=&quot;text&quot;&gt;dynaction:&lt;модуль&gt;.&lt;режим.&gt;&lt;экшенкласснаме&gt;=дин.класс&lt;/source&gt;<br /> Примеры:<br /> &lt;source lang=&quot;text&quot;&gt;dynaction:contract.ActionCheckContractLimitUpdate=дин.класс<br /> dynaction:ru.bitel.bgbilling.plugins.crm.ActionUpdateRegisterTask=дин.класс<br /> dynaction:contract.web.ActionAdditionalAction=дин.класс&lt;/source&gt;<br /> '''Обратите внимание: там указывается НЕ package для класса, а строка по указанной схеме.''' Класс может быть простой кастомный, унаследованный от самого корневого класса, но удобнее наследовать от самого перегружаемого класса, если потенциально нужна хоть какая-то логика из него. Внутри дин.класса при необходимости надо сделать явным образом вызов родительского метода (super.doAction, например). Если нужно только вывести ошибку, например, то унаследованный метод не нужно вызывать, очевидно. При поиске реализации соответствующего экшена сначала ищутся динамические классы прописанные. Дальше ничего не проверяется, что нашлось то и вернулось, т.е. если прописан dynaction, но косячный, то дальше не ищется, незачем.<br /> <br /> Для нашего примера прописать нужно следующее:<br /> &lt;source lang=&quot;text&quot;&gt;dynaction:contract.ActionUpdateContractLimit=ru.xxx.ActionUpdateContractLimit<br /> dynaction:ru.bitel.bgbilling.plugins.crm.ActionUpdateRegisterTask=ru.xxx.ActionUpdateRegisterTask&lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.sql.SQLException;<br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> import ru.bitel.common.Utils;<br /> <br /> /**<br /> * Перегруженный экшен для проверки некоторых параметров:<br /> * 2. Скрипт реализующий запрет изменения &quot;лимита&quot; договора в случае если поле комментарий пустое.<br /> * <br /> * В конфиг сервера прописывается:<br /> * dynaction:contract.ActionUpdateContractLimit=ru.xxx.ActionUpdateContractLimit<br /> * @author dimon<br /> */<br /> public class ActionUpdateContractLimit<br /> extends bitel.billing.server.contract.action.ActionUpdateContractLimit<br /> {<br /> @Override<br /> public void doAction() <br /> throws SQLException, BGException<br /> {<br /> //[2]<br /> //module=contract<br /> //action=UpdateContractLimit<br /> //comment=%ED%E5%E3%E5%ED<br /> // получаем параметры как в экшене<br /> String comment = getParameter( &quot;comment&quot;, &quot;&quot; );<br /> // если 1) комментарий пустой =&gt; ругаемся<br /> if( Utils.isBlankString( comment ) )<br /> {<br /> throw new BGMessageException( &quot;Введите комментарий&quot; );<br /> }<br /> // иначе вызываем родительский метод<br /> super.doAction();<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.sql.SQLException;<br /> import java.util.Date;<br /> <br /> import bitel.billing.common.TimeUtils;<br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> import ru.bitel.bgbilling.plugins.crm.common.model.RegisterTask;<br /> import ru.bitel.bgbilling.plugins.crm.server.dao.RegisterTaskManager;<br /> import ru.bitel.common.Utils;<br /> <br /> /**<br /> * Перегруженный экшен для проверки некоторых параметров:<br /> * 1. Скрипт реализующий запрет изменения &quot;срока&quot; задачи в плагине CRM всем кроме того кто задачу создал, а так же кроме отдельно обозначенного администратора.<br /> * 4. CRM: Нужно сделать так чтобы задачу нельзя было закрыть если поле &quot;Резолюция&quot; пустое.<br /> * <br /> * В конфиг сервера прописывается:<br /> * dynaction:ru.bitel.bgbilling.plugins.crm.ActionUpdateRegisterTask=ru.xxx.ActionUpdateRegisterTask<br /> * @author dimon<br /> */<br /> public class ActionUpdateRegisterTask<br /> extends ru.bitel.bgbilling.plugins.crm.server.action.ActionUpdateRegisterTask<br /> {<br /> /** ид отдельно обозначенного администратора */<br /> private final int ADMIN_USER = 1;<br /> <br /> @Override<br /> public void doAction() <br /> throws SQLException, BGException<br /> {<br /> // [1]<br /> // module=ru.bitel.bgbilling.plugins.crm<br /> // action=UpdateRegisterTask<br /> // id=32<br /> // target_date_and_time=21.04.2010+00%3A00<br /> // получаем параметры как в экшене<br /> int id = getIntParameter( &quot;id&quot;, -1 );<br /> Date targetDate = getDateParameter( &quot;target_date_and_time&quot;, &quot;dd.MM.yyyy HH:mm&quot;, null );<br /> if( targetDate == null )<br /> {<br /> targetDate = getDateParameter( &quot;target_date&quot;, &quot;dd.MM.yyyy&quot;, null );<br /> }<br /> // получаем таск<br /> RegisterTaskManager manager = new RegisterTaskManager( con );<br /> RegisterTask task = manager.getTaskById( id );<br /> // если 1) юзер не админ, и 2) юзер не тот кто создал задачу, то 3) проверяем время и если оно не такое =&gt; ругаемся<br /> if( userID != ADMIN_USER &amp;&amp; userID != task.getCreateUserId() &amp;&amp; !TimeUtils.dateEqual( targetDate, task.getTargetDate() ) )<br /> {<br /> throw new BGMessageException( &quot;Вам нельзя менять срок задачи&quot; );<br /> }<br /> // [4]<br /> // module=ru.bitel.bgbilling.plugins.crm<br /> // action=UpdateRegisterTask<br /> // status=2<br /> // resolution=%F0%E5%E7%EE%EB%FE%F6%E8%FF<br /> // получаем параметры как в экшене<br /> int status = getIntParameter( &quot;status&quot;, 0 );<br /> String resolution = getParameter( &quot;resolution&quot;, &quot;&quot; );<br /> //System.out.println(&quot;status=&quot;+status);<br /> //System.out.println(&quot;resolution=&quot;+resolution);<br /> // если 1) статус &quot;закрыто&quot; и 2) резолюция пустая =&gt; ругаемся<br /> if( status == 2 &amp;&amp; Utils.isBlankString( resolution ) )<br /> {<br /> throw new BGMessageException( &quot;Для закрытия заполните резолюцию&quot; );<br /> }<br /> // иначе вызываем родительский метод<br /> super.doAction();<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> ----<br /> <br /> В данном примере пользователям запрещено добавлять новый тарифный план датой ранее следующей за текущей, а так же запрещено закрывать тарифные планы датой ранее текущей.<br /> На пользователей входящих в группу администраторов ADMIN_GROUP = 1 данные ограничения не распространяются.<br /> Если на договоре нет никаких тарифных планов - разрешено указывать любые даты (т.е. если добавляемый тариф будет единственным - можно выставлять произвольные интервалы. Так было необходимо)<br /> <br /> &lt;source lang=&quot;text&quot;&gt;dynaction:contract.ActionUpdateContractTariffPlan=ru.xxx.updateContractTariffPlan&lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.sql.ResultSet;<br /> import java.sql.SQLException;<br /> import java.util.Calendar;<br /> import java.util.Date;<br /> import java.util.List;<br /> <br /> import bitel.billing.common.TimeUtils;<br /> import bitel.billing.server.admin.bgsecure.bean.UserGroupManager;<br /> <br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> <br /> <br /> public class updateContractTariffPlan <br /> extends bitel.billing.server.contract.action.ActionUpdateContractTariffPlan<br /> {<br /> //ID группы администраторов<br /> private final int ADMIN_GROUP = 1;<br /> <br /> @Override<br /> public void doAction() <br /> throws SQLException, BGException<br /> {<br /> UserGroupManager userGroupManager = new UserGroupManager(con);<br /> List&lt;Integer&gt; groups = userGroupManager.getUserGroups(userID);<br /> Calendar calendar = Calendar.getInstance();<br /> Date today = calendar.getTime();<br /> calendar.add(Calendar.DAY_OF_YEAR, 1);<br /> Date tomorrow = calendar.getTime();<br /> String id = getParameter(&quot;id&quot;, &quot;&quot;);<br /> Date date2 = TimeUtils.convertStringToDate(getParameter( &quot;date2&quot;, &quot;&quot; ));<br /> Date date1 = TimeUtils.convertStringToDate(getParameter( &quot;date1&quot;, &quot;&quot; ));<br /> <br /> if(!groups.contains(ADMIN_GROUP))<br /> {<br /> if(!id.equals(&quot;new&quot;) &amp; TimeUtils.dateBefore(date2, today))<br /> {<br /> throw new BGMessageException( &quot;Дата закрытия тарифного плана не может быть ранее текущей&quot; );<br /> }<br /> if(id.equals(&quot;new&quot;) &amp; TimeUtils.dateBefore(date1, tomorrow))<br /> {<br /> String query = &quot; SELECT COUNT(id) FROM contract_tariff WHERE cid=? &quot;;<br /> java.sql.PreparedStatement ps = con.prepareStatement( query );<br /> ps.setInt(1, cid);<br /> ResultSet rs = ps.executeQuery();<br /> while ( rs.next() )<br /> {<br /> int count = rs.getInt(1);<br /> if(count &gt; 0 )<br /> {<br /> throw new BGMessageException( &quot;Тарифный план должен устанавливаться датой следующей за текущей&quot; );<br /> }<br /> }<br /> rs.close();<br /> ps.close();<br /> }<br /> }<br /> // иначе вызываем родительский метод<br /> super.doAction();<br /> }<br /> }<br /> <br /> &lt;/source&gt;<br /> --[[Участник:Phricker]] 11:23, 17 февраля 2014 (UTC)<br /> <br /> == Динамические веб-сервисы ==<br /> <br /> Динамический класс позволяет заменить (обернуть) вызов метода вебсервиса. В отличие от старых методов экшенов в данном случае необходимо напрямую указать какой именно интерфейс вызова перегружается.<br /> Параметр в конфиге такой:<br /> &lt;source lang=&quot;text&quot;&gt;dynservice:&lt;модуль&gt;.&lt;интерфейс_сервиса&gt;=&lt;дин.класс&gt;&lt;/source&gt;<br /> Например:<br /> &lt;source lang=&quot;text&quot;&gt;dynservice:ru.bitel.bgbilling.kernel.contract.status.ContractStatusMonitorService=дин.класс&lt;/source&gt;<br /> Точно также удобнее унаследовать от родного Impl-класса соответствующего сервиса, чем писать с нуля.<br /> <br /> Обратите внимание, что в динамическом коде нужно ещё раз указать имплементацию интерфейса даже в этом случае наследования от старой имплементации (несмотря на то, что очевидно, родительский класс уже реализует указываемый интерфейс и по правилам ООП и так понятно что потомок тоже реализует, а по правилам Java не нужно указывать ещё раз implements ContractStatusMonitorService как в примере ниже).<br /> <br /> Внутри дин.класса при необходимости надо перегрузить нужный метод (или несколько), а после сделать (или не сделать, если обёртка отработала сама всё, например, вывела ошибку) явным образом вызов соответствующего родительского метода (super.blabla(foo,bar)).<br /> При поиске реализации сервиса сначала ищется среди динамических классов, но если в динкоде класс заявлен, но косячный, то дальше не ищем, незачем.<br /> <br /> Для нашего примера прописать нужно следующее:<br /> <br /> &lt;source lang=&quot;text&quot;&gt;dynservice:ru.bitel.bgbilling.kernel.contract.status.ContractStatusMonitorService=ru.xxx.ContractStatusMonitorServiceImpl&lt;/source&gt;<br /> <br /> &lt;source lang=&quot;java&quot;&gt;<br /> package ru.xxx;<br /> <br /> import java.util.Date;<br /> <br /> import javax.jws.WebService;<br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.bgbilling.common.BGMessageException;<br /> import ru.bitel.bgbilling.kernel.contract.status.common.ContractStatusMonitorService;<br /> import ru.bitel.common.Utils;<br /> <br /> /**<br /> * Перегруженный вебсервис для проверки некоторых параметров:<br /> * 3. Скрипт реализующий запрет изменения &quot;Статуса&quot; договора в случае если поле комментарий пустое.<br /> * <br /> * В конфиг сервера прописывается:<br /> * dynservice:ru.bitel.bgbilling.kernel.contract.status.ContractStatusMonitorService=ru.xxx.ContractStatusMonitorServiceImpl<br /> * @author dimon<br /> */<br /> @WebService(endpointInterface = &quot;ru.bitel.bgbilling.kernel.contract.status.common.ContractStatusMonitorService&quot;)<br /> public class ContractStatusMonitorServiceImpl<br /> extends ru.bitel.bgbilling.kernel.contract.status.server.service.ContractStatusMonitorServiceImpl<br /> implements ContractStatusMonitorService<br /> {<br /> @Override<br /> public void changeContractStatus( int[] cids, int statusId, Date dateFrom, Date dateTo, String comment )<br /> throws BGException<br /> {<br /> //System.out.println(&quot;\t!\tchangeContractStatus&quot;);<br /> // [3]<br /> // ContractStatusMonitorService:changeContractStatus<br /> // @WebParam( name = &quot;comment&quot; ) String comment<br /> if( Utils.isBlankString( comment ) )<br /> {<br /> throw new BGMessageException( &quot;Введите комментарий&quot; );<br /> }<br /> super.changeContractStatus( cids, statusId, dateFrom, dateTo, comment );<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> --[[Участник:DimOn|dimOn]] 12:00, 28 ноября 2012 (UTC)</div> DimOn http://wiki.bitel.ru/index.php/%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_unload_status_%D1%81%D1%87%D0%B5%D1%82%D0%B0_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_HTTP-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81 Установка unload status счета через HTTP-запрос 2015-06-08T15:13:37Z <p>DimOn:&#32;Отмена правки 2500 участника Admin (обсуждение)</p> <hr /> <div>&lt;p&gt;В таблице счетов bill_data_{mid} есть поле unload_status - признак выгруженности счета во внешнюю систему. Но стандартного API для работы с ним нет, приходится изменять его напрямую в базе. Но не всегда разумно давать прямой доступ к базе внешней системе.&lt;/p&gt;<br /> <br /> &lt;p&gt;Решением является создание своего Action (см например [[Свой_action_в_личном_кабинете]]):<br /> <br /> <br /> == Для версии 5.1 ==<br /> <br /> В рабочей директории, например ~/playground делаем файлик ./bitel/billing/server/bill/action/ActionSetUnloadStatus.java :<br /> <br /> &lt;source lang=java&gt;<br /> package bitel.billing.server.bill.action;<br /> <br /> import java.sql.SQLException;<br /> import java.sql.PreparedStatement;<br /> import bitel.billing.common.BGException;<br /> import bitel.billing.server.bill.action.base.ActionBase;<br /> <br /> public class ActionSetUnloadStatus extends ActionBase {<br /> <br /> public void doAction() throws SQLException, BGException {<br /> int id = getIntParameter(&quot;id&quot;, -1);<br /> int status = getIntParameter(&quot;status&quot;, 0);<br /> if ((this.mid &lt;= 0) || (id &lt;= 0))<br /> {<br /> this.setWebParamsError();<br /> return;<br /> }<br /> <br /> String query = &quot;UPDATE bill_data_&quot; + this.mid + &quot; SET unload_status = ? WHERE id = ?&quot;;<br /> <br /> PreparedStatement localPreparedStatement = this.con.prepareStatement(query);<br /> localPreparedStatement.setInt(1, status);<br /> localPreparedStatement.setInt(2, id);<br /> localPreparedStatement.executeUpdate();<br /> }<br /> <br /> }<br /> <br /> &lt;/source&gt;<br /> <br /> Компилируем:<br /> javac -cp ./:/usr/local/BGBillingServer/lib/* bitel/billing/server/bill/action/ActionSetUnloadStatus.java<br /> <br /> Запаковываем:<br /> jar cf bill-my.jar ./<br /> <br /> Закидываем в lib биллинга:<br /> cp bill-my.jar /usr/local/BGBillingServer/lib/<br /> <br /> Перезапускаем BGBillingServer и можем обращаться по URL вида:<br /> &lt;source lang=&quot;bash&quot;&gt;http://&lt;ip&gt;:8080/bgbilling/executer?user=&lt;username&gt;&amp;pswd=&lt;pswd&gt;module=bill&amp;action=SetUnloadStatus&amp;mid=&lt;mid&gt;&amp;id=&lt;billID&gt;&amp;status=&lt;status&gt;&lt;/source&gt;<br /> &lt;/p&gt;<br /> <br /> == Для версий 4.6 и 5.0 ==<br /> <br /> &lt;source lang=java&gt;<br /> package bitel.billing.server.bill.action;<br /> <br /> import java.sql.*;<br /> <br /> public class ActionSetUnloadStatus extends ActionBase<br /> {<br /> public void doAction()<br /> throws SQLException<br /> {<br /> int id = getIntParameter(&quot;id&quot;, -1);<br /> int status = getIntParameter(&quot;status&quot;, 0);<br /> if ((this.mid &lt;= 0) || (id &lt;= 0))<br /> {<br /> setParamsError();<br /> return;<br /> }<br /> <br /> query = &quot;UPDATE bill_data_&quot;+this.mid+&quot; SET unload_status = ? WHERE id = ?&quot;;<br /> <br /> PreparedStatement ps = this.con.prepareStatement(query);<br /> ps.setInt(1, status);<br /> ps.setInt(2, id);<br /> ps.executeUpdate();<br /> }<br /> }&lt;/source&gt;<br /> <br /> &lt;p&gt;Для параноиков можно задать наш action в /usr/local/BGBillingServer/actions/bill.xml и ограничить права для пользователей.<br /> Только при задании id action-а в xml нужно позаботиться об уникальности и указать его равным, скажем 1001.<br /> &lt;/p&gt;</div> DimOn http://wiki.bitel.ru/index.php/%D0%A4%D0%B0%D0%B9%D0%BB:Bill_pdf_barcode_example.xsl Файл:Bill pdf barcode example.xsl 2015-03-19T12:35:11Z <p>DimOn:&#32;карточка bill с примерами штрих-кодов</p> <hr /> <div>карточка bill с примерами штрих-кодов</div> DimOn http://wiki.bitel.ru/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_XSLT/FO_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0_%D1%81%D0%BE_%D1%88%D1%82%D1%80%D0%B8%D1%85%D0%BA%D0%BE%D0%B4%D0%B0%D0%BC%D0%B8 Создание XSLT/FO шаблона со штрихкодами 2015-03-19T12:34:32Z <p>DimOn:&#32;/* Самый правильный путь */</p> <hr /> <div>При необходимости создания шаблонов, включающих в себя штрих-код, можно воспользоваться уже готовыми для импорта шаблонами, которые можно взять, например, [http://www.renderx.com/demos/barcodes.html отсюда]. Там же можно в режиме онлайн протестировать эти шаблоны.<br /> <br /> == Пример ==<br /> Пример шаблона с использованием штрихкода 2of5 interleaved - [[Медиа:barcode-example.zip]]. <br /> Размещаются в '''BGBillingServer/webroot/xsl'''.<br /> <br /> == Ещё ==<br /> * [[Квитанция телефонии физ. лицам]]<br /> * http://forum.bitel.ru/viewtopic.php?f=14&amp;t=1753<br /> * http://forum.bitel.ru/viewtopic.php?f=14&amp;t=3240<br /> * http://forum.bitel.ru/viewtopic.php?f=14&amp;t=5578<br /> <br /> == Живой пример ==<br /> <br /> === баркод: вариант на шаблоне code128.xsl ===<br /> &lt;source lang=&quot;xml&quot;&gt;<br /> &lt;!-- нужны файлы code128.xsl+code128-svg.xsl от RenderX --&gt;<br /> &lt;xsl:import href=&quot;code128.xsl&quot;/&gt;<br /> <br /> &lt;xsl:variable name=&quot;contractnumber&quot; select=&quot;@contract&quot;/&gt;<br /> &lt;xsl:variable name=&quot;barcode_value&quot; select=&quot;concat('SOF', $contractnumber)&quot;/&gt;<br /> &lt;fo:instream-foreign-object content-width=&quot;100%&quot; content-height=&quot;100%&quot;&gt;<br /> &lt;xsl:call-template name=&quot;barcode-code128&quot;&gt;<br /> &lt;xsl:with-param name=&quot;value&quot; select=&quot;$barcode_value&quot;/&gt;<br /> &lt;xsl:with-param name=&quot;subset&quot; select=&quot;'B'&quot;/&gt;<br /> &lt;xsl:with-param name=&quot;string&quot; select=&quot;$contractnumber&quot;/&gt;<br /> &lt;xsl:with-param name=&quot;quiet-vertical&quot;&gt;0.02cm&lt;/xsl:with-param&gt;<br /> &lt;xsl:with-param name=&quot;module&quot;&gt;0.01in&lt;/xsl:with-param&gt;<br /> &lt;/xsl:call-template&gt;<br /> &lt;/fo:instream-foreign-object&gt;<br /> &lt;/source&gt;<br /> --[[Участник:DimOn|dimOn]] 11:06, 19 марта 2015 (UTC)<br /> === баркод: вариант на встроенном хендлере ===<br /> &lt;source lang=&quot;xml&quot;&gt;<br /> &lt;xsl:variable name=&quot;contractnumber&quot; select=&quot;@contract&quot;/&gt;<br /> &lt;fo:external-graphic width=&quot;6.5cm&quot; height=&quot;1.1cm&quot;&gt;<br /> &lt;xsl:attribute name=&quot;src&quot;&gt;&lt;xsl:value-of select=&quot;concat('barcode:///128a|SOF', $contractnumber, '&amp;lt;SOH&amp;gt;')&quot;/&gt;&lt;/xsl:attribute&gt;<br /> &lt;/fo:external-graphic&gt;<br /> &lt;/source&gt;<br /> --[[Участник:DimOn|dimOn]] 11:06, 19 марта 2015 (UTC)<br /> <br /> == Самый правильный путь ==<br /> В биллинг встроен генератор штрих-кодов, который работает как возврат картинки по запросу с url-ом &quot;barcode:&quot; . Краткий пример приложен выше. Поддерживаются разные типа ШК: Code 128, EAN-13, EAN-8, PDF417, QR-code, 2of5i/ITF.<br /> <br /> Пример квитанции со всеми типами ШК:<br /> [[Файл:bill_pdf_barcode_example.xsl]]<br /> <br /> Тема на форуме для обсуждения и сообщения об ошибках:<br /> * forum.bitel.ru/viewtopic.php?f=1&amp;t=10296</div> DimOn http://wiki.bitel.ru/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_XSLT/FO_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0_%D1%81%D0%BE_%D1%88%D1%82%D1%80%D0%B8%D1%85%D0%BA%D0%BE%D0%B4%D0%B0%D0%BC%D0%B8 Создание XSLT/FO шаблона со штрихкодами 2015-03-19T12:31:48Z <p>DimOn:&#32;/* Самый правильный путь */</p> <hr /> <div>При необходимости создания шаблонов, включающих в себя штрих-код, можно воспользоваться уже готовыми для импорта шаблонами, которые можно взять, например, [http://www.renderx.com/demos/barcodes.html отсюда]. Там же можно в режиме онлайн протестировать эти шаблоны.<br /> <br /> == Пример ==<br /> Пример шаблона с использованием штрихкода 2of5 interleaved - [[Медиа:barcode-example.zip]]. <br /> Размещаются в '''BGBillingServer/webroot/xsl'''.<br /> <br /> == Ещё ==<br /> * [[Квитанция телефонии физ. лицам]]<br /> * http://forum.bitel.ru/viewtopic.php?f=14&amp;t=1753<br /> * http://forum.bitel.ru/viewtopic.php?f=14&amp;t=3240<br /> * http://forum.bitel.ru/viewtopic.php?f=14&amp;t=5578<br /> <br /> == Живой пример ==<br /> <br /> === баркод: вариант на шаблоне code128.xsl ===<br /> &lt;source lang=&quot;xml&quot;&gt;<br /> &lt;!-- нужны файлы code128.xsl+code128-svg.xsl от RenderX --&gt;<br /> &lt;xsl:import href=&quot;code128.xsl&quot;/&gt;<br /> <br /> &lt;xsl:variable name=&quot;contractnumber&quot; select=&quot;@contract&quot;/&gt;<br /> &lt;xsl:variable name=&quot;barcode_value&quot; select=&quot;concat('SOF', $contractnumber)&quot;/&gt;<br /> &lt;fo:instream-foreign-object content-width=&quot;100%&quot; content-height=&quot;100%&quot;&gt;<br /> &lt;xsl:call-template name=&quot;barcode-code128&quot;&gt;<br /> &lt;xsl:with-param name=&quot;value&quot; select=&quot;$barcode_value&quot;/&gt;<br /> &lt;xsl:with-param name=&quot;subset&quot; select=&quot;'B'&quot;/&gt;<br /> &lt;xsl:with-param name=&quot;string&quot; select=&quot;$contractnumber&quot;/&gt;<br /> &lt;xsl:with-param name=&quot;quiet-vertical&quot;&gt;0.02cm&lt;/xsl:with-param&gt;<br /> &lt;xsl:with-param name=&quot;module&quot;&gt;0.01in&lt;/xsl:with-param&gt;<br /> &lt;/xsl:call-template&gt;<br /> &lt;/fo:instream-foreign-object&gt;<br /> &lt;/source&gt;<br /> --[[Участник:DimOn|dimOn]] 11:06, 19 марта 2015 (UTC)<br /> === баркод: вариант на встроенном хендлере ===<br /> &lt;source lang=&quot;xml&quot;&gt;<br /> &lt;xsl:variable name=&quot;contractnumber&quot; select=&quot;@contract&quot;/&gt;<br /> &lt;fo:external-graphic width=&quot;6.5cm&quot; height=&quot;1.1cm&quot;&gt;<br /> &lt;xsl:attribute name=&quot;src&quot;&gt;&lt;xsl:value-of select=&quot;concat('barcode:///128a|SOF', $contractnumber, '&amp;lt;SOH&amp;gt;')&quot;/&gt;&lt;/xsl:attribute&gt;<br /> &lt;/fo:external-graphic&gt;<br /> &lt;/source&gt;<br /> --[[Участник:DimOn|dimOn]] 11:06, 19 марта 2015 (UTC)<br /> <br /> == Самый правильный путь ==<br /> В биллинг встроен генератор штрих-кодов, который работает как возврат картинки по запросу с url-ом &quot;barcode:&quot; . Краткий пример приложен выше. Поддерживаются разные типа ШК: Code 128, EAN-13, EAN-8, PDF417, QR-code, 2of5i/ITF.<br /> <br /> Пример квитанции со всеми типами ШК:<br /> <br /> Тема на форуме для обсуждения и сообщения об ошибках:<br /> * forum.bitel.ru/viewtopic.php?f=1&amp;t=10296</div> DimOn http://wiki.bitel.ru/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_XSLT/FO_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0_%D1%81%D0%BE_%D1%88%D1%82%D1%80%D0%B8%D1%85%D0%BA%D0%BE%D0%B4%D0%B0%D0%BC%D0%B8 Создание XSLT/FO шаблона со штрихкодами 2015-03-19T12:27:39Z <p>DimOn:&#32;</p> <hr /> <div>При необходимости создания шаблонов, включающих в себя штрих-код, можно воспользоваться уже готовыми для импорта шаблонами, которые можно взять, например, [http://www.renderx.com/demos/barcodes.html отсюда]. Там же можно в режиме онлайн протестировать эти шаблоны.<br /> <br /> == Пример ==<br /> Пример шаблона с использованием штрихкода 2of5 interleaved - [[Медиа:barcode-example.zip]]. <br /> Размещаются в '''BGBillingServer/webroot/xsl'''.<br /> <br /> == Ещё ==<br /> * [[Квитанция телефонии физ. лицам]]<br /> * http://forum.bitel.ru/viewtopic.php?f=14&amp;t=1753<br /> * http://forum.bitel.ru/viewtopic.php?f=14&amp;t=3240<br /> * http://forum.bitel.ru/viewtopic.php?f=14&amp;t=5578<br /> <br /> == Живой пример ==<br /> <br /> === баркод: вариант на шаблоне code128.xsl ===<br /> &lt;source lang=&quot;xml&quot;&gt;<br /> &lt;!-- нужны файлы code128.xsl+code128-svg.xsl от RenderX --&gt;<br /> &lt;xsl:import href=&quot;code128.xsl&quot;/&gt;<br /> <br /> &lt;xsl:variable name=&quot;contractnumber&quot; select=&quot;@contract&quot;/&gt;<br /> &lt;xsl:variable name=&quot;barcode_value&quot; select=&quot;concat('SOF', $contractnumber)&quot;/&gt;<br /> &lt;fo:instream-foreign-object content-width=&quot;100%&quot; content-height=&quot;100%&quot;&gt;<br /> &lt;xsl:call-template name=&quot;barcode-code128&quot;&gt;<br /> &lt;xsl:with-param name=&quot;value&quot; select=&quot;$barcode_value&quot;/&gt;<br /> &lt;xsl:with-param name=&quot;subset&quot; select=&quot;'B'&quot;/&gt;<br /> &lt;xsl:with-param name=&quot;string&quot; select=&quot;$contractnumber&quot;/&gt;<br /> &lt;xsl:with-param name=&quot;quiet-vertical&quot;&gt;0.02cm&lt;/xsl:with-param&gt;<br /> &lt;xsl:with-param name=&quot;module&quot;&gt;0.01in&lt;/xsl:with-param&gt;<br /> &lt;/xsl:call-template&gt;<br /> &lt;/fo:instream-foreign-object&gt;<br /> &lt;/source&gt;<br /> --[[Участник:DimOn|dimOn]] 11:06, 19 марта 2015 (UTC)<br /> === баркод: вариант на встроенном хендлере ===<br /> &lt;source lang=&quot;xml&quot;&gt;<br /> &lt;xsl:variable name=&quot;contractnumber&quot; select=&quot;@contract&quot;/&gt;<br /> &lt;fo:external-graphic width=&quot;6.5cm&quot; height=&quot;1.1cm&quot;&gt;<br /> &lt;xsl:attribute name=&quot;src&quot;&gt;&lt;xsl:value-of select=&quot;concat('barcode:///128a|SOF', $contractnumber, '&amp;lt;SOH&amp;gt;')&quot;/&gt;&lt;/xsl:attribute&gt;<br /> &lt;/fo:external-graphic&gt;<br /> &lt;/source&gt;<br /> --[[Участник:DimOn|dimOn]] 11:06, 19 марта 2015 (UTC)<br /> <br /> == Самый правильный путь ==<br /> В биллинг встроен генератор штрих-кодов, который работает как возврат картинки по запросу с url-ом &quot;barcode:&quot; . Краткий пример приложен выше. Поддерживаются разные типа ШК: Code 128, EAN-13, EAN-8, PDF417, QR-code, 2of5i/ITF.<br /> <br /> Пример квитанции со всеми типами ШК:<br /> <br /> Тема на форуме для обсуждения и сообщения об ошибках:</div> DimOn http://wiki.bitel.ru/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_XSLT/FO_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0_%D1%81%D0%BE_%D1%88%D1%82%D1%80%D0%B8%D1%85%D0%BA%D0%BE%D0%B4%D0%B0%D0%BC%D0%B8 Создание XSLT/FO шаблона со штрихкодами 2015-03-19T12:26:23Z <p>DimOn:&#32;</p> <hr /> <div>При необходимости создания шаблонов, включающих в себя штрих-код, можно воспользоваться уже готовыми для импорта шаблонами, которые можно взять, например, [http://www.renderx.com/demos/barcodes.html отсюда]. Там же можно в режиме онлайн протестировать эти шаблоны.<br /> <br /> == Пример ==<br /> Пример шаблона с использованием штрихкода 2of5 interleaved - [[Медиа:barcode-example.zip]]. <br /> Размещаются в '''BGBillingServer/webroot/xsl'''.<br /> <br /> == Ещё ==<br /> * [[Квитанция телефонии физ. лицам]]<br /> * http://forum.bitel.ru/viewtopic.php?f=14&amp;t=1753<br /> * http://forum.bitel.ru/viewtopic.php?f=14&amp;t=3240<br /> * http://forum.bitel.ru/viewtopic.php?f=14&amp;t=5578<br /> <br /> == Живой пример ==<br /> <br /> === баркод: вариант на шаблоне code128.xsl ===<br /> &lt;source lang=&quot;xml&quot;&gt;<br /> &lt;!-- нужны файлы code128.xsl+code128-svg.xsl от RenderX --&gt;<br /> &lt;xsl:import href=&quot;code128.xsl&quot;/&gt;<br /> <br /> &lt;xsl:variable name=&quot;contractnumber&quot; select=&quot;@contract&quot;/&gt;<br /> &lt;xsl:variable name=&quot;barcode_value&quot; select=&quot;concat('SOF', $contractnumber)&quot;/&gt;<br /> &lt;fo:instream-foreign-object content-width=&quot;100%&quot; content-height=&quot;100%&quot;&gt;<br /> &lt;xsl:call-template name=&quot;barcode-code128&quot;&gt;<br /> &lt;xsl:with-param name=&quot;value&quot; select=&quot;$barcode_value&quot;/&gt;<br /> &lt;xsl:with-param name=&quot;subset&quot; select=&quot;'B'&quot;/&gt;<br /> &lt;xsl:with-param name=&quot;string&quot; select=&quot;$contractnumber&quot;/&gt;<br /> &lt;xsl:with-param name=&quot;quiet-vertical&quot;&gt;0.02cm&lt;/xsl:with-param&gt;<br /> &lt;xsl:with-param name=&quot;module&quot;&gt;0.01in&lt;/xsl:with-param&gt;<br /> &lt;/xsl:call-template&gt;<br /> &lt;/fo:instream-foreign-object&gt;<br /> &lt;/source&gt;<br /> --[[Участник:DimOn|dimOn]] 11:06, 19 марта 2015 (UTC)<br /> === баркод: вариант на встроенном хендлере ===<br /> &lt;source lang=&quot;xml&quot;&gt;<br /> &lt;xsl:variable name=&quot;contractnumber&quot; select=&quot;@contract&quot;/&gt;<br /> &lt;fo:external-graphic width=&quot;6.5cm&quot; height=&quot;1.1cm&quot;&gt;<br /> &lt;xsl:attribute name=&quot;src&quot;&gt;&lt;xsl:value-of select=&quot;concat('barcode:///128a|SOF', $contractnumber, '&amp;lt;SOH&amp;gt;')&quot;/&gt;&lt;/xsl:attribute&gt;<br /> &lt;/fo:external-graphic&gt;<br /> &lt;/source&gt;<br /> --[[Участник:DimOn|dimOn]] 11:06, 19 марта 2015 (UTC)<br /> <br /> == Самый правильный путь ==<br /> В биллинг встроен генератор штрих-кодов, который работает как возврат картинки по запросу с url-ом &quot;barcode:&quot; . Краткий пример приложен выше. Поддерживаются разные типа ШК: Code 128, EAN-13, EAN-8, PDF417, QR-code, 2of5i/ITF.<br /> <br /> Пример квитанции со всеми типами ШК:</div> DimOn http://wiki.bitel.ru/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_XSLT/FO_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0_%D1%81%D0%BE_%D1%88%D1%82%D1%80%D0%B8%D1%85%D0%BA%D0%BE%D0%B4%D0%B0%D0%BC%D0%B8 Создание XSLT/FO шаблона со штрихкодами 2015-03-19T11:06:47Z <p>DimOn:&#32;</p> <hr /> <div>При необходимости создания шаблонов, включающих в себя штрих-код, можно воспользоваться уже готовыми для импорта шаблонами, которые можно взять, например, [http://www.renderx.com/demos/barcodes.html отсюда]. Там же можно в режиме онлайн протестировать эти шаблоны.<br /> <br /> == Пример ==<br /> Пример шаблона с использованием штрихкода 2of5 interleaved - [[Медиа:barcode-example.zip]]. <br /> Размещаются в '''BGBillingServer/webroot/xsl'''.<br /> <br /> == Ещё ==<br /> * [[Квитанция телефонии физ. лицам]]<br /> * http://forum.bitel.ru/viewtopic.php?f=14&amp;t=1753<br /> * http://forum.bitel.ru/viewtopic.php?f=14&amp;t=3240<br /> * http://forum.bitel.ru/viewtopic.php?f=14&amp;t=5578<br /> <br /> == Живой пример ==<br /> <br /> === баркод: вариант на шаблоне code128.xsl ===<br /> &lt;source lang=&quot;xml&quot;&gt;<br /> &lt;!-- нужны файлы code128.xsl+code128-svg.xsl от RenderX --&gt;<br /> &lt;xsl:import href=&quot;code128.xsl&quot;/&gt;<br /> <br /> &lt;xsl:variable name=&quot;contractnumber&quot; select=&quot;@contract&quot;/&gt;<br /> &lt;xsl:variable name=&quot;barcode_value&quot; select=&quot;concat('SOF', $contractnumber)&quot;/&gt;<br /> &lt;fo:instream-foreign-object content-width=&quot;100%&quot; content-height=&quot;100%&quot;&gt;<br /> &lt;xsl:call-template name=&quot;barcode-code128&quot;&gt;<br /> &lt;xsl:with-param name=&quot;value&quot; select=&quot;$barcode_value&quot;/&gt;<br /> &lt;xsl:with-param name=&quot;subset&quot; select=&quot;'B'&quot;/&gt;<br /> &lt;xsl:with-param name=&quot;string&quot; select=&quot;$contractnumber&quot;/&gt;<br /> &lt;xsl:with-param name=&quot;quiet-vertical&quot;&gt;0.02cm&lt;/xsl:with-param&gt;<br /> &lt;xsl:with-param name=&quot;module&quot;&gt;0.01in&lt;/xsl:with-param&gt;<br /> &lt;/xsl:call-template&gt;<br /> &lt;/fo:instream-foreign-object&gt;<br /> &lt;/source&gt;<br /> --[[Участник:DimOn|dimOn]] 11:06, 19 марта 2015 (UTC)<br /> === баркод: вариант на встроенном хендлере ===<br /> &lt;source lang=&quot;xml&quot;&gt;<br /> &lt;xsl:variable name=&quot;contractnumber&quot; select=&quot;@contract&quot;/&gt;<br /> &lt;fo:external-graphic width=&quot;6.5cm&quot; height=&quot;1.1cm&quot;&gt;<br /> &lt;xsl:attribute name=&quot;src&quot;&gt;&lt;xsl:value-of select=&quot;concat('barcode:///128a|SOF', $contractnumber, '&amp;lt;SOH&amp;gt;')&quot;/&gt;&lt;/xsl:attribute&gt;<br /> &lt;/fo:external-graphic&gt;<br /> &lt;/source&gt;<br /> --[[Участник:DimOn|dimOn]] 11:06, 19 марта 2015 (UTC)</div> DimOn http://wiki.bitel.ru/index.php/%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F_%D0%BF%D1%80%D0%B8%D1%85%D0%BE%D0%B4%D1%8F%D1%89%D0%B5%D0%B3%D0%BE_%D0%BF%D0%BB%D0%B0%D1%82%D0%B5%D0%B6%D0%B0_(%D1%81%D0%BD%D1%8F%D1%82%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D0%BD%D1%82%D0%B0) Модификация приходящего платежа (снятие процента) 2015-03-03T12:22:09Z <p>DimOn:&#32;Новая страница: «Динамический код на событие &quot;приход платежа&quot;. Позволяет снять с приходящего платежа проце…»</p> <hr /> <div>Динамический код на событие &quot;приход платежа&quot;. Позволяет снять с приходящего платежа процент. В данном примере снимается 5% за платежи, приходящие через систему Assist.<br /> &lt;source lang=&quot;java&quot;&gt;package ru.qwerty;<br /> <br /> import java.math.BigDecimal;<br /> import java.sql.Connection;<br /> <br /> import ru.bitel.bgbilling.kernel.contract.balance.common.bean.Payment;<br /> import ru.bitel.bgbilling.kernel.contract.balance.server.bean.PaymentDao;<br /> import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase;<br /> import ru.bitel.bgbilling.server.util.ServerUtils;<br /> import ru.bitel.bgbilling.server.util.Setup;<br /> import ru.bitel.common.sql.ConnectionSet;<br /> import bitel.billing.server.contract.bean.BalanceUtils;<br /> import bitel.billing.server.contract.bean.Contract;<br /> import bitel.billing.server.contract.bean.ContractManager;<br /> <br /> /**<br /> * Событие на приход платежа (асинхронное).<br /> * Вычитает из платежа нужный процент и модифицирует комментарий.<br /> * @author dimon<br /> */<br /> public class AssistPayment<br /> extends EventScriptBase&lt;ru.bitel.bgbilling.kernel.contract.balance.server.event.PaymentEvent&gt;<br /> {<br /> /** тип платежа, который будет обрабатываться */<br /> private static int PAYMENT_TYPE = 33;<br /> /** множитель суммы платежа */<br /> private static BigDecimal MULTIPLIER = new BigDecimal(&quot;0.95&quot;);<br /> /** шаблон комментария платежа (первый параметр %s - оригинальная сумма, второй - оригинальный комментарий, знак процента должен дублироваться) */<br /> private static String COMMENT = &quot;Платёж %s р. (комиссия 5%%) - %s&quot;;<br /> <br /> @Override<br /> public void onEvent( ru.bitel.bgbilling.kernel.contract.balance.server.event.PaymentEvent event, Setup setup, ConnectionSet connectionSet )<br /> throws Exception<br /> {<br /> Payment contractPayment = event.getPayment();<br /> if( contractPayment.getTypeId() == PAYMENT_TYPE &amp;&amp; !event.isEditMode() )<br /> {<br /> Connection con = connectionSet.getConnection();<br /> <br /> BigDecimal originalSumm = contractPayment.getSum();<br /> String originalComment = contractPayment.getComment();<br /> <br /> contractPayment.setSum(originalSumm.multiply(MULTIPLIER));<br /> contractPayment.setComment(String.format(COMMENT, originalSumm, originalComment));<br /> <br /> new PaymentDao( con ).update( contractPayment );<br /> // обновление баланса<br /> Contract contract = new ContractManager( con ).getContractById( contractPayment.getContractId() );<br /> ServerUtils.commitConnection( con ); // во избежание косяка с необновлением баланса при параллельных транзакциях коммитим после изменения платежа/расхода {213fc512-b1b2-4787-926c-a5bc44eb615a}<br /> new BalanceUtils( con ).updateBalance( contractPayment.getDate(), contract );<br /> ServerUtils.commitConnection( con );<br /> //EventProcessor.getInstance().publish( new PaymentEvent( User.USER_SERVER, contractPayment ) );<br /> //EventProcessor.getInstance().publish( new ContractBalanceChangedEvent( contract.getId(), contractPayment.getSum() ) );<br /> }<br /> }<br /> }<br /> &lt;/source&gt;</div> DimOn http://wiki.bitel.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0 Заглавная страница 2015-03-03T12:19:58Z <p>DimOn:&#32;/* Ядро */</p> <hr /> <div>== О BiTel Wiki ==<br /> Здесь вы можете получить больше информации о продуктах BiTel: BGBilling, BGCRM, а также поделиться своим опытом с другими пользователями. В то время как документация часто предоставляет общие сведения о системе и ее настройках, в WiKi приводятся конкретные примеры.<br /> <br /> * &lt;b&gt;[[Как выложить статью на WiKi]]&lt;/b&gt;<br /> * [[Оформление статей]]<br /> * [http://forum.bitel.ru/ Форум BiTel]<br /> <br /> == Специалисты ==<br /> Уважаемые &quot;продвинутые пользователи&quot;. Здесь вы можете располагать записи со своими контактами для оказания воздмездной или безвозмездной помощи по настройке системы BGBilling пользователям, не столь далеко продвинувшимся. Желательно указывать ваши контактные данные и &quot;специализацию&quot;. Отзывы по исполнителям можно оставить/почитать [http://forum.bitel.ru/viewtopic.php?t=9329 на форуме].<br /> {| border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;<br /> |- valign=top align=&quot;center&quot; bgcolor=&quot;#eeeeee&quot; <br /> | Имя || Специализация || Контакт || Примечания<br /> |-<br /> | Рустам Тазуркаев || Mikrotik, переход с NetUp, CISCO || [[Изображение:Cpec_2_contact.png]] &lt;!-- ICQ: 648986--&gt; ||<br /> |-<br /> | Михаил Чернобаев || Скрипты биллинга, FreeBSD MPD || ICQ: 262986492 || Скриптование в биллинге, возможны крупные проекты.<br /> |- <br /> | Борис Близнюков || Скрипты биллинга, CISCO, Voip, Mera || [[Изображение:Cpec_4_contact.png]] &lt;!--ICQ: 1996944--&gt; || Только бесплатные краткие консультации. Очень хороший специалист по CISCO.<br /> |-<br /> | Андрей Бехтерев || Cisco, UNIX, ISP, Asterisk || ICQ: 7021464 WEB: http://behterev.su/ || Обширный спектр оборудования. Консалтинг.<br /> |-<br /> | Гершевич М.М. || Доработка конфигурации 1С и прочего ПО. || Тел. +79248454888 +7-(4162)-238-777 WEB: http://www.amurimpulse.ru/ mail: mike1008@mail.ru || Консалтинг. Информационная безопасность. Интеграция биллинга. Крупные проекты. Работа под заказ.<br /> |-<br /> | Андрей Зюзенков || Linux, BGBilling || http://bghelp.ru ICQ: 639121822 jabber: zavndw@jabber.ru e-mail: info@bghelp.ru skype: zavndw || Обслуживание и внедрение BGBilling и BGCRM<br /> |-<br /> | Семён Кошечкин || Java || email/gtalk: [[Файл:Cpec_5_contact.jpg]]|| Скрипты, дополнения, модуль Inet. [[%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:Contributions/Cromeshnic|wiki]]<br /> |-<br /> |-<br /> | Конференция BGBilling || вопросы касаемо системы BGBilling || bgbilling@conference.jabber.ru || Администраторы АСР BGBillig(иногда и разработчики) помогают друг другу в разных вопросах.<br /> |}<br /> <br /> == BGBilling ==<br /> === Установка ===<br /> * [[Установка на gentoo]]<br /> * [[Установка на Sun Solaris]]<br /> * [[Установка на Slackware]]<br /> * [[Установка на FreeBSD]]<br /> * [[Установка на Ubuntu 8 Desktop]]<br /> * [[Установка на Ubuntu 9.10 Desktop]]<br /> <br /> ==== Перенос данных в биллинг ====<br /> *[[Пример конвертера данных из csv-файлов в базу BGBilling]]<br /> *[[Пример конвертера данных из CSV-файлов в базу BGBilling - 2]]<br /> *[[Пример конвертера данных из CSV-файлов в базу BGBilling - 3]]<br /> *[[Конвертер базы Netup]]<br /> *[[Примеры конвертеров данных из других биллинговых систем]]<br /> <br /> === Администрирование ===<br /> * [[Разграничение прав действий]]<br /> * [[Настройка безопасности сервера биллинга и компонентов биллинга]]<br /> * [[Принудительный останов процессов биллинга]]<br /> * [[Использование подписанного SSL сертификата]]<br /> * [[Запуск scheduler и data_loader с другими портами управления]]<br /> * [[bg-snmp-management|Мониторинг java-процессов по snmp]]<br /> * [[Скрипты автостарта демонов bgbilling для Debian]]<br /> * [[javaws|Запуск BGBillingClient через Java Web Start]]<br /> * [[Мониторинг Inet-Radius через JMX]]<br /> * [[Интеграция существующего сертификата и приватного ключа SSL в хранилище keystore]]<br /> <br /> === Настройка вспомогательного ПО ===<br /> *[[Проксирование обращений к BGBillingServer посредством nginx]]<br /> <br /> ==== MySQL ====<br /> *[[Рекомендации по настройке MySQL]]<br /> *[[database backup|Backup MySQL базы с помощью snapshot'ов (Linux, LVM)]]<br /> *[[Настройка MySQL репликации]]<br /> *[[Установка триггера в MySQL для отслеживания изменений]]<br /> *[[Скрипт восстановления MySQL репликации]]<br /> *[[Simple DB backup]]<br /> <br /> ==== NetFlow ====<br /> *[[Настройка NetFlow-агента IPCAD]]<br /> *[[Разделение NetFlow-потоков]]<br /> <br /> === Технологии ===<br /> *[[BGBilling_XSLT|XSLT]]<br /> <br /> === Разработка ===<br /> *[[Отладка action'ов в IntelliJ IDEA]]<br /> *[[Разработка динамического кода в IDE Eclipse]]<br /> <br /> === [[XSLT]] шаблоны ===<br /> *[[Добавление параметров договора на страницу личного кабинета]]<br /> &lt;!-- *[[Красивые графики статистики в модуле IPN]] --&gt;<br /> *[[Карточки договора]]<br /> *[[Создание XSLT/FO шаблона со штрихкодами]]<br /> *[[Подстановка данных в зависимости от текущего пользователя биллинга]]<br /> *[[Генерация прайса модуля IP телефонии в карточке договора]]<br /> <br /> ==== Счета ====<br /> *[[Печать счета-фактуры и акта на отдельных листах]]<br /> *[[Расширенные счета модуля бухгалтерии]]<br /> *[[Квитанция телефонии физ. лицам]]<br /> *[[Шаблоны вывода названия месяца]]<br /> *[[Изменения в шаблоне в зависимости от месяца документа]]<br /> *[[Добавление новых шрифтов в FO шаблоны]]<br /> <br /> === Интеграция с внешними системами ===<br /> * [[Прямая интеграция с платежными терминалами ЭСФОР / SFOUR]]<br /> * [[Интеграция с платежной системой с использованием модуля Card]]<br /> * [[Интеграция с платежной системой Robokassa]]<br /> * [[SMS рассылка через SMPP]]<br /> * [[SMS рассылка через SMPP по средствам дин кода в 5.2]]<br /> * [[Система учета &quot;Заявки и Наряды&quot; на java]]<br /> * [[Bash скрипт-отсылка смс через телефон при отсутствие ping на заданный узел]]<br /> * [[Запросы в личный кабинет пользователя сторонними системами]]<br /> * [[Запросы к серверу биллинга сторонними системами]]<br /> <br /> ==== 1С ====<br /> * [[BGBilling-1C]]<br /> * [[amurimpulse.ru bgbilling]]<br /> * [[Integrator 1C-BGBilling]]<br /> * [[Пример обращения к биллингу из 1С v.7.7]]<br /> * [[Пример интеграции с 1С v.7.7]]<br /> * [[Пример интеграции с 1С v.8.1]]<br /> * [[Установка unload_status счета через HTTP-запрос]]<br /> <br /> === Динамический код (скрипты BGBS для старых версий) ===<br /> *[[Логгирование в скриптах поведения]]<br /> <br /> ==== Динамический код ====<br /> *[[Конвертирование адреса]]<br /> *[[Глобальная синхронзация услуг модуля npay с тарифным планом]]<br /> *[[Новый номер договора группе договоров]]<br /> *[[Скрипт проверки таймзон (timezone, tz, tzdata) в java]]<br /> <br /> ==== Комплексные решения ====<br /> *[[Предоставление тестового периода пользования услугой]]<br /> *[[Организация системы отслеживания и отключения КТВ должников на BGBS с использованием CRM плагина]]<br /> *[[Автоматизация подключений VPN-клиентов с использованием CRM плагина]]<br /> *[[Пример автоматизации подключения новых клиентов]]<br /> <br /> ==== Глобальные скрипты ====<br /> *[[Скрипт глобальный отмены перехода на тарифы при неоплате]]<br /> *[[Скрипт предоставление скидки пенсионерам]]<br /> *[[Скрипт создания субдоговоров по шаблону]]<br /> *[[Глобальное событие запуска сервера]]<br /> *[[Перемещение в группу через 3 месяца если не было движения денег в наработке]]<br /> *[[Поиск и изменение статусов у договоров]]<br /> *[[Получение списка доступных действий в SQL]]<br /> *[[Глобальный скрипт для удаления старых таблиц]]<br /> <br /> ==== Пользовательские библиотеки скриптов ====<br /> *[[Пересчеты и бонусы]]<br /> *[[Архивирование логов netflow и radius accaunting]]<br /> <br /> ==== Ядро ====<br /> *[[Смена тарифного плана по заданию пользователя]]<br /> *[[Валидация текстового параметра]]<br /> *[[Проверка ИНН/КПП при вводе]]<br /> *[[Проверка параметра договора перед изменением]]<br /> *[[Обработка смены параметра договора]]<br /> *[[Создание списка дополнительных действий для договора]]<br /> *[[Обработка события создания договора]]<br /> *[[Обработка события &quot;добавление услуги RSCM в договор&quot; . Скипт сменяет тариф, подключает абонплату ]]<br /> *[[Приостановление договора клиентом через WEB]]<br /> *[[Скрипт проверки баланса и отключения договора]]<br /> *[[Изменение стандартной логики перетирания статусов]]<br /> *[[Пример продажи OEM ключей с помощью скрипта]]<br /> *[[Пример копирования тарифного плана]]<br /> *[[Получение текущего пользователя биллинга]]<br /> *[[Запуск скрипта до и после акшена]]<br /> *[[Примеры скриптов до и после акшена]]<br /> *[[Примеры динамического кода акшена и веб-сервисов]]<br /> *[[Начисление бонусов на счет при платежах определенного типа]]<br /> *[[Включение должников по приходу платежа]]<br /> *[[Снижение лимита при внесении расхода]]<br /> *[[Изменение суммы лимита определенной группе договоров]]<br /> *[[Синхронизация услуг договора в соответствии с тарифными планами]]<br /> *[[Добавление группы и снятие в зависимости от статуса]]<br /> *[[Управление статусом договора по состоянию баланса]]<br /> *[[Запрет на вход в личный кабинет с закрытых договоров]]<br /> *[[Переход на понижающий тариф только со следующего месяца]]<br /> *[[Пример создания своего интерфейса в клиенте]]<br /> *[[Метки услуг]]<br /> *[[Сравнение прав пользователей]]<br /> *[[Свой список шаблонов договоров]]<br /> *[[Модификация приходящего платежа (снятие процента)]]<br /> <br /> ==== Модуль Bill ====<br /> *[[Создание счета в модуле Bill]]<br /> *[[Создание счета из суммы платежей по классу договоров]]<br /> *[[Создание счета по таблице позиций]]<br /> *[[Создание счета и счет-фактур в модуле Bill(выполнение тех же действий что и руками)]]<br /> *[[Создание счетов на предоплату]]<br /> *[[Распечатка счетов в pdf по событию генерации счета]]<br /> *[[Внешняя программа на JAVA для синхронизации номеров счетов и актов выполненных работ (версия BGBilling 5.0)]]<br /> *[[Автоматическая отправка счетов через глобальный скрипт поведения]]<br /> <br /> ==== Модуль DialUp ====<br /> *[[Запуск переначисления в модуле DialUp]]<br /> *[[Передача ACCEPT вместо REJECT вместе с доп. аттрибутами]]<br /> *[[Обработка запроса учетного периода]]<br /> *[[Переинициализация тарифа в пределах сессии | Обработка запроса учетного периода (переинициализация тарифа в пределах сессии) ]]<br /> *[[Ограничение доступа для различных групп пользователей для BGRadiusDialup]]<br /> *[[Детальное информирование абонентов о причинах ошибки 691]]<br /> *[[Аутентификация с учетом Calling-Id-Station]]<br /> *[[Доп. действие сброса активных соединений]]<br /> *[[Открытие абонплаты по первой установке соединения]]<br /> *[[Пересчет трафика по данным Radius (при потерянных Netflow-логах)]]<br /> *[[Отключение Fake сессий при приходе платежа]]<br /> *[[Ограничение доступа на основе объектов]]<br /> <br /> ==== Модуль DialUp / Cкрипты предобработки RADIUS запросов ====<br /> * [[Уcтановка услуги типа &quot;Время&quot; для BGRadiusDialup]]<br /> * [[Установка фиксированного пароля]]<br /> * [[Нормализация параметра Acct-Session-Id у маршрутизатора Cisco]]<br /> * [[Разделение атрибута User-Name на логин и пароль]]<br /> * [[Вынос MAC адреса из cisco-avp-pair в Calling-Station-Id]]<br /> * [[Копирование Тunnel-Client-Endpoint/Tunnel-Server-Endpoint в Calling-Station-Id/Called-Station-Id]]<br /> * [[Замена radius-атрибутов при авторизации]]<br /> <br /> ==== Модуль Inet / Cкрипты предобработки RADIUS запросов ====<br /> * [[Вынос MAC адреса из cisco-avp-pair в Calling-Station-Id для модуля Inet]]<br /> <br /> ==== Модуль СerberСrypt ====<br /> *[[Изменение подписки карты через web (cerbercrypt)]]<br /> *[[Управление подписками через веб (cerbercrypt)]]<br /> *[[Дин.код для синхронизации pairing с внешнего cas]]<br /> *[[Скрипт активации/деактивации карты при добавлении/удалении]]<br /> <br /> ==== Модуль NPay ====<br /> *[[Определение размера абонентской платы]]<br /> *[[Запуск переначисления в модуле NPay]]<br /> *[[Дебетовые абонплаты. Снятие штрафа за разблокировку.]]<br /> *[[Снятие абонентской платы в дебитовых договорах]]<br /> *[[Предварительное уведомление о блокировке по дебетовым абонплатам]]<br /> <br /> ==== Модуль Phone ====<br /> *[[При создании поинта модуля Phone добавление в него абонплат]]<br /> *[[Закрытие_телефонных_договоров]]<br /> <br /> ==== Модуль RSCM ====<br /> *[[Запуск переначисления в модуле RSCM]]<br /> *[[Перенос суммы расхода в наработку RSCM модуля]]<br /> <br /> ==== Модуль VoiceIp ====<br /> *[[Определение стоимости звонка VoiceIp]]<br /> <br /> ==== Модуль VoiceIp / Cкрипты предобработки RADIUS запросов ====<br /> * [[Идентификация Voip оператора по подсети (транзит)]]<br /> * [[Установка параметров звонка Voip]]<br /> * [[Установка фиксированного пароля]]<br /> * [[Разделение атрибута User-Name на логин и пароль]]<br /> * [[Замена radius-атрибутов при авторизации]]<br /> <br /> ==== Плагин CRM ====<br /> *[[Обработка выполненных задач в журнале задач]]<br /> *[[Обработка задач по событию ядра &quot;Поступление платежа&quot;, создание новой задачи и изменение существующей]]<br /> *[[Пример получения информации о задаче]]<br /> *[[Уведомления монтажников о новых активных задачах путем отправки SMS XML запросом]]<br /> <br /> ==== Плагин CashCheck ====<br /> *[[Чек: добавление позиции]]<br /> *[[Чек: завершение формирования]]<br /> *[[Примеры скриптов CashCheck]]<br /> <br /> ==== Плагин Documents ====<br /> *[[Создание копий документа на договорах]]<br /> <br /> ==== Модуль Inet ====<br /> *[[Скрипт активации учетного периода]]<br /> <br /> === Решения для модулей и плагинов ===<br /> <br /> ==== Модуль DialUP ====<br /> *[[Настройка Lucent Ascend MAX6000 в качестве DialUP сервера]]<br /> *[[Настройка Dial-IN сервера FreeBSD PPPD]]<br /> *[[Настройка VPN сервера LINUX PPPD + POPTOP]]<br /> *[[Настройка шейпера в LINUX PPPD]]<br /> *[[Настройка VPN сервера FreeBSD MPD]]<br /> *[[Настройка PPPoE сервера на Cisco-роутере]]<br /> *[[Настройка PPPoE и/или РРТР (VPN) на Mikrotik]]<br /> *[[Проблема с прохождением update пакетов и сброса сессий в Debian и Ubuntu дистрибутивах]]<br /> *[[Настройка Dial-IN Windows RRAS сервера]]<br /> *[[VPN доступ с повременной тарификацией на базе FreeBSD MPD]]<br /> *[[Организация семейства UNLIMIT тарифов на базе FreeBSD MPD]]<br /> *[[Примеры тарифных планов VPN/DialUp]]<br /> *[[Отключение сессий по PoD на CISCO]]<br /> *[[Пример скрипта управления уровнями BGRadiusDialup]]<br /> *[[Настройка cisco с поддеркой ISG]]<br /> *[[Настройка BGBilling c поддеркой ISG]]<br /> *[[Настройка BGBilling с RedBack SmartEdge (PPPOE)]]<br /> <br /> ==== Модуль E-Mail ====<br /> *[[Почтовая система Exim + Cyrus + OpenLDAP на FreeBSD]]<br /> *[[Postfix/MySQL/BGBilling]]<br /> *[[Postfix+dovecot+ldap]]<br /> *[[Postfix+Mysql+Virtual domains]]<br /> <br /> ==== Модуль Inet ====<br /> *[[Inet FAQ]]<br /> *[[Схемы подключения]]<br /> *[[Расширения]]<br /> *[[Конвертеры из IPN в INET]]<br /> *[[Конвертер: логины Dialup в сервисы inet]]<br /> <br /> ==== Модуль IPN ====<br /> *[[IP/VPN]]<br /> *[[Примеры тарифных планов IPN]]<br /> *[[Настройка BGIPNNetflowCollector]]<br /> *[[Методика определения причины отсутствия трафика в отчете договора]]<br /> *[[Связка с flow-tools]]<br /> *[[Экспорт Netflow-данных в формат Nfdump]]<br /> *[[Реалиазация шлюза на Cisco]]<br /> *[[Реализация шлюзов на BeanShell,примеры стандартных и других шлюзов]] (Manad, Cisco, Zyxel, Mikrotik)<br /> *[[Изменения в manad для работы с одним pipe на множество IP адресов]]<br /> *[[FreeBSD manad, понимающий изменения правил в тарифах]]<br /> *[[Табличный FreeBSD manad, понимающий изменения правил в тарифах]]<br /> *[[Пример реализации скриптового универсального шлюза]]<br /> *[[Конвертер привязок услуг dialup в привязки ipn]]<br /> *[[Реализация скрипта Manad]]<br /> *[[Настройка шлюза Mikrotik]]<br /> *[[Обновление номеров интерфейсов при замене роутера]]<br /> <br /> ==== Модуль Phone ====<br /> * [[Конвертация и загрузка тарифов Телефонии в биллинг]]<br /> * [[Примеры тарифных планов Телефонии]]<br /> * [[Примеры реализации конверторов логов]]<br /> * [[Генератор отчётности для Совинтел]]<br /> <br /> ==== Модуль Reports ====<br /> *[[Редактирование отчетов в iReport]]<br /> *[[Примеры отчётов]]<br /> *[[Использование отчётов для организации универсального поиска]]<br /> *[[Табличные отчёты с динамическими столбцами]]<br /> *[[Табличные отчёты в динамическом коде]]<br /> *[[Сохранение JasperReports-отчёта на сервере в pdf]]<br /> <br /> ==== Модуль TV ====<br /> *[[Активация/добавление модуля на договор через дополнительное действие]]<br /> <br /> ==== Модуль VoiceIP ====<br /> *[[Интеграция Asterisk и BGBilling (Accounting) посредством скрипта предобработки запросов Radius]]<br /> *[[Интеграция Asterisk и BGBilling (Accounting) посредством изменения программного кода Asterisk]]<br /> *[[Интеграция c MVTS]]<br /> *[[Интеграция c Cisco Call Manager Express (CME)]]<br /> *[[Карточная IVR система на базе Cisco]]<br /> *[[Примеры IVR скриптов для Cisco]]<br /> *[[Пример настройки Cisco AS5350]]<br /> *[[Продажа пакетов минут на направления]]<br /> <br /> ==== Плагин Dispatch ====<br /> *[[Импорт старой схемы рассылок баланса в Dispatch]]<br /> <br /> === SQL-запросы ===<br /> *[[Схема связки таблиц тарифов]]<br /> *[[Разные SQL-запросы]]<br /> *[[SQL-запрос: кто сколько платит на каждом тарифе]]<br /> *[[Получение цен тарифов]]<br /> *[[Работа с группами, битовые маски]]<br /> *[[наработка по абонентке и услугам за месяц]]<br /> <br /> ==== CerberCrypt ====<br /> *[[Модуль CerberCrypt: Разные SQL-запросы]]<br /> *[[Модуль CerberCrypt: Поиск битых SQL-связей]]<br /> <br /> === Веб-Интерфейс ===<br /> *[[Свой action в личном кабинете]]<br /> **[[WebAction_CustomSuspend]] - управление статусом договора (v5.0)<br /> *[[Изменение параметров договора из личного кабинета]]<br /> *[[Как убрать ненужные действия в web]]<br /> <br /> === Протоколы ===<br /> *[[Протокол дилерский платежей]]<br /> *[[Протоколы, поддержанные в модуле MPS]]<br /> *[[Протоколы, поддержанные в модуле Phone]]<br /> *[[Медиа: Enaza.zip]]<br /> *[[Медиа: Payonline.zip]]<br /> <br /> === FAQ ===<br /> * [[Не запускается служба BSBillingServer под Windows]]<br /> * [[Вопросы вместо русских букв]]<br /> * [[Что происходит с пользователями при рестарте сервера биллинга и BGRadiusDialup]]<br /> * [[Тарификация максимального трафика]]<br /> * [[Field ... doesn't have a default value ]]<br /> * [[Character set ‘cp1251' is not a compiled character set and is not specified in the ‘C:\mysql\\share\charsets\Index.xml’ file ]]<br /> * [[com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown database 'bgbilling' ]]<br /> * [[Договор не отображается в поиске]]<br /> * [[PPPD проблема с сессиями больше 4ГБ]]<br /> * [[Меню личного кабинета]]<br /> * [[Java.lang.NoClassDefFoundError:_javax/xml/bind/DataBindingException|FreeBSD: Java.lang.NoClassDefFoundError: javax/xml/bind/DataBindingException]]<br /> * [[Manad: после некоторого количества договоров начинает передавать данные на биллинг неправильно ]]<br /> * [[Ошибка выполнения скиптов: Undefined argument:]]<br /> * [[Ошибка в логе &quot;Too many open files&quot;]]<br /> * [[Ошибка в клиенте &quot;Action NOT FOUND!..&quot;]]<br /> * [[Inet FAQ]]<br /> * [[java.lang.NoSuchMethodError]]<br /> <br /> == BGCRM ==<br /> <br /> === Плагин BGBilling ===<br /> * [[Синхронизация справочников адресов с BGBilling]]<br /> * [[Активация доверительного платежа в привязанном к процессу договоре биллинга]]<br /> <br /> === Плагин Document ===<br /> * [[Примеры шаблонов для генерации документов]]<br /> * [[Пустой шаблон]]<br /> <br /> === Плагин Report ===<br /> * [[Примеры отчётов BGCRM]]<br /> <br /> === Комплексные решения ===<br /> *[[Организация отключения должников КТВ]]<br /> *[[Интеграция с Asterisk для обработки входящих звонков]]<br /> <br /> === Примеры динамического кода ===<br /> *[[Проверка уникальности контрагента по ИНН]]<br /> *[[Проверка уникальности контрагента по паспортным данным]]<br /> *[[Переключение статуса процессов по наступлению момента времени]]<br /> *[[Повышение приоритета процессов]]<br /> *[[Проверка правки параметра процесса]]<br /> *[[Изменение описания процесса по правке параметра]]<br /> *[[Обработка событий процесса согласования]]<br /> *[[Генерация новостей исполнителям при изменении процессов]]<br /> *[[Уведомление на email]]<br /> <br /> == DBInfo ==<br /> * [[Описание программы]]<br /> * [[Установка и настройка программы]]<br /> * [[Исходный код программы]]<br /> <br /> == Разработка ПО ==<br /> В данном разделе собираются рекомендации по разработке ПО. Это накопленная годами и пополняемая база знания призвана упростить обучение в первую очередь разработчиков, работающих с применяемыми в BiTel технологиями: Java, Web (JS, HTML), СУБД MySQL, LINUX, GIT. И разрабатывающих схожие приложения: тиражируемые продукты для автоматизации процессов организаций. Всё предельно конкретно, поэтому большая часть примеров будет приведена на Java.<br /> Однако значительная часть описываемых проблем и принципов довольно фундоментальна и может быть полезна разработчиками в иных областях.<br /> <br /> === В общем ===<br /> * [[Разработка]]<br /> * [[Оптимизация]]<br /> * [[Логирование]]<br /> * [[Сборка и публикация проекта]]<br /> <br /> === Java разработка ===<br /> * [[Работа с git в Eclipse(EGit)]]<br /> * [[Выявление неисправностей приложений]]<br /> * [[Обращение к Web-сервису]]<br /> * [[Работа с SQL в Java]]<br /> * [[Встроенный Application сервер в приложении]]<br /> * [[Потоки в Java]]<br /> * [[Обработка ошибок]]<br /> <br /> ==== Полезные Java библиотеки ====<br /> {| border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;<br /> |- valign=top align=&quot;center&quot; bgcolor=&quot;#eeeeee&quot; <br /> | Наименование || Область применения<br /> |-<br /> | [[Jimi - обработка изображений | JIMI]] || Обработка изображений<br /> |}<br /> <br /> === Технологии, используемые в проектах ===<br /> * [[XML]]<br /> * [[XSLT]]<br /> * [[FO(P)]]<br /> * [[REGEXP]]<br /> * [[MySQL REGEXP]]<br /> <br /> === Вспомогательные технологии ===<br /> * [[Сборщик Apache ANT]]<br /> * [[Сбор и анализ сетевого трафика]]<br /> * [[SSH]]<br /> * [[Оптимизация запросов в MySQL]]<br /> <br /> === Требования BiTel к оформлению ===<br /> * [[Java кода]]<br /> * [[MySQL кода]]</div> DimOn http://wiki.bitel.ru/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82_%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%B0%D1%86%D0%B8%D0%B8/%D0%B4%D0%B5%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%80%D1%82%D1%8B_%D0%BF%D1%80%D0%B8_%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B8/%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D0%B8 Скрипт активации/деактивации карты при добавлении/удалении 2015-01-27T09:54:42Z <p>DimOn:&#32;Новая страница: «== Скрипт активации/деактивации карты при добавлении/удалении == Пример скрипта, который ср…»</p> <hr /> <div>== Скрипт активации/деактивации карты при добавлении/удалении ==<br /> Пример скрипта, который срабатывает при манипуляции с картами модуля cerbercrypt на договоре, чтобы провести активацию/деактивацию карты для тех протоколов, где это используется. Пример для протокола norde2.<br /> &lt;source lang=&quot;java&quot;&gt;import bitel.billing.server.util.*;<br /> import ru.bitel.bgbilling.modules.cerbercrypt.server.event.UserCardUpdateEvent;<br /> import ru.bitel.bgbilling.modules.cerbercrypt.common.bean.UserCard;<br /> import ru.bitel.bgbilling.modules.cerbercrypt.server.norde2.Norde2Con;<br /> import ru.bitel.common.Preferences;<br /> import ru.bitel.common.ParameterMap;<br /> <br /> final static int CERBERCRYPT_MID = 666;<br /> final static int SERVER_ID = 0;<br /> <br /> private Norde2Con getConnection( Setup serverSetup )<br /> {<br /> Preferences moduleSetup = serverSetup.getModuleSetup( CERBERCRYPT_MID );<br /> ParameterMap connectionSetup = moduleSetup.sub( &quot;server.&quot; + SERVER_ID + &quot;.&quot; );<br /> return new Norde2Con( connectionSetup, SERVER_ID );<br /> }<br /> <br /> public void onEvent( event1, setup, con, conSlave )<br /> {<br /> print( &quot;UserCard update event...&quot; );<br /> UserCardUpdateEvent event = (UserCardUpdateEvent)event1;<br /> // добавление<br /> if( event.getUsercardBefore() == null &amp;&amp; event.getUsercardAfter() != null )<br /> {<br /> print( &quot;add&quot; );<br /> Norde2Con cticon = getConnection( setup );<br /> print( cticon );<br /> cticon.connect();<br /> //cticon.connectionTest();<br /> cticon.enableSmartcard( event.getUsercardAfter().getNumber() );<br /> cticon.disconnect();<br /> }<br /> // удаление<br /> else if( event.getUsercardBefore() != null &amp;&amp; event.getUsercardAfter() == null )<br /> {<br /> print( &quot;delete&quot; );<br /> Norde2Con cticon = getConnection( setup );<br /> print( cticon );<br /> cticon.connect();<br /> //cticon.connectionTest();<br /> cticon.stopSmartcard( event.getUsercardBefore().getNumber() );<br /> cticon.disconnect();<br /> }<br /> // изменение<br /> else if( event.getUsercardBefore() != null &amp;&amp; event.getUsercardAfter() != null )<br /> {<br /> print( &quot;edit&quot; );<br /> }<br /> }&lt;/source&gt;<br /> {{Актуальность Версии|версия=5.2}}</div> DimOn http://wiki.bitel.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0 Заглавная страница 2015-01-27T09:38:49Z <p>DimOn:&#32;/* Модуль СerberСrypt */</p> <hr /> <div>== О BiTel Wiki ==<br /> Здесь вы можете получить больше информации о продуктах BiTel: BGBilling, BGCRM, а также поделиться своим опытом с другими пользователями. В то время как документация часто предоставляет общие сведения о системе и ее настройках, в WiKi приводятся конкретные примеры.<br /> <br /> * &lt;b&gt;[[Как выложить статью на WiKi]]&lt;/b&gt;<br /> * [[Оформление статей]]<br /> * [http://forum.bitel.ru/ Форум BiTel]<br /> <br /> == Специалисты ==<br /> Уважаемые &quot;продвинутые пользователи&quot;. Здесь вы можете располагать записи со своими контактами для оказания воздмездной или безвозмездной помощи по настройке системы BGBilling пользователям, не столь далеко продвинувшимся. Желательно указывать ваши контактные данные и &quot;специализацию&quot;. Отзывы по исполнителям можно оставить/почитать [http://forum.bitel.ru/viewtopic.php?t=9329 на форуме].<br /> {| border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;<br /> |- valign=top align=&quot;center&quot; bgcolor=&quot;#eeeeee&quot; <br /> | Имя || Специализация || Контакт || Примечания<br /> |-<br /> | Рустам Тазуркаев || Mikrotik, переход с NetUp, CISCO || [[Изображение:Cpec_2_contact.png]] &lt;!-- ICQ: 648986--&gt; ||<br /> |-<br /> | Михаил Чернобаев || Скрипты биллинга, FreeBSD MPD || ICQ: 262986492 || Скриптование в биллинге, возможны крупные проекты.<br /> |- <br /> | Борис Близнюков || Скрипты биллинга, CISCO, Voip, Mera || [[Изображение:Cpec_4_contact.png]] &lt;!--ICQ: 1996944--&gt; || Только бесплатные краткие консультации. Очень хороший специалист по CISCO.<br /> |-<br /> | Андрей Бехтерев || Cisco, UNIX, ISP, Asterisk || ICQ: 7021464 WEB: http://behterev.su/ || Обширный спектр оборудования. Консалтинг.<br /> |-<br /> | Гершевич М.М. || Доработка конфигурации 1С и прочего ПО. || Тел. +79248454888 +7-(4162)-238-777 WEB: http://www.amurimpulse.ru/ mail: mike1008@mail.ru || Консалтинг. Информационная безопасность. Интеграция биллинга. Крупные проекты. Работа под заказ.<br /> |-<br /> | Андрей Зюзенков || Linux, BGBilling || http://bghelp.ru ICQ: 639121822 jabber: zavndw@jabber.ru e-mail: info@bghelp.ru skype: zavndw || Обслуживание и внедрение BGBilling и BGCRM<br /> |-<br /> | Семён Кошечкин || Java || email/gtalk: [[Файл:Cpec_5_contact.jpg]]|| Скрипты, дополнения, модуль Inet. [[%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:Contributions/Cromeshnic|wiki]]<br /> |-<br /> |-<br /> | Конференция BGBilling || вопросы касаемо системы BGBilling || bgbilling@conference.jabber.ru || Администраторы АСР BGBillig(иногда и разработчики) помогают друг другу в разных вопросах.<br /> |}<br /> <br /> == BGBilling ==<br /> === Установка ===<br /> * [[Установка на gentoo]]<br /> * [[Установка на Sun Solaris]]<br /> * [[Установка на Slackware]]<br /> * [[Установка на FreeBSD]]<br /> * [[Установка на Ubuntu 8 Desktop]]<br /> * [[Установка на Ubuntu 9.10 Desktop]]<br /> <br /> ==== Перенос данных в биллинг ====<br /> *[[Пример конвертера данных из csv-файлов в базу BGBilling]]<br /> *[[Пример конвертера данных из CSV-файлов в базу BGBilling - 2]]<br /> *[[Пример конвертера данных из CSV-файлов в базу BGBilling - 3]]<br /> *[[Конвертер базы Netup]]<br /> *[[Примеры конвертеров данных из других биллинговых систем]]<br /> <br /> === Администрирование ===<br /> * [[Разграничение прав действий]]<br /> * [[Настройка безопасности сервера биллинга и компонентов биллинга]]<br /> * [[Принудительный останов процессов биллинга]]<br /> * [[Использование подписанного SSL сертификата]]<br /> * [[Запуск scheduler и data_loader с другими портами управления]]<br /> * [[bg-snmp-management|Мониторинг java-процессов по snmp]]<br /> * [[Скрипты автостарта демонов bgbilling для Debian]]<br /> * [[javaws|Запуск BGBillingClient через Java Web Start]]<br /> * [[Мониторинг Inet-Radius через JMX]]<br /> * [[Интеграция существующего сертификата и приватного ключа SSL в хранилище keystore]]<br /> <br /> === Настройка вспомогательного ПО ===<br /> *[[Проксирование обращений к BGBillingServer посредством nginx]]<br /> <br /> ==== MySQL ====<br /> *[[Рекомендации по настройке MySQL]]<br /> *[[database backup|Backup MySQL базы с помощью snapshot'ов (Linux, LVM)]]<br /> *[[Настройка MySQL репликации]]<br /> *[[Установка триггера в MySQL для отслеживания изменений]]<br /> *[[Скрипт восстановления MySQL репликации]]<br /> *[[Simple DB backup]]<br /> <br /> ==== NetFlow ====<br /> *[[Настройка NetFlow-агента IPCAD]]<br /> *[[Разделение NetFlow-потоков]]<br /> <br /> === Технологии ===<br /> *[[BGBilling_XSLT|XSLT]]<br /> <br /> === Разработка ===<br /> *[[Отладка action'ов в IntelliJ IDEA]]<br /> *[[Разработка динамического кода в IDE Eclipse]]<br /> <br /> === [[XSLT]] шаблоны ===<br /> *[[Добавление параметров договора на страницу личного кабинета]]<br /> &lt;!-- *[[Красивые графики статистики в модуле IPN]] --&gt;<br /> *[[Карточки договора]]<br /> *[[Создание XSLT/FO шаблона со штрихкодами]]<br /> *[[Подстановка данных в зависимости от текущего пользователя биллинга]]<br /> *[[Генерация прайса модуля IP телефонии в карточке договора]]<br /> <br /> ==== Счета ====<br /> *[[Печать счета-фактуры и акта на отдельных листах]]<br /> *[[Расширенные счета модуля бухгалтерии]]<br /> *[[Квитанция телефонии физ. лицам]]<br /> *[[Шаблоны вывода названия месяца]]<br /> *[[Изменения в шаблоне в зависимости от месяца документа]]<br /> *[[Добавление новых шрифтов в FO шаблоны]]<br /> <br /> === Интеграция с внешними системами ===<br /> * [[Прямая интеграция с платежными терминалами ЭСФОР / SFOUR]]<br /> * [[Интеграция с платежной системой с использованием модуля Card]]<br /> * [[Интеграция с платежной системой Robokassa]]<br /> * [[SMS рассылка через SMPP]]<br /> * [[SMS рассылка через SMPP по средствам дин кода в 5.2]]<br /> * [[Система учета &quot;Заявки и Наряды&quot; на java]]<br /> * [[Bash скрипт-отсылка смс через телефон при отсутствие ping на заданный узел]]<br /> * [[Запросы в личный кабинет пользователя сторонними системами]]<br /> * [[Запросы к серверу биллинга сторонними системами]]<br /> <br /> ==== 1С ====<br /> * [[BGBilling-1C]]<br /> * [[amurimpulse.ru bgbilling]]<br /> * [[Integrator 1C-BGBilling]]<br /> * [[Пример обращения к биллингу из 1С v.7.7]]<br /> * [[Пример интеграции с 1С v.7.7]]<br /> * [[Пример интеграции с 1С v.8.1]]<br /> * [[Установка unload_status счета через HTTP-запрос]]<br /> <br /> === Динамический код (скрипты BGBS для старых версий) ===<br /> *[[Логгирование в скриптах поведения]]<br /> <br /> ==== Динамический код ====<br /> *[[Конвертирование адреса]]<br /> *[[Глобальная синхронзация услуг модуля npay с тарифным планом]]<br /> *[[Новый номер договора группе договоров]]<br /> *[[Скрипт проверки таймзон (timezone, tz, tzdata) в java]]<br /> <br /> ==== Комплексные решения ====<br /> *[[Предоставление тестового периода пользования услугой]]<br /> *[[Организация системы отслеживания и отключения КТВ должников на BGBS с использованием CRM плагина]]<br /> *[[Автоматизация подключений VPN-клиентов с использованием CRM плагина]]<br /> *[[Пример автоматизации подключения новых клиентов]]<br /> <br /> ==== Глобальные скрипты ====<br /> *[[Скрипт глобальный отмены перехода на тарифы при неоплате]]<br /> *[[Скрипт предоставление скидки пенсионерам]]<br /> *[[Скрипт создания субдоговоров по шаблону]]<br /> *[[Глобальное событие запуска сервера]]<br /> *[[Перемещение в группу через 3 месяца если не было движения денег в наработке]]<br /> *[[Поиск и изменение статусов у договоров]]<br /> *[[Получение списка доступных действий в SQL]]<br /> *[[Глобальный скрипт для удаления старых таблиц]]<br /> <br /> ==== Пользовательские библиотеки скриптов ====<br /> *[[Пересчеты и бонусы]]<br /> *[[Архивирование логов netflow и radius accaunting]]<br /> <br /> ==== Ядро ====<br /> *[[Смена тарифного плана по заданию пользователя]]<br /> *[[Валидация текстового параметра]]<br /> *[[Проверка ИНН/КПП при вводе]]<br /> *[[Проверка параметра договора перед изменением]]<br /> *[[Обработка смены параметра договора]]<br /> *[[Создание списка дополнительных действий для договора]]<br /> *[[Обработка события создания договора]]<br /> *[[Обработка события &quot;добавление услуги RSCM в договор&quot; . Скипт сменяет тариф, подключает абонплату ]]<br /> *[[Приостановление договора клиентом через WEB]]<br /> *[[Скрипт проверки баланса и отключения договора]]<br /> *[[Изменение стандартной логики перетирания статусов]]<br /> *[[Пример продажи OEM ключей с помощью скрипта]]<br /> *[[Пример копирования тарифного плана]]<br /> *[[Получение текущего пользователя биллинга]]<br /> *[[Запуск скрипта до и после акшена]]<br /> *[[Примеры скриптов до и после акшена]]<br /> *[[Примеры динамического кода акшена и веб-сервисов]]<br /> *[[Начисление бонусов на счет при платежах определенного типа]]<br /> *[[Включение должников по приходу платежа]]<br /> *[[Снижение лимита при внесении расхода]]<br /> *[[Синхронизация услуг договора в соответствии с тарифными планами]]<br /> *[[Добавление группы и снятие в зависимости от статуса]]<br /> *[[Управление статусом договора по состоянию баланса]]<br /> *[[Запрет на вход в личный кабинет с закрытых договоров]]<br /> *[[Переход на понижающий тариф только со следующего месяца]]<br /> *[[Пример создания своего интерфейса в клиенте]]<br /> *[[Метки услуг]]<br /> *[[Сравнение прав пользователей]]<br /> *[[Свой список шаблонов договоров]]<br /> <br /> ==== Модуль Bill ====<br /> *[[Создание счета в модуле Bill]]<br /> *[[Создание счета из суммы платежей по классу договоров]]<br /> *[[Создание счета по таблице позиций]]<br /> *[[Создание счета и счет-фактур в модуле Bill(выполнение тех же действий что и руками)]]<br /> *[[Создание счетов на предоплату]]<br /> *[[Распечатка счетов в pdf по событию генерации счета]]<br /> *[[Внешняя программа на JAVA для синхронизации номеров счетов и актов выполненных работ (версия BGBilling 5.0)]]<br /> *[[Автоматическая отправка счетов через глобальный скрипт поведения]]<br /> <br /> ==== Модуль DialUp ====<br /> *[[Запуск переначисления в модуле DialUp]]<br /> *[[Передача ACCEPT вместо REJECT вместе с доп. аттрибутами]]<br /> *[[Обработка запроса учетного периода]]<br /> *[[Переинициализация тарифа в пределах сессии | Обработка запроса учетного периода (переинициализация тарифа в пределах сессии) ]]<br /> *[[Ограничение доступа для различных групп пользователей для BGRadiusDialup]]<br /> *[[Детальное информирование абонентов о причинах ошибки 691]]<br /> *[[Аутентификация с учетом Calling-Id-Station]]<br /> *[[Доп. действие сброса активных соединений]]<br /> *[[Открытие абонплаты по первой установке соединения]]<br /> *[[Пересчет трафика по данным Radius (при потерянных Netflow-логах)]]<br /> *[[Отключение Fake сессий при приходе платежа]]<br /> *[[Ограничение доступа на основе объектов]]<br /> <br /> ==== Модуль DialUp / Cкрипты предобработки RADIUS запросов ====<br /> * [[Уcтановка услуги типа &quot;Время&quot; для BGRadiusDialup]]<br /> * [[Установка фиксированного пароля]]<br /> * [[Нормализация параметра Acct-Session-Id у маршрутизатора Cisco]]<br /> * [[Разделение атрибута User-Name на логин и пароль]]<br /> * [[Вынос MAC адреса из cisco-avp-pair в Calling-Station-Id]]<br /> * [[Копирование Тunnel-Client-Endpoint/Tunnel-Server-Endpoint в Calling-Station-Id/Called-Station-Id]]<br /> * [[Замена radius-атрибутов при авторизации]]<br /> <br /> ==== Модуль Inet / Cкрипты предобработки RADIUS запросов ====<br /> * [[Вынос MAC адреса из cisco-avp-pair в Calling-Station-Id для модуля Inet]]<br /> <br /> ==== Модуль СerberСrypt ====<br /> *[[Изменение подписки карты через web (cerbercrypt)]]<br /> *[[Управление подписками через веб (cerbercrypt)]]<br /> *[[Дин.код для синхронизации pairing с внешнего cas]]<br /> *[[Скрипт активации/деактивации карты при добавлении/удалении]]<br /> <br /> ==== Модуль NPay ====<br /> *[[Определение размера абонентской платы]]<br /> *[[Запуск переначисления в модуле NPay]]<br /> *[[Дебетовые абонплаты. Снятие штрафа за разблокировку.]]<br /> *[[Снятие абонентской платы в дебитовых договорах]]<br /> *[[Предварительное уведомление о блокировке по дебетовым абонплатам]]<br /> <br /> ==== Модуль Phone ====<br /> *[[При создании поинта модуля Phone добавление в него абонплат]]<br /> *[[Закрытие_телефонных_договоров]]<br /> <br /> ==== Модуль RSCM ====<br /> *[[Запуск переначисления в модуле RSCM]]<br /> *[[Перенос суммы расхода в наработку RSCM модуля]]<br /> <br /> ==== Модуль VoiceIp ====<br /> *[[Определение стоимости звонка VoiceIp]]<br /> <br /> ==== Модуль VoiceIp / Cкрипты предобработки RADIUS запросов ====<br /> * [[Идентификация Voip оператора по подсети (транзит)]]<br /> * [[Установка параметров звонка Voip]]<br /> * [[Установка фиксированного пароля]]<br /> * [[Разделение атрибута User-Name на логин и пароль]]<br /> * [[Замена radius-атрибутов при авторизации]]<br /> <br /> ==== Плагин CRM ====<br /> *[[Обработка выполненных задач в журнале задач]]<br /> *[[Обработка задач по событию ядра &quot;Поступление платежа&quot;, создание новой задачи и изменение существующей]]<br /> *[[Пример получения информации о задаче]]<br /> *[[Уведомления монтажников о новых активных задачах путем отправки SMS XML запросом]]<br /> <br /> ==== Плагин CashCheck ====<br /> *[[Чек: добавление позиции]]<br /> *[[Чек: завершение формирования]]<br /> *[[Примеры скриптов CashCheck]]<br /> <br /> ==== Плагин Documents ====<br /> *[[Создание копий документа на договорах]]<br /> <br /> ==== Модуль Inet ====<br /> *[[Скрипт активации учетного периода]]<br /> <br /> === Решения для модулей и плагинов ===<br /> <br /> ==== Модуль DialUP ====<br /> *[[Настройка Lucent Ascend MAX6000 в качестве DialUP сервера]]<br /> *[[Настройка Dial-IN сервера FreeBSD PPPD]]<br /> *[[Настройка VPN сервера LINUX PPPD + POPTOP]]<br /> *[[Настройка шейпера в LINUX PPPD]]<br /> *[[Настройка VPN сервера FreeBSD MPD]]<br /> *[[Настройка PPPoE сервера на Cisco-роутере]]<br /> *[[Настройка PPPoE и/или РРТР (VPN) на Mikrotik]]<br /> *[[Проблема с прохождением update пакетов и сброса сессий в Debian и Ubuntu дистрибутивах]]<br /> *[[Настройка Dial-IN Windows RRAS сервера]]<br /> *[[VPN доступ с повременной тарификацией на базе FreeBSD MPD]]<br /> *[[Организация семейства UNLIMIT тарифов на базе FreeBSD MPD]]<br /> *[[Примеры тарифных планов VPN/DialUp]]<br /> *[[Отключение сессий по PoD на CISCO]]<br /> *[[Пример скрипта управления уровнями BGRadiusDialup]]<br /> *[[Настройка cisco с поддеркой ISG]]<br /> *[[Настройка BGBilling c поддеркой ISG]]<br /> *[[Настройка BGBilling с RedBack SmartEdge (PPPOE)]]<br /> <br /> ==== Модуль E-Mail ====<br /> *[[Почтовая система Exim + Cyrus + OpenLDAP на FreeBSD]]<br /> *[[Postfix/MySQL/BGBilling]]<br /> *[[Postfix+dovecot+ldap]]<br /> *[[Postfix+Mysql+Virtual domains]]<br /> <br /> ==== Модуль Inet ====<br /> *[[Inet FAQ]]<br /> *[[Схемы подключения]]<br /> *[[Расширения]]<br /> *[[Конвертеры из IPN в INET]]<br /> *[[Конвертер: логины Dialup в сервисы inet]]<br /> <br /> ==== Модуль IPN ====<br /> *[[IP/VPN]]<br /> *[[Примеры тарифных планов IPN]]<br /> *[[Настройка BGIPNNetflowCollector]]<br /> *[[Методика определения причины отсутствия трафика в отчете договора]]<br /> *[[Связка с flow-tools]]<br /> *[[Экспорт Netflow-данных в формат Nfdump]]<br /> *[[Реалиазация шлюза на Cisco]]<br /> *[[Реализация шлюзов на BeanShell,примеры стандартных и других шлюзов]] (Manad, Cisco, Zyxel, Mikrotik)<br /> *[[Изменения в manad для работы с одним pipe на множество IP адресов]]<br /> *[[FreeBSD manad, понимающий изменения правил в тарифах]]<br /> *[[Табличный FreeBSD manad, понимающий изменения правил в тарифах]]<br /> *[[Пример реализации скриптового универсального шлюза]]<br /> *[[Конвертер привязок услуг dialup в привязки ipn]]<br /> *[[Реализация скрипта Manad]]<br /> *[[Настройка шлюза Mikrotik]]<br /> *[[Обновление номеров интерфейсов при замене роутера]]<br /> <br /> ==== Модуль Phone ====<br /> * [[Конвертация и загрузка тарифов Телефонии в биллинг]]<br /> * [[Примеры тарифных планов Телефонии]]<br /> * [[Примеры реализации конверторов логов]]<br /> * [[Генератор отчётности для Совинтел]]<br /> <br /> ==== Модуль Reports ====<br /> *[[Редактирование отчетов в iReport]]<br /> *[[Примеры отчётов]]<br /> *[[Использование отчётов для организации универсального поиска]]<br /> *[[Табличные отчёты с динамическими столбцами]]<br /> *[[Табличные отчёты в динамическом коде]]<br /> *[[Сохранение JasperReports-отчёта на сервере в pdf]]<br /> <br /> ==== Модуль TV ====<br /> *[[Активация/добавление модуля на договор через дополнительное действие]]<br /> <br /> ==== Модуль VoiceIP ====<br /> *[[Интеграция Asterisk и BGBilling (Accounting) посредством скрипта предобработки запросов Radius]]<br /> *[[Интеграция Asterisk и BGBilling (Accounting) посредством изменения программного кода Asterisk]]<br /> *[[Интеграция c MVTS]]<br /> *[[Интеграция c Cisco Call Manager Express (CME)]]<br /> *[[Карточная IVR система на базе Cisco]]<br /> *[[Примеры IVR скриптов для Cisco]]<br /> *[[Пример настройки Cisco AS5350]]<br /> *[[Продажа пакетов минут на направления]]<br /> <br /> ==== Плагин Dispatch ====<br /> *[[Импорт старой схемы рассылок баланса в Dispatch]]<br /> <br /> === SQL-запросы ===<br /> *[[Схема связки таблиц тарифов]]<br /> *[[Разные SQL-запросы]]<br /> *[[SQL-запрос: кто сколько платит на каждом тарифе]]<br /> *[[Получение цен тарифов]]<br /> *[[Работа с группами, битовые маски]]<br /> *[[наработка по абонентке и услугам за месяц]]<br /> <br /> ==== CerberCrypt ====<br /> *[[Модуль CerberCrypt: Разные SQL-запросы]]<br /> *[[Модуль CerberCrypt: Поиск битых SQL-связей]]<br /> <br /> === Веб-Интерфейс ===<br /> *[[Свой action в личном кабинете]]<br /> **[[WebAction_CustomSuspend]] - управление статусом договора (v5.0)<br /> *[[Изменение параметров договора из личного кабинета]]<br /> *[[Как убрать ненужные действия в web]]<br /> <br /> === Протоколы ===<br /> *[[Протокол дилерский платежей]]<br /> *[[Протоколы, поддержанные в модуле MPS]]<br /> *[[Протоколы, поддержанные в модуле Phone]]<br /> *[[Медиа: Enaza.zip]]<br /> *[[Медиа: Payonline.zip]]<br /> <br /> === FAQ ===<br /> * [[Не запускается служба BSBillingServer под Windows]]<br /> * [[Вопросы вместо русских букв]]<br /> * [[Что происходит с пользователями при рестарте сервера биллинга и BGRadiusDialup]]<br /> * [[Тарификация максимального трафика]]<br /> * [[Field ... doesn't have a default value ]]<br /> * [[Character set ‘cp1251' is not a compiled character set and is not specified in the ‘C:\mysql\\share\charsets\Index.xml’ file ]]<br /> * [[com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown database 'bgbilling' ]]<br /> * [[Договор не отображается в поиске]]<br /> * [[PPPD проблема с сессиями больше 4ГБ]]<br /> * [[Меню личного кабинета]]<br /> * [[Java.lang.NoClassDefFoundError:_javax/xml/bind/DataBindingException|FreeBSD: Java.lang.NoClassDefFoundError: javax/xml/bind/DataBindingException]]<br /> * [[Manad: после некоторого количества договоров начинает передавать данные на биллинг неправильно ]]<br /> * [[Ошибка выполнения скиптов: Undefined argument:]]<br /> * [[Ошибка в логе &quot;Too many open files&quot;]]<br /> * [[Ошибка в клиенте &quot;Action NOT FOUND!..&quot;]]<br /> * [[Inet FAQ]]<br /> * [[java.lang.NoSuchMethodError]]<br /> <br /> == BGCRM ==<br /> <br /> === Плагин BGBilling ===<br /> * [[Синхронизация справочников адресов с BGBilling]]<br /> * [[Активация доверительного платежа в привязанном к процессу договоре биллинга]]<br /> <br /> === Плагин Document ===<br /> * [[Примеры шаблонов для генерации документов]]<br /> <br /> === Плагин Report ===<br /> * [[Примеры отчётов BGCRM]]<br /> <br /> === Комплексные решения ===<br /> *[[Организация отключения должников КТВ]]<br /> *[[Интеграция с Asterisk для обработки входящих звонков]]<br /> <br /> === Примеры динамического кода ===<br /> *[[Проверка уникальности контрагента по ИНН]]<br /> *[[Проверка уникальности контрагента по паспортным данным]]<br /> *[[Переключение статуса процессов по наступлению момента времени]]<br /> *[[Повышение приоритета процессов]]<br /> *[[Проверка правки параметра процесса]]<br /> *[[Изменение описания процесса по правке параметра]]<br /> *[[Обработка событий процесса согласования]]<br /> *[[Генерация новостей исполнителям при изменении процессов]]<br /> *[[Уведомление на email]]<br /> <br /> == DBInfo ==<br /> * [[Описание программы]]<br /> * [[Установка и настройка программы]]<br /> * [[Исходный код программы]]<br /> <br /> == Разработка ПО ==<br /> В данном разделе собираются рекомендации по разработке ПО. Это накопленная годами и пополняемая база знания призвана упростить обучение в первую очередь разработчиков, работающих с применяемыми в BiTel технологиями: Java, Web (JS, HTML), СУБД MySQL, LINUX, GIT. И разрабатывающих схожие приложения: тиражируемые продукты для автоматизации процессов организаций. Всё предельно конкретно, поэтому большая часть примеров будет приведена на Java.<br /> Однако значительная часть описываемых проблем и принципов довольно фундоментальна и может быть полезна разработчиками в иных областях.<br /> <br /> === В общем ===<br /> * [[Разработка]]<br /> * [[Оптимизация]]<br /> * [[Логирование]]<br /> * [[Сборка и публикация проекта]]<br /> <br /> === Java разработка ===<br /> * [[Работа с git в Eclipse(EGit)]]<br /> * [[Выявление неисправностей приложений]]<br /> * [[Обращение к Web-сервису]]<br /> * [[Работа с SQL в Java]]<br /> * [[Встроенный Application сервер в приложении]]<br /> * [[Потоки в Java]]<br /> * [[Обработка ошибок]]<br /> <br /> ==== Полезные Java библиотеки ====<br /> {| border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;<br /> |- valign=top align=&quot;center&quot; bgcolor=&quot;#eeeeee&quot; <br /> | Наименование || Область применения<br /> |-<br /> | [[Jimi - обработка изображений | JIMI]] || Обработка изображений<br /> |}<br /> <br /> === Технологии, используемые в проектах ===<br /> * [[XML]]<br /> * [[XSLT]]<br /> * [[FO(P)]]<br /> * [[REGEXP]]<br /> * [[MySQL REGEXP]]<br /> <br /> === Вспомогательные технологии ===<br /> * [[Сборщик Apache ANT]]<br /> * [[Сбор и анализ сетевого трафика]]<br /> * [[SSH]]<br /> * [[Оптимизация запросов в MySQL]]<br /> <br /> === Требования BiTel к оформлению ===<br /> * [[Java кода]]<br /> * [[MySQL кода]]</div> DimOn http://wiki.bitel.ru/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B8_%D1%82%D0%B0%D0%B9%D0%BC%D0%B7%D0%BE%D0%BD_(timezone,_tz,_tzdata)_%D0%B2_java Скрипт проверки таймзон (timezone, tz, tzdata) в java 2014-12-15T11:24:34Z <p>DimOn:&#32;Новая страница: «Код для проверки, проверяет как прошлый переход на tzdata2011k, так и актуальный переход на tzdata20…»</p> <hr /> <div>Код для проверки, проверяет как прошлый переход на tzdata2011k, так и актуальный переход на tzdata2014f.<br /> Годится для динкода.<br /> &lt;source lang=&quot;java&quot;&gt;<br /> import java.text.DateFormat;<br /> import java.text.SimpleDateFormat;<br /> import java.util.Date;<br /> import java.util.TimeZone;<br /> <br /> public class TZ<br /> {<br /> public static void main(String[] args)<br /> {<br /> DateFormat df = new SimpleDateFormat(&quot;HZ&quot;);<br /> df.setTimeZone( TimeZone.getTimeZone(&quot;Asia/Yekaterinburg&quot;) );<br /> System.out.println( df.format(new Date(1314567890000L)).equals(&quot;3+0600&quot;) &amp;&amp; df.format(new Date(1324567890000L)).equals(&quot;21+0600&quot;) &amp;&amp; df.format(new Date(1412888888666L)).equals(&quot;3+0600&quot;) &amp;&amp; df.format(new Date(1414888888666L)).equals(&quot;5+0500&quot;) ? &quot;норм&quot; : &quot;увы&quot; );<br /> }<br /> }<br /> &lt;/source&gt;<br /> --[[Участник:DimOn|dimOn]] 11:24, 15 декабря 2014 (UTC)</div> DimOn http://wiki.bitel.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0 Заглавная страница 2014-12-15T11:23:43Z <p>DimOn:&#32;/* Динамический код */</p> <hr /> <div>== О BiTel Wiki ==<br /> Здесь вы можете получить больше информации о продуктах BiTel: BGBilling, BGCRM, а также поделиться своим опытом с другими пользователями. В то время как документация часто предоставляет общие сведения о системе и ее настройках, в WiKi приводятся конкретные примеры.<br /> <br /> * &lt;b&gt;[[Как выложить статью на WiKi]]&lt;/b&gt;<br /> * [[Оформление статей]]<br /> * [http://forum.bitel.ru/ Форум BiTel]<br /> <br /> == Специалисты ==<br /> Уважаемые &quot;продвинутые пользователи&quot;. Здесь вы можете располагать записи со своими контактами для оказания воздмездной или безвозмездной помощи по настройке системы BGBilling пользователям, не столь далеко продвинувшимся. Желательно указывать ваши контактные данные и &quot;специализацию&quot;. Отзывы по исполнителям можно оставить/почитать [http://forum.bitel.ru/viewtopic.php?t=9329 на форуме].<br /> {| border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;<br /> |- valign=top align=&quot;center&quot; bgcolor=&quot;#eeeeee&quot; <br /> | Имя || Специализация || Контакт || Примечания<br /> |-<br /> | Рустам Тазуркаев || Mikrotik, переход с NetUp, CISCO || [[Изображение:Cpec_2_contact.png]] &lt;!-- ICQ: 648986--&gt; ||<br /> |-<br /> | Михаил Чернобаев || Скрипты биллинга, FreeBSD MPD || ICQ: 262986492 || Скриптование в биллинге, возможны крупные проекты.<br /> |- <br /> | Борис Близнюков || Скрипты биллинга, CISCO, Voip, Mera || [[Изображение:Cpec_4_contact.png]] &lt;!--ICQ: 1996944--&gt; || Только бесплатные краткие консультации. Очень хороший специалист по CISCO.<br /> |-<br /> | Андрей Бехтерев || Cisco, UNIX, ISP, Asterisk || ICQ: 7021464 WEB: http://behterev.su/ || Обширный спектр оборудования. Консалтинг.<br /> |-<br /> | Гершевич М.М. || Доработка конфигурации 1С и прочего ПО. || Тел. +79248454888 +7-(4162)-238-777 WEB: http://www.amurimpulse.ru/ mail: mike1008@mail.ru || Консалтинг. Информационная безопасность. Интеграция биллинга. Крупные проекты. Работа под заказ.<br /> |-<br /> | Андрей Зюзенков || Linux, BGBilling || http://bghelp.ru ICQ: 639121822 jabber: zavndw@jabber.ru e-mail: zavndw@gmail.com skype: zavndw || Настройка, запуск, обслуживание BGBilling и истем linux, консультации<br /> |-<br /> | Семён Кошечкин || Java || email/gtalk: [[Файл:Cpec_5_contact.jpg]]|| Скрипты, дополнения, модуль Inet. [[%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:Contributions/Cromeshnic|wiki]]<br /> |-<br /> |-<br /> | Конференция BGBilling || вопросы касаемо системы BGBilling || bgbilling@conference.jabber.ru || Администраторы АСР BGBillig(иногда и разработчики) помогают друг другу в разных вопросах.<br /> |}<br /> <br /> == BGBilling ==<br /> === Установка ===<br /> * [[Установка на gentoo]]<br /> * [[Установка на Sun Solaris]]<br /> * [[Установка на Slackware]]<br /> * [[Установка на FreeBSD]]<br /> * [[Установка на Ubuntu 8 Desktop]]<br /> * [[Установка на Ubuntu 9.10 Desktop]]<br /> <br /> ==== Перенос данных в биллинг ====<br /> *[[Пример конвертера данных из csv-файлов в базу BGBilling]]<br /> *[[Пример конвертера данных из CSV-файлов в базу BGBilling - 2]]<br /> *[[Пример конвертера данных из CSV-файлов в базу BGBilling - 3]]<br /> *[[Конвертер базы Netup]]<br /> *[[Примеры конвертеров данных из других биллинговых систем]]<br /> <br /> === Администрирование ===<br /> * [[Разграничение прав действий]]<br /> * [[Настройка безопасности сервера биллинга и компонентов биллинга]]<br /> * [[Принудительный останов процессов биллинга]]<br /> * [[Использование подписанного SSL сертификата]]<br /> * [[Запуск scheduler и data_loader с другими портами управления]]<br /> * [[bg-snmp-management|Мониторинг java-процессов по snmp]]<br /> * [[Скрипты автостарта демонов bgbilling для Debian]]<br /> * [[javaws|Запуск BGBillingClient через Java Web Start]]<br /> * [[Мониторинг Inet-Radius через JMX]]<br /> * [[Интеграция существующего сертификата и приватного ключа SSL в хранилище keystore]]<br /> <br /> === Настройка вспомогательного ПО ===<br /> *[[Проксирование обращений к BGBillingServer посредством nginx]]<br /> <br /> ==== MySQL ====<br /> *[[Рекомендации по настройке MySQL]]<br /> *[[database backup|Backup MySQL базы с помощью snapshot'ов (Linux, LVM)]]<br /> *[[Настройка MySQL репликации]]<br /> *[[Установка триггера в MySQL для отслеживания изменений]]<br /> *[[Скрипт восстановления MySQL репликации]]<br /> *[[Simple DB backup]]<br /> <br /> ==== NetFlow ====<br /> *[[Настройка NetFlow-агента IPCAD]]<br /> *[[Разделение NetFlow-потоков]]<br /> <br /> === Технологии ===<br /> *[[BGBilling_XSLT|XSLT]]<br /> <br /> === Разработка ===<br /> *[[Отладка action'ов в IntelliJ IDEA]]<br /> *[[Разработка динамического кода в IDE Eclipse]]<br /> <br /> === [[XSLT]] шаблоны ===<br /> *[[Добавление параметров договора на страницу личного кабинета]]<br /> &lt;!-- *[[Красивые графики статистики в модуле IPN]] --&gt;<br /> *[[Карточки договора]]<br /> *[[Создание XSLT/FO шаблона со штрихкодами]]<br /> *[[Подстановка данных в зависимости от текущего пользователя биллинга]]<br /> *[[Генерация прайса модуля IP телефонии в карточке договора]]<br /> <br /> ==== Счета ====<br /> *[[Печать счета-фактуры и акта на отдельных листах]]<br /> *[[Расширенные счета модуля бухгалтерии]]<br /> *[[Квитанция телефонии физ. лицам]]<br /> *[[Шаблоны вывода названия месяца]]<br /> *[[Изменения в шаблоне в зависимости от месяца документа]]<br /> *[[Добавление новых шрифтов в FO шаблоны]]<br /> <br /> === Интеграция с внешними системами ===<br /> * [[Прямая интеграция с платежными терминалами ЭСФОР / SFOUR]]<br /> * [[Интеграция с платежной системой с использованием модуля Card]]<br /> * [[Интеграция с платежной системой Robokassa]]<br /> * [[SMS рассылка через SMPP]]<br /> * [[SMS рассылка через SMPP по средствам дин кода в 5.2]]<br /> * [[Система учета &quot;Заявки и Наряды&quot; на java]]<br /> * [[Bash скрипт-отсылка смс через телефон при отсутствие ping на заданный узел]]<br /> * [[Запросы в личный кабинет пользователя сторонними системами]]<br /> * [[Запросы к серверу биллинга сторонними системами]]<br /> <br /> ==== 1С ====<br /> * [[BGBilling-1C]]<br /> * [[amurimpulse.ru bgbilling]]<br /> * [[Integrator 1C-BGBilling]]<br /> * [[Пример обращения к биллингу из 1С v.7.7]]<br /> * [[Пример интеграции с 1С v.7.7]]<br /> * [[Пример интеграции с 1С v.8.1]]<br /> * [[Установка unload_status счета через HTTP-запрос]]<br /> <br /> === Динамический код (скрипты BGBS для старых версий) ===<br /> *[[Логгирование в скриптах поведения]]<br /> <br /> ==== Динамический код ====<br /> *[[Конвертирование адреса]]<br /> *[[Глобальная синхронзация услуг модуля npay с тарифным планом]]<br /> *[[Новый номер договора группе договоров]]<br /> *[[Скрипт проверки таймзон (timezone, tz, tzdata) в java]]<br /> <br /> ==== Комплексные решения ====<br /> *[[Предоставление тестового периода пользования услугой]]<br /> *[[Организация системы отслеживания и отключения КТВ должников на BGBS с использованием CRM плагина]]<br /> *[[Автоматизация подключений VPN-клиентов с использованием CRM плагина]]<br /> *[[Пример автоматизации подключения новых клиентов]]<br /> <br /> ==== Глобальные скрипты ====<br /> *[[Скрипт глобальный отмены перехода на тарифы при неоплате]]<br /> *[[Скрипт предоставление скидки пенсионерам]]<br /> *[[Скрипт создания субдоговоров по шаблону]]<br /> *[[Глобальное событие запуска сервера]]<br /> *[[Перемещение в группу через 3 месяца если не было движения денег в наработке]]<br /> *[[Поиск и изменение статусов у договоров]]<br /> *[[Получение списка доступных действий в SQL]]<br /> *[[Глобальный скрипт для удаления старых таблиц]]<br /> <br /> ==== Пользовательские библиотеки скриптов ====<br /> *[[Пересчеты и бонусы]]<br /> *[[Архивирование логов netflow и radius accaunting]]<br /> <br /> ==== Ядро ====<br /> *[[Смена тарифного плана по заданию пользователя]]<br /> *[[Валидация текстового параметра]]<br /> *[[Проверка ИНН/КПП при вводе]]<br /> *[[Проверка параметра договора перед изменением]]<br /> *[[Обработка смены параметра договора]]<br /> *[[Создание списка дополнительных действий для договора]]<br /> *[[Обработка события создания договора]]<br /> *[[Обработка события &quot;добавление услуги RSCM в договор&quot; . Скипт сменяет тариф, подключает абонплату ]]<br /> *[[Приостановление договора клиентом через WEB]]<br /> *[[Скрипт проверки баланса и отключения договора]]<br /> *[[Изменение стандартной логики перетирания статусов]]<br /> *[[Пример продажи OEM ключей с помощью скрипта]]<br /> *[[Пример копирования тарифного плана]]<br /> *[[Получение текущего пользователя биллинга]]<br /> *[[Запуск скрипта до и после акшена]]<br /> *[[Примеры скриптов до и после акшена]]<br /> *[[Примеры динамического кода акшена и веб-сервисов]]<br /> *[[Начисление бонусов на счет при платежах определенного типа]]<br /> *[[Включение должников по приходу платежа]]<br /> *[[Снижение лимита при внесении расхода]]<br /> *[[Синхронизация услуг договора в соответствии с тарифными планами]]<br /> *[[Добавление группы и снятие в зависимости от статуса]]<br /> *[[Управление статусом договора по состоянию баланса]]<br /> *[[Запрет на вход в личный кабинет с закрытых договоров]]<br /> *[[Переход на понижающий тариф только со следующего месяца]]<br /> *[[Пример создания своего интерфейса в клиенте]]<br /> *[[Метки услуг]]<br /> *[[Сравнение прав пользователей]]<br /> *[[Свой список шаблонов договоров]]<br /> <br /> ==== Модуль Bill ====<br /> *[[Создание счета в модуле Bill]]<br /> *[[Создание счета из суммы платежей по классу договоров]]<br /> *[[Создание счета по таблице позиций]]<br /> *[[Создание счета и счет-фактур в модуле Bill(выполнение тех же действий что и руками)]]<br /> *[[Создание счетов на предоплату]]<br /> *[[Распечатка счетов в pdf по событию генерации счета]]<br /> *[[Внешняя программа на JAVA для синхронизации номеров счетов и актов выполненных работ (версия BGBilling 5.0)]]<br /> *[[Автоматическая отправка счетов через глобальный скрипт поведения]]<br /> <br /> ==== Модуль DialUp ====<br /> *[[Запуск переначисления в модуле DialUp]]<br /> *[[Передача ACCEPT вместо REJECT вместе с доп. аттрибутами]]<br /> *[[Обработка запроса учетного периода]]<br /> *[[Переинициализация тарифа в пределах сессии | Обработка запроса учетного периода (переинициализация тарифа в пределах сессии) ]]<br /> *[[Ограничение доступа для различных групп пользователей для BGRadiusDialup]]<br /> *[[Детальное информирование абонентов о причинах ошибки 691]]<br /> *[[Аутентификация с учетом Calling-Id-Station]]<br /> *[[Доп. действие сброса активных соединений]]<br /> *[[Открытие абонплаты по первой установке соединения]]<br /> *[[Пересчет трафика по данным Radius (при потерянных Netflow-логах)]]<br /> *[[Отключение Fake сессий при приходе платежа]]<br /> *[[Ограничение доступа на основе объектов]]<br /> <br /> ==== Модуль DialUp / Cкрипты предобработки RADIUS запросов ====<br /> * [[Уcтановка услуги типа &quot;Время&quot; для BGRadiusDialup]]<br /> * [[Установка фиксированного пароля]]<br /> * [[Нормализация параметра Acct-Session-Id у маршрутизатора Cisco]]<br /> * [[Разделение атрибута User-Name на логин и пароль]]<br /> * [[Вынос MAC адреса из cisco-avp-pair в Calling-Station-Id]]<br /> * [[Копирование Тunnel-Client-Endpoint/Tunnel-Server-Endpoint в Calling-Station-Id/Called-Station-Id]]<br /> * [[Замена radius-атрибутов при авторизации]]<br /> <br /> ==== Модуль Inet / Cкрипты предобработки RADIUS запросов ====<br /> * [[Вынос MAC адреса из cisco-avp-pair в Calling-Station-Id для модуля Inet]]<br /> <br /> ==== Модуль СerberСrypt ====<br /> *[[Изменение подписки карты через web (cerbercrypt)]]<br /> *[[Управление подписками через веб (cerbercrypt)]]<br /> *[[Дин.код для синхронизации pairing с внешнего cas]]<br /> <br /> ==== Модуль NPay ====<br /> *[[Определение размера абонентской платы]]<br /> *[[Запуск переначисления в модуле NPay]]<br /> *[[Дебетовые абонплаты. Снятие штрафа за разблокировку.]]<br /> *[[Снятие абонентской платы в дебитовых договорах]]<br /> *[[Предварительное уведомление о блокировке по дебетовым абонплатам]]<br /> <br /> ==== Модуль Phone ====<br /> *[[При создании поинта модуля Phone добавление в него абонплат]]<br /> *[[Закрытие_телефонных_договоров]]<br /> <br /> ==== Модуль RSCM ====<br /> *[[Запуск переначисления в модуле RSCM]]<br /> *[[Перенос суммы расхода в наработку RSCM модуля]]<br /> <br /> ==== Модуль VoiceIp ====<br /> *[[Определение стоимости звонка VoiceIp]]<br /> <br /> ==== Модуль VoiceIp / Cкрипты предобработки RADIUS запросов ====<br /> * [[Идентификация Voip оператора по подсети (транзит)]]<br /> * [[Установка параметров звонка Voip]]<br /> * [[Установка фиксированного пароля]]<br /> * [[Разделение атрибута User-Name на логин и пароль]]<br /> * [[Замена radius-атрибутов при авторизации]]<br /> <br /> ==== Плагин CRM ====<br /> *[[Обработка выполненных задач в журнале задач]]<br /> *[[Обработка задач по событию ядра &quot;Поступление платежа&quot;, создание новой задачи и изменение существующей]]<br /> *[[Пример получения информации о задаче]]<br /> *[[Уведомления монтажников о новых активных задачах путем отправки SMS XML запросом]]<br /> <br /> ==== Плагин CashCheck ====<br /> *[[Чек: добавление позиции]]<br /> *[[Чек: завершение формирования]]<br /> *[[Примеры скриптов CashCheck]]<br /> <br /> ==== Плагин Documents ====<br /> *[[Создание копий документа на договорах]]<br /> <br /> ==== Модуль Inet ====<br /> *[[Скрипт активации учетного периода]]<br /> <br /> === Решения для модулей и плагинов ===<br /> <br /> ==== Модуль DialUP ====<br /> *[[Настройка Lucent Ascend MAX6000 в качестве DialUP сервера]]<br /> *[[Настройка Dial-IN сервера FreeBSD PPPD]]<br /> *[[Настройка VPN сервера LINUX PPPD + POPTOP]]<br /> *[[Настройка шейпера в LINUX PPPD]]<br /> *[[Настройка VPN сервера FreeBSD MPD]]<br /> *[[Настройка PPPoE сервера на Cisco-роутере]]<br /> *[[Настройка PPPoE и/или РРТР (VPN) на Mikrotik]]<br /> *[[Проблема с прохождением update пакетов и сброса сессий в Debian и Ubuntu дистрибутивах]]<br /> *[[Настройка Dial-IN Windows RRAS сервера]]<br /> *[[VPN доступ с повременной тарификацией на базе FreeBSD MPD]]<br /> *[[Организация семейства UNLIMIT тарифов на базе FreeBSD MPD]]<br /> *[[Примеры тарифных планов VPN/DialUp]]<br /> *[[Отключение сессий по PoD на CISCO]]<br /> *[[Пример скрипта управления уровнями BGRadiusDialup]]<br /> *[[Настройка cisco с поддеркой ISG]]<br /> *[[Настройка BGBilling c поддеркой ISG]]<br /> *[[Настройка BGBilling с RedBack SmartEdge (PPPOE)]]<br /> <br /> ==== Модуль E-Mail ====<br /> *[[Почтовая система Exim + Cyrus + OpenLDAP на FreeBSD]]<br /> *[[Postfix/MySQL/BGBilling]]<br /> *[[Postfix+dovecot+ldap]]<br /> *[[Postfix+Mysql+Virtual domains]]<br /> <br /> ==== Модуль Inet ====<br /> *[[Inet FAQ]]<br /> *[[Схемы подключения]]<br /> *[[Расширения]]<br /> *[[Конвертеры из IPN в INET]]<br /> *[[Конвертер: логины Dialup в сервисы inet]]<br /> <br /> ==== Модуль IPN ====<br /> *[[IP/VPN]]<br /> *[[Примеры тарифных планов IPN]]<br /> *[[Настройка BGIPNNetflowCollector]]<br /> *[[Методика определения причины отсутствия трафика в отчете договора]]<br /> *[[Связка с flow-tools]]<br /> *[[Экспорт Netflow-данных в формат Nfdump]]<br /> *[[Реалиазация шлюза на Cisco]]<br /> *[[Реализация шлюзов на BeanShell,примеры стандартных и других шлюзов]] (Manad, Cisco, Zyxel, Mikrotik)<br /> *[[Изменения в manad для работы с одним pipe на множество IP адресов]]<br /> *[[FreeBSD manad, понимающий изменения правил в тарифах]]<br /> *[[Табличный FreeBSD manad, понимающий изменения правил в тарифах]]<br /> *[[Пример реализации скриптового универсального шлюза]]<br /> *[[Конвертер привязок услуг dialup в привязки ipn]]<br /> *[[Реализация скрипта Manad]]<br /> *[[Настройка шлюза Mikrotik]]<br /> *[[Обновление номеров интерфейсов при замене роутера]]<br /> <br /> ==== Модуль Phone ====<br /> * [[Конвертация и загрузка тарифов Телефонии в биллинг]]<br /> * [[Примеры тарифных планов Телефонии]]<br /> * [[Примеры реализации конверторов логов]]<br /> * [[Генератор отчётности для Совинтел]]<br /> <br /> ==== Модуль Reports ====<br /> *[[Редактирование отчетов в iReport]]<br /> *[[Примеры отчётов]]<br /> *[[Использование отчётов для организации универсального поиска]]<br /> *[[Табличные отчёты с динамическими столбцами]]<br /> *[[Табличные отчёты в динамическом коде]]<br /> *[[Сохранение JasperReports-отчёта на сервере в pdf]]<br /> <br /> ==== Модуль TV ====<br /> *[[Активация/добавление модуля на договор через дополнительное действие]]<br /> <br /> ==== Модуль VoiceIP ====<br /> *[[Интеграция Asterisk и BGBilling (Accounting) посредством скрипта предобработки запросов Radius]]<br /> *[[Интеграция Asterisk и BGBilling (Accounting) посредством изменения программного кода Asterisk]]<br /> *[[Интеграция c MVTS]]<br /> *[[Интеграция c Cisco Call Manager Express (CME)]]<br /> *[[Карточная IVR система на базе Cisco]]<br /> *[[Примеры IVR скриптов для Cisco]]<br /> *[[Пример настройки Cisco AS5350]]<br /> *[[Продажа пакетов минут на направления]]<br /> <br /> ==== Плагин Dispatch ====<br /> *[[Импорт старой схемы рассылок баланса в Dispatch]]<br /> <br /> === SQL-запросы ===<br /> *[[Схема связки таблиц тарифов]]<br /> *[[Разные SQL-запросы]]<br /> *[[SQL-запрос: кто сколько платит на каждом тарифе]]<br /> *[[Получение цен тарифов]]<br /> *[[Работа с группами, битовые маски]]<br /> *[[наработка по абонентке и услугам за месяц]]<br /> <br /> ==== CerberCrypt ====<br /> *[[Модуль CerberCrypt: Разные SQL-запросы]]<br /> *[[Модуль CerberCrypt: Поиск битых SQL-связей]]<br /> <br /> === Веб-Интерфейс ===<br /> *[[Свой action в личном кабинете]]<br /> **[[WebAction_CustomSuspend]] - управление статусом договора (v5.0)<br /> *[[Изменение параметров договора из личного кабинета]]<br /> *[[Как убрать ненужные действия в web]]<br /> <br /> === Протоколы ===<br /> *[[Протокол дилерский платежей]]<br /> *[[Протоколы, поддержанные в модуле MPS]]<br /> *[[Протоколы, поддержанные в модуле Phone]]<br /> *[[Медиа: Enaza.zip]]<br /> *[[Медиа: Payonline.zip]]<br /> <br /> === FAQ ===<br /> * [[Не запускается служба BSBillingServer под Windows]]<br /> * [[Вопросы вместо русских букв]]<br /> * [[Что происходит с пользователями при рестарте сервера биллинга и BGRadiusDialup]]<br /> * [[Тарификация максимального трафика]]<br /> * [[Field ... doesn't have a default value ]]<br /> * [[Character set ‘cp1251' is not a compiled character set and is not specified in the ‘C:\mysql\\share\charsets\Index.xml’ file ]]<br /> * [[com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown database 'bgbilling' ]]<br /> * [[Договор не отображается в поиске]]<br /> * [[PPPD проблема с сессиями больше 4ГБ]]<br /> * [[Меню личного кабинета]]<br /> * [[Java.lang.NoClassDefFoundError:_javax/xml/bind/DataBindingException|FreeBSD: Java.lang.NoClassDefFoundError: javax/xml/bind/DataBindingException]]<br /> * [[Manad: после некоторого количества договоров начинает передавать данные на биллинг неправильно ]]<br /> * [[Ошибка выполнения скиптов: Undefined argument:]]<br /> * [[Ошибка в логе &quot;Too many open files&quot;]]<br /> * [[Ошибка в клиенте &quot;Action NOT FOUND!..&quot;]]<br /> * [[Inet FAQ]]<br /> * [[java.lang.NoSuchMethodError]]<br /> <br /> == BGCRM ==<br /> <br /> === Плагин BGBilling ===<br /> * [[Синхронизация справочников адресов с BGBilling]]<br /> * [[Активация доверительного платежа в привязанном к процессу договоре биллинга]]<br /> <br /> === Плагин Document ===<br /> * [[Примеры шаблонов для генерации документов]]<br /> <br /> === Плагин Report ===<br /> * [[Примеры отчётов BGCRM]]<br /> <br /> === Комплексные решения ===<br /> *[[Организация отключения должников КТВ]]<br /> *[[Интеграция с Asterisk для обработки входящих звонков]]<br /> <br /> === Примеры динамического кода ===<br /> *[[Проверка уникальности контрагента по ИНН]]<br /> *[[Проверка уникальности контрагента по паспортным данным]]<br /> *[[Переключение статуса процессов по наступлению момента времени]]<br /> *[[Повышение приоритета процессов]]<br /> *[[Проверка правки параметра процесса]]<br /> *[[Изменение описания процесса по правке параметра]]<br /> *[[Обработка событий процесса согласования]]<br /> *[[Генерация новостей исполнителям при изменении процессов]]<br /> *[[Уведомление на email]]<br /> <br /> == DBInfo ==<br /> * [[Описание программы]]<br /> * [[Установка и настройка программы]]<br /> * [[Исходный код программы]]<br /> <br /> == Разработка ПО ==<br /> В данном разделе собираются рекомендации по разработке ПО. Это накопленная годами и пополняемая база знания призвана упростить обучение в первую очередь разработчиков, работающих с применяемыми в BiTel технологиями: Java, Web (JS, HTML), СУБД MySQL, LINUX, GIT. И разрабатывающих схожие приложения: тиражируемые продукты для автоматизации процессов организаций. Всё предельно конкретно, поэтому большая часть примеров будет приведена на Java.<br /> Однако значительная часть описываемых проблем и принципов довольно фундоментальна и может быть полезна разработчиками в иных областях.<br /> <br /> === В общем ===<br /> * [[Разработка]]<br /> * [[Оптимизация]]<br /> * [[Логирование]]<br /> * [[Сборка и публикация проекта]]<br /> <br /> === Java разработка ===<br /> * [[Работа с git в Eclipse(EGit)]]<br /> * [[Выявление неисправностей приложений]]<br /> * [[Обращение к Web-сервису]]<br /> * [[Работа с SQL в Java]]<br /> * [[Встроенный Application сервер в приложении]]<br /> * [[Потоки в Java]]<br /> * [[Обработка ошибок]]<br /> <br /> ==== Полезные Java библиотеки ====<br /> {| border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;<br /> |- valign=top align=&quot;center&quot; bgcolor=&quot;#eeeeee&quot; <br /> | Наименование || Область применения<br /> |-<br /> | [[Jimi - обработка изображений | JIMI]] || Обработка изображений<br /> |}<br /> <br /> === Технологии, используемые в проектах ===<br /> * [[XML]]<br /> * [[XSLT]]<br /> * [[FO(P)]]<br /> * [[REGEXP]]<br /> * [[MySQL REGEXP]]<br /> <br /> === Вспомогательные технологии ===<br /> * [[Сборщик Apache ANT]]<br /> * [[Сбор и анализ сетевого трафика]]<br /> * [[SSH]]<br /> * [[Оптимизация запросов в MySQL]]<br /> <br /> === Требования BiTel к оформлению ===<br /> * [[Java кода]]<br /> * [[MySQL кода]]</div> DimOn http://wiki.bitel.ru/index.php/%D0%94%D0%B8%D0%BD.%D0%BA%D0%BE%D0%B4_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_pairing_%D1%81_%D0%B2%D0%BD%D0%B5%D1%88%D0%BD%D0%B5%D0%B3%D0%BE_cas Дин.код для синхронизации pairing с внешнего cas 2014-12-12T13:14:44Z <p>DimOn:&#32;</p> <hr /> <div>Скрипт предназначен для синхронизации значения pairing_module в БД со значением уже установленным в CAS-сервере. Показывается пример того, как можно работать с API активаторов каждого протокола (см. DigitalTVServiceActivator) из скрипта. Данный пример предназначен для ручного запуска из редактора дин.кода. Каждый перезапуск пересинхронизирует и пересохраняет заново.<br /> <br /> &lt;source lang=java&gt;<br /> package ru.bitel.bgbilling.modules.cerbercrypt;<br /> <br /> import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;<br /> import ru.bitel.bgbilling.server.util.Setup;<br /> import ru.bitel.common.sql.ConnectionSet;<br /> <br /> import java.sql.Connection;<br /> import java.util.Calendar;<br /> <br /> import ru.bitel.bgbilling.kernel.module.common.bean.User;<br /> import ru.bitel.bgbilling.modules.cerbercrypt.common.bean.Card;<br /> import ru.bitel.bgbilling.modules.cerbercrypt.server.DigitalTVServiceActivator;<br /> import ru.bitel.bgbilling.modules.cerbercrypt.server.DigitalTVServiceActivator.ServiceActivationResult;<br /> import ru.bitel.bgbilling.modules.cerbercrypt.server.bean.CardManager;<br /> import ru.bitel.bgbilling.server.util.ModuleSetup;<br /> import ru.bitel.bgbilling.server.util.Setup;<br /> <br /> public class PairingSynchronizer<br /> extends GlobalScriptBase<br /> {<br /> private static final int CERBERCRYPT_MID = 666;<br /> <br /> @Override<br /> public void execute( Setup setup, ConnectionSet connectionSet )<br /> throws Exception<br /> {<br /> Connection con = connectionSet.getConnection();<br /> ModuleSetup moduleSetup = Setup.getSetup().getModuleSetup(CERBERCRYPT_MID);<br /> DigitalTVServiceActivator sa = DigitalTVServiceActivator.newInstance( moduleSetup, con, CERBERCRYPT_MID, Calendar.getInstance() );<br /> //<br /> CardManager cm = new CardManager(con, CERBERCRYPT_MID, User.USER_SERVER);<br /> for( Long number : cm.getAllCardNumbers() )<br /> {<br /> System.out.println(&quot;=&gt;card: &quot;+number);<br /> ServiceActivationResult result = sa.getPairing(number.longValue());<br /> if(result.isResult())<br /> {<br /> String caspairing = result.getMessage();<br /> Card card = cm.getCard(number);<br /> String dbpairing = card.getPairingModule();<br /> <br /> if(caspairing!=null)<br /> {<br /> System.out.println(&quot;\tpairing (cas): &quot;+caspairing);<br /> if(!caspairing.equals(dbpairing))<br /> {<br /> card.setPairingModule(caspairing);<br /> cm.updateCard(card);<br /> System.out.println(&quot;\tupdate card pairing (db): &quot;+dbpairing+&quot;-&gt;&quot;+caspairing);<br /> }<br /> else<br /> {<br /> System.out.println(&quot;\tnot need to update&quot;);<br /> }<br /> }<br /> else<br /> {<br /> System.out.println(&quot;\tpairing (cas): none&quot;);<br /> // здесь можно сделать очищение pairing в бд, если его нет в cas<br /> }<br /> }<br /> else<br /> {<br /> System.out.println(&quot;\terror: &quot;+result.getMessage());<br /> }<br /> }<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> --[[Участник:DimOn|dimOn]] 13:11, 12 декабря 2014 (UTC)<br /> <br /> {{Актуальность Версии|версия=6.1}}</div> DimOn http://wiki.bitel.ru/index.php/%D0%94%D0%B8%D0%BD.%D0%BA%D0%BE%D0%B4_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_pairing_%D1%81_%D0%B2%D0%BD%D0%B5%D1%88%D0%BD%D0%B5%D0%B3%D0%BE_cas Дин.код для синхронизации pairing с внешнего cas 2014-12-12T13:12:50Z <p>DimOn:&#32;</p> <hr /> <div>Скрипт предназначен для синхронизации значения pairing_module в БД со значением уже установленным в CAS-сервере. Показывается пример того, как можно работать с API активаторов каждого протокола (см. DigitalTVServiceActivator) из скрипта. Данный пример предназначено для ручного запуска из редактора дин.кода. Каждый перезапуск пересинхронизирует и пересохраняет заново.<br /> <br /> &lt;source lang=java&gt;<br /> package ru.bitel.bgbilling.modules.cerbercrypt;<br /> <br /> import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;<br /> import ru.bitel.bgbilling.server.util.Setup;<br /> import ru.bitel.common.sql.ConnectionSet;<br /> <br /> import java.sql.Connection;<br /> import java.util.Calendar;<br /> <br /> import ru.bitel.bgbilling.kernel.module.common.bean.User;<br /> import ru.bitel.bgbilling.modules.cerbercrypt.common.bean.Card;<br /> import ru.bitel.bgbilling.modules.cerbercrypt.server.DigitalTVServiceActivator;<br /> import ru.bitel.bgbilling.modules.cerbercrypt.server.DigitalTVServiceActivator.ServiceActivationResult;<br /> import ru.bitel.bgbilling.modules.cerbercrypt.server.bean.CardManager;<br /> import ru.bitel.bgbilling.server.util.ModuleSetup;<br /> import ru.bitel.bgbilling.server.util.Setup;<br /> <br /> public class PairingSynchronizer<br /> extends GlobalScriptBase<br /> {<br /> private static final int CERBERCRYPT_MID = 666;<br /> <br /> @Override<br /> public void execute( Setup setup, ConnectionSet connectionSet )<br /> throws Exception<br /> {<br /> Connection con = connectionSet.getConnection();<br /> ModuleSetup moduleSetup = Setup.getSetup().getModuleSetup(CERBERCRYPT_MID);<br /> DigitalTVServiceActivator sa = DigitalTVServiceActivator.newInstance( moduleSetup, con, CERBERCRYPT_MID, Calendar.getInstance() );<br /> //<br /> CardManager cm = new CardManager(con, CERBERCRYPT_MID, User.USER_SERVER);<br /> for( Long number : cm.getAllCardNumbers() )<br /> {<br /> System.out.println(&quot;=&gt;card: &quot;+number);<br /> ServiceActivationResult result = sa.getPairing(number.longValue());<br /> if(result.isResult())<br /> {<br /> String caspairing = result.getMessage();<br /> Card card = cm.getCard(number);<br /> String dbpairing = card.getPairingModule();<br /> <br /> if(caspairing!=null)<br /> {<br /> System.out.println(&quot;\tpairing (cas): &quot;+caspairing);<br /> if(!caspairing.equals(dbpairing))<br /> {<br /> card.setPairingModule(caspairing);<br /> cm.updateCard(card);<br /> System.out.println(&quot;\tupdate card pairing (db): &quot;+dbpairing+&quot;-&gt;&quot;+caspairing);<br /> }<br /> else<br /> {<br /> System.out.println(&quot;\tnot need to update&quot;);<br /> }<br /> }<br /> else<br /> {<br /> System.out.println(&quot;\tpairing (cas): none&quot;);<br /> // здесь можно сделать очищение pairing в бд, если его нет в cas<br /> }<br /> }<br /> else<br /> {<br /> System.out.println(&quot;\terror: &quot;+result.getMessage());<br /> }<br /> }<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> --[[Участник:DimOn|dimOn]] 13:11, 12 декабря 2014 (UTC)<br /> <br /> {{Актуальность Версии|версия=6.1}}</div> DimOn http://wiki.bitel.ru/index.php/%D0%94%D0%B8%D0%BD.%D0%BA%D0%BE%D0%B4_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_pairing_%D1%81_%D0%B2%D0%BD%D0%B5%D1%88%D0%BD%D0%B5%D0%B3%D0%BE_cas Дин.код для синхронизации pairing с внешнего cas 2014-12-12T13:11:07Z <p>DimOn:&#32;</p> <hr /> <div>Скрипт предназначен для синхронизации значения pairing_module в БД со значением уже установленным в CAS-сервере. Показывается пример того, как можно работать с API активаторов каждого протокола (см. DigitalTVServiceActivator) из скрипта. Данный пример предназначено для ручного запуска из редактора дин.кода. Каждый перезапуск пересинхронизирует и пересохраняет заново.<br /> <br /> &lt;source lang=java&gt;<br /> package ru.bitel.bgbilling.modules.cerbercrypt;<br /> <br /> import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;<br /> import ru.bitel.bgbilling.server.util.Setup;<br /> import ru.bitel.common.sql.ConnectionSet;<br /> <br /> import java.sql.Connection;<br /> import java.util.Calendar;<br /> <br /> import ru.bitel.bgbilling.kernel.module.common.bean.User;<br /> import ru.bitel.bgbilling.modules.cerbercrypt.common.bean.Card;<br /> import ru.bitel.bgbilling.modules.cerbercrypt.server.DigitalTVServiceActivator;<br /> import ru.bitel.bgbilling.modules.cerbercrypt.server.DigitalTVServiceActivator.ServiceActivationResult;<br /> import ru.bitel.bgbilling.modules.cerbercrypt.server.bean.CardManager;<br /> import ru.bitel.bgbilling.server.util.ModuleSetup;<br /> import ru.bitel.bgbilling.server.util.Setup;<br /> <br /> public class PairingSynchronizer<br /> extends GlobalScriptBase<br /> {<br /> private static final int CERBERCRYPT_MID = 666;<br /> <br /> @Override<br /> public void execute( Setup setup, ConnectionSet connectionSet )<br /> throws Exception<br /> {<br /> Connection con = connectionSet.getConnection();<br /> ModuleSetup moduleSetup = Setup.getSetup().getModuleSetup(CERBERCRYPT_MID);<br /> DigitalTVServiceActivator sa = DigitalTVServiceActivator.newInstance( moduleSetup, con, CERBERCRYPT_MID, Calendar.getInstance() );<br /> //<br /> CardManager cm = new CardManager(con, CERBERCRYPT_MID, User.USER_SERVER);<br /> for( Long number : cm.getAllCardNumbers() )<br /> {<br /> System.out.println(&quot;=&gt;card: &quot;+number);<br /> ServiceActivationResult result = sa.getPairing(number.longValue());<br /> if(result.isResult())<br /> {<br /> String caspairing = result.getMessage();<br /> Card card = cm.getCard(number);<br /> String dbpairing = card.getPairingModule();<br /> <br /> if(caspairing!=null)<br /> {<br /> System.out.println(&quot;\tpairing (cas): &quot;+caspairing);<br /> if(!caspairing.equals(dbpairing))<br /> {<br /> card.setPairingModule(caspairing);<br /> cm.updateCard(card);<br /> System.out.println(&quot;\tupdate card pairing (db): &quot;+dbpairing+&quot;-&gt;&quot;+caspairing);<br /> }<br /> else<br /> {<br /> System.out.println(&quot;\tnot need to update&quot;);<br /> }<br /> }<br /> else<br /> {<br /> System.out.println(&quot;\tpairing (cas): none&quot;);<br /> }<br /> }<br /> else<br /> {<br /> System.out.println(&quot;\terror: &quot;+result.getMessage());<br /> }<br /> }<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> --[[Участник:DimOn|dimOn]] 13:11, 12 декабря 2014 (UTC)<br /> <br /> {{Актуальность Версии|версия=6.1}}</div> DimOn http://wiki.bitel.ru/index.php/%D0%94%D0%B8%D0%BD.%D0%BA%D0%BE%D0%B4_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_pairing_%D1%81_%D0%B2%D0%BD%D0%B5%D1%88%D0%BD%D0%B5%D0%B3%D0%BE_cas Дин.код для синхронизации pairing с внешнего cas 2014-12-12T13:10:31Z <p>DimOn:&#32;Новая страница: «Скрипт предназначен для синхронизации значения pairing_module в БД со значением уже установленн…»</p> <hr /> <div>Скрипт предназначен для синхронизации значения pairing_module в БД со значением уже установленным в CAS-сервере. Показывается пример того, как можно работать с API активаторов каждого протокола (см. DigitalTVServiceActivator) из скрипта. Данный пример предназначено для ручного запуска из редактора дин.кода. Каждый перезапуск пересинхронизирует и пересохраняет заново.<br /> <br /> &lt;source lang=java&gt;<br /> package ru.bitel.bgbilling.modules.cerbercrypt;<br /> <br /> import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;<br /> import ru.bitel.bgbilling.server.util.Setup;<br /> import ru.bitel.common.sql.ConnectionSet;<br /> <br /> import java.sql.Connection;<br /> import java.util.Calendar;<br /> <br /> import ru.bitel.bgbilling.kernel.module.common.bean.User;<br /> import ru.bitel.bgbilling.modules.cerbercrypt.common.bean.Card;<br /> import ru.bitel.bgbilling.modules.cerbercrypt.server.DigitalTVServiceActivator;<br /> import ru.bitel.bgbilling.modules.cerbercrypt.server.DigitalTVServiceActivator.ServiceActivationResult;<br /> import ru.bitel.bgbilling.modules.cerbercrypt.server.bean.CardManager;<br /> import ru.bitel.bgbilling.server.util.ModuleSetup;<br /> import ru.bitel.bgbilling.server.util.Setup;<br /> <br /> public class PairingSynchronizer<br /> extends GlobalScriptBase<br /> {<br /> private static final int CERBERCRYPT_MID = 666;<br /> <br /> @Override<br /> public void execute( Setup setup, ConnectionSet connectionSet )<br /> throws Exception<br /> {<br /> Connection con = connectionSet.getConnection();<br /> ModuleSetup moduleSetup = Setup.getSetup().getModuleSetup(CERBERCRYPT_MID);<br /> DigitalTVServiceActivator sa = DigitalTVServiceActivator.newInstance( moduleSetup, con, CERBERCRYPT_MID, Calendar.getInstance() );<br /> //<br /> CardManager cm = new CardManager(con, CERBERCRYPT_MID, User.USER_SERVER);<br /> for( Long number : cm.getAllCardNumbers() )<br /> {<br /> System.out.println(&quot;=&gt;card: &quot;+number);<br /> ServiceActivationResult result = sa.getPairing(number.longValue());<br /> if(result.isResult())<br /> {<br /> String caspairing = result.getMessage();<br /> Card card = cm.getCard(number);<br /> String dbpairing = card.getPairingModule();<br /> <br /> if(caspairing!=null)<br /> {<br /> System.out.println(&quot;\tpairing (cas): &quot;+caspairing);<br /> if(!caspairing.equals(dbpairing))<br /> {<br /> card.setPairingModule(caspairing);<br /> cm.updateCard(card);<br /> System.out.println(&quot;\tupdate card pairing (db): &quot;+dbpairing+&quot;-&gt;&quot;+caspairing);<br /> }<br /> else<br /> {<br /> System.out.println(&quot;\tnot need to update&quot;);<br /> }<br /> }<br /> else<br /> {<br /> System.out.println(&quot;\tpairing (cas): none&quot;);<br /> }<br /> }<br /> else<br /> {<br /> System.out.println(&quot;\terror: &quot;+result.getMessage());<br /> }<br /> }<br /> }<br /> }<br /> &lt;/source&gt;<br /> <br /> {{Актуальность Версии|версия=6.1}}</div> DimOn http://wiki.bitel.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0 Заглавная страница 2014-12-12T13:06:54Z <p>DimOn:&#32;/* Модуль СerberСrypt */</p> <hr /> <div>== О BiTel Wiki ==<br /> Здесь вы можете получить больше информации о продуктах BiTel: BGBilling, BGCRM, а также поделиться своим опытом с другими пользователями. В то время как документация часто предоставляет общие сведения о системе и ее настройках, в WiKi приводятся конкретные примеры.<br /> <br /> * &lt;b&gt;[[Как выложить статью на WiKi]]&lt;/b&gt;<br /> * [[Оформление статей]]<br /> * [http://forum.bitel.ru/ Форум BiTel]<br /> <br /> == Специалисты ==<br /> Уважаемые &quot;продвинутые пользователи&quot;. Здесь вы можете располагать записи со своими контактами для оказания воздмездной или безвозмездной помощи по настройке системы BGBilling пользователям, не столь далеко продвинувшимся. Желательно указывать ваши контактные данные и &quot;специализацию&quot;. Отзывы по исполнителям можно оставить/почитать [http://forum.bitel.ru/viewtopic.php?t=9329 на форуме].<br /> {| border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;<br /> |- valign=top align=&quot;center&quot; bgcolor=&quot;#eeeeee&quot; <br /> | Имя || Специализация || Контакт || Примечания<br /> |-<br /> | Рустам Тазуркаев || Mikrotik, переход с NetUp, CISCO || [[Изображение:Cpec_2_contact.png]] &lt;!-- ICQ: 648986--&gt; ||<br /> |-<br /> | Михаил Чернобаев || Скрипты биллинга, FreeBSD MPD || ICQ: 262986492 || Скриптование в биллинге, возможны крупные проекты.<br /> |- <br /> | Борис Близнюков || Скрипты биллинга, CISCO, Voip, Mera || [[Изображение:Cpec_4_contact.png]] &lt;!--ICQ: 1996944--&gt; || Только бесплатные краткие консультации. Очень хороший специалист по CISCO.<br /> |-<br /> | Андрей Бехтерев || Cisco, UNIX, ISP, Asterisk || ICQ: 7021464 WEB: http://behterev.su/ || Обширный спектр оборудования. Консалтинг.<br /> |-<br /> | Гершевич М.М. || Доработка конфигурации 1С и прочего ПО. || Тел. +79248454888 +7-(4162)-238-777 WEB: http://www.amurimpulse.ru/ mail: mike1008@mail.ru || Консалтинг. Информационная безопасность. Интеграция биллинга. Крупные проекты. Работа под заказ.<br /> |-<br /> | Андрей Зюзенков || Linux, BGBilling || http://bghelp.ru ICQ: 639121822 jabber: zavndw@jabber.ru e-mail: zavndw@gmail.com skype: zavndw || Настройка, запуск, обслуживание BGBilling и истем linux, консультации<br /> |-<br /> | Семён Кошечкин || Java || email/gtalk: [[Файл:Cpec_5_contact.jpg]]|| Скрипты, дополнения, модуль Inet. [[%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:Contributions/Cromeshnic|wiki]]<br /> |-<br /> |-<br /> | Конференция BGBilling || вопросы касаемо системы BGBilling || bgbilling@conference.jabber.ru || Администраторы АСР BGBillig(иногда и разработчики) помогают друг другу в разных вопросах.<br /> |}<br /> <br /> == BGBilling ==<br /> === Установка ===<br /> * [[Установка на gentoo]]<br /> * [[Установка на Sun Solaris]]<br /> * [[Установка на Slackware]]<br /> * [[Установка на FreeBSD]]<br /> * [[Установка на Ubuntu 8 Desktop]]<br /> * [[Установка на Ubuntu 9.10 Desktop]]<br /> <br /> ==== Перенос данных в биллинг ====<br /> *[[Пример конвертера данных из csv-файлов в базу BGBilling]]<br /> *[[Пример конвертера данных из CSV-файлов в базу BGBilling - 2]]<br /> *[[Пример конвертера данных из CSV-файлов в базу BGBilling - 3]]<br /> *[[Конвертер базы Netup]]<br /> *[[Примеры конвертеров данных из других биллинговых систем]]<br /> <br /> === Администрирование ===<br /> * [[Разграничение прав действий]]<br /> * [[Настройка безопасности сервера биллинга и компонентов биллинга]]<br /> * [[Принудительный останов процессов биллинга]]<br /> * [[Использование подписанного SSL сертификата]]<br /> * [[Запуск scheduler и data_loader с другими портами управления]]<br /> * [[bg-snmp-management|Мониторинг java-процессов по snmp]]<br /> * [[Скрипты автостарта демонов bgbilling для Debian]]<br /> * [[javaws|Запуск BGBillingClient через Java Web Start]]<br /> * [[Мониторинг Inet-Radius через JMX]]<br /> * [[Интеграция существующего сертификата и приватного ключа SSL в хранилище keystore]]<br /> <br /> === Настройка вспомогательного ПО ===<br /> *[[Проксирование обращений к BGBillingServer посредством nginx]]<br /> <br /> ==== MySQL ====<br /> *[[Рекомендации по настройке MySQL]]<br /> *[[database backup|Backup MySQL базы с помощью snapshot'ов (Linux, LVM)]]<br /> *[[Настройка MySQL репликации]]<br /> *[[Установка триггера в MySQL для отслеживания изменений]]<br /> *[[Скрипт восстановления MySQL репликации]]<br /> *[[Simple DB backup]]<br /> <br /> ==== NetFlow ====<br /> *[[Настройка NetFlow-агента IPCAD]]<br /> *[[Разделение NetFlow-потоков]]<br /> <br /> === Технологии ===<br /> *[[BGBilling_XSLT|XSLT]]<br /> <br /> === Разработка ===<br /> *[[Отладка action'ов в IntelliJ IDEA]]<br /> *[[Разработка динамического кода в IDE Eclipse]]<br /> <br /> === [[XSLT]] шаблоны ===<br /> *[[Добавление параметров договора на страницу личного кабинета]]<br /> &lt;!-- *[[Красивые графики статистики в модуле IPN]] --&gt;<br /> *[[Карточки договора]]<br /> *[[Создание XSLT/FO шаблона со штрихкодами]]<br /> *[[Подстановка данных в зависимости от текущего пользователя биллинга]]<br /> *[[Генерация прайса модуля IP телефонии в карточке договора]]<br /> <br /> ==== Счета ====<br /> *[[Печать счета-фактуры и акта на отдельных листах]]<br /> *[[Расширенные счета модуля бухгалтерии]]<br /> *[[Квитанция телефонии физ. лицам]]<br /> *[[Шаблоны вывода названия месяца]]<br /> *[[Изменения в шаблоне в зависимости от месяца документа]]<br /> *[[Добавление новых шрифтов в FO шаблоны]]<br /> <br /> === Интеграция с внешними системами ===<br /> * [[Прямая интеграция с платежными терминалами ЭСФОР / SFOUR]]<br /> * [[Интеграция с платежной системой с использованием модуля Card]]<br /> * [[Интеграция с платежной системой Robokassa]]<br /> * [[SMS рассылка через SMPP]]<br /> * [[SMS рассылка через SMPP по средствам дин кода в 5.2]]<br /> * [[Система учета &quot;Заявки и Наряды&quot; на java]]<br /> * [[Bash скрипт-отсылка смс через телефон при отсутствие ping на заданный узел]]<br /> * [[Запросы в личный кабинет пользователя сторонними системами]]<br /> * [[Запросы к серверу биллинга сторонними системами]]<br /> <br /> ==== 1С ====<br /> * [[BGBilling-1C]]<br /> * [[amurimpulse.ru bgbilling]]<br /> * [[Integrator 1C-BGBilling]]<br /> * [[Пример обращения к биллингу из 1С v.7.7]]<br /> * [[Пример интеграции с 1С v.7.7]]<br /> * [[Пример интеграции с 1С v.8.1]]<br /> * [[Установка unload_status счета через HTTP-запрос]]<br /> <br /> === Динамический код (скрипты BGBS для старых версий) ===<br /> *[[Логгирование в скриптах поведения]]<br /> <br /> ==== Динамический код ====<br /> *[[Конвертирование адреса]]<br /> *[[Глобальная синхронзация услуг модуля npay с тарифным планом]]<br /> *[[Новый номер договора группе договоров]]<br /> <br /> ==== Комплексные решения ====<br /> *[[Предоставление тестового периода пользования услугой]]<br /> *[[Организация системы отслеживания и отключения КТВ должников на BGBS с использованием CRM плагина]]<br /> *[[Автоматизация подключений VPN-клиентов с использованием CRM плагина]]<br /> *[[Пример автоматизации подключения новых клиентов]]<br /> <br /> ==== Глобальные скрипты ====<br /> *[[Скрипт глобальный отмены перехода на тарифы при неоплате]]<br /> *[[Скрипт предоставление скидки пенсионерам]]<br /> *[[Скрипт создания субдоговоров по шаблону]]<br /> *[[Глобальное событие запуска сервера]]<br /> *[[Перемещение в группу через 3 месяца если не было движения денег в наработке]]<br /> *[[Поиск и изменение статусов у договоров]]<br /> *[[Получение списка доступных действий в SQL]]<br /> *[[Глобальный скрипт для удаления старых таблиц]]<br /> <br /> ==== Пользовательские библиотеки скриптов ====<br /> *[[Пересчеты и бонусы]]<br /> *[[Архивирование логов netflow и radius accaunting]]<br /> <br /> ==== Ядро ====<br /> *[[Смена тарифного плана по заданию пользователя]]<br /> *[[Валидация текстового параметра]]<br /> *[[Проверка ИНН/КПП при вводе]]<br /> *[[Проверка параметра договора перед изменением]]<br /> *[[Обработка смены параметра договора]]<br /> *[[Создание списка дополнительных действий для договора]]<br /> *[[Обработка события создания договора]]<br /> *[[Обработка события &quot;добавление услуги RSCM в договор&quot; . Скипт сменяет тариф, подключает абонплату ]]<br /> *[[Приостановление договора клиентом через WEB]]<br /> *[[Скрипт проверки баланса и отключения договора]]<br /> *[[Изменение стандартной логики перетирания статусов]]<br /> *[[Пример продажи OEM ключей с помощью скрипта]]<br /> *[[Пример копирования тарифного плана]]<br /> *[[Получение текущего пользователя биллинга]]<br /> *[[Запуск скрипта до и после акшена]]<br /> *[[Примеры скриптов до и после акшена]]<br /> *[[Примеры динамического кода акшена и веб-сервисов]]<br /> *[[Начисление бонусов на счет при платежах определенного типа]]<br /> *[[Включение должников по приходу платежа]]<br /> *[[Снижение лимита при внесении расхода]]<br /> *[[Синхронизация услуг договора в соответствии с тарифными планами]]<br /> *[[Добавление группы и снятие в зависимости от статуса]]<br /> *[[Управление статусом договора по состоянию баланса]]<br /> *[[Запрет на вход в личный кабинет с закрытых договоров]]<br /> *[[Переход на понижающий тариф только со следующего месяца]]<br /> *[[Пример создания своего интерфейса в клиенте]]<br /> *[[Метки услуг]]<br /> *[[Сравнение прав пользователей]]<br /> *[[Свой список шаблонов договоров]]<br /> <br /> ==== Модуль Bill ====<br /> *[[Создание счета в модуле Bill]]<br /> *[[Создание счета из суммы платежей по классу договоров]]<br /> *[[Создание счета по таблице позиций]]<br /> *[[Создание счета и счет-фактур в модуле Bill(выполнение тех же действий что и руками)]]<br /> *[[Создание счетов на предоплату]]<br /> *[[Распечатка счетов в pdf по событию генерации счета]]<br /> *[[Внешняя программа на JAVA для синхронизации номеров счетов и актов выполненных работ (версия BGBilling 5.0)]]<br /> *[[Автоматическая отправка счетов через глобальный скрипт поведения]]<br /> <br /> ==== Модуль DialUp ====<br /> *[[Запуск переначисления в модуле DialUp]]<br /> *[[Передача ACCEPT вместо REJECT вместе с доп. аттрибутами]]<br /> *[[Обработка запроса учетного периода]]<br /> *[[Переинициализация тарифа в пределах сессии | Обработка запроса учетного периода (переинициализация тарифа в пределах сессии) ]]<br /> *[[Ограничение доступа для различных групп пользователей для BGRadiusDialup]]<br /> *[[Детальное информирование абонентов о причинах ошибки 691]]<br /> *[[Аутентификация с учетом Calling-Id-Station]]<br /> *[[Доп. действие сброса активных соединений]]<br /> *[[Открытие абонплаты по первой установке соединения]]<br /> *[[Пересчет трафика по данным Radius (при потерянных Netflow-логах)]]<br /> *[[Отключение Fake сессий при приходе платежа]]<br /> *[[Ограничение доступа на основе объектов]]<br /> <br /> ==== Модуль DialUp / Cкрипты предобработки RADIUS запросов ====<br /> * [[Уcтановка услуги типа &quot;Время&quot; для BGRadiusDialup]]<br /> * [[Установка фиксированного пароля]]<br /> * [[Нормализация параметра Acct-Session-Id у маршрутизатора Cisco]]<br /> * [[Разделение атрибута User-Name на логин и пароль]]<br /> * [[Вынос MAC адреса из cisco-avp-pair в Calling-Station-Id]]<br /> * [[Копирование Тunnel-Client-Endpoint/Tunnel-Server-Endpoint в Calling-Station-Id/Called-Station-Id]]<br /> * [[Замена radius-атрибутов при авторизации]]<br /> <br /> ==== Модуль Inet / Cкрипты предобработки RADIUS запросов ====<br /> * [[Вынос MAC адреса из cisco-avp-pair в Calling-Station-Id для модуля Inet]]<br /> <br /> ==== Модуль СerberСrypt ====<br /> *[[Изменение подписки карты через web (cerbercrypt)]]<br /> *[[Управление подписками через веб (cerbercrypt)]]<br /> *[[Дин.код для синхронизации pairing с внешнего cas]]<br /> <br /> ==== Модуль NPay ====<br /> *[[Определение размера абонентской платы]]<br /> *[[Запуск переначисления в модуле NPay]]<br /> *[[Дебетовые абонплаты. Снятие штрафа за разблокировку.]]<br /> *[[Снятие абонентской платы в дебитовых договорах]]<br /> *[[Предварительное уведомление о блокировке по дебетовым абонплатам]]<br /> <br /> ==== Модуль Phone ====<br /> *[[При создании поинта модуля Phone добавление в него абонплат]]<br /> *[[Закрытие_телефонных_договоров]]<br /> <br /> ==== Модуль RSCM ====<br /> *[[Запуск переначисления в модуле RSCM]]<br /> *[[Перенос суммы расхода в наработку RSCM модуля]]<br /> <br /> ==== Модуль VoiceIp ====<br /> *[[Определение стоимости звонка VoiceIp]]<br /> <br /> ==== Модуль VoiceIp / Cкрипты предобработки RADIUS запросов ====<br /> * [[Идентификация Voip оператора по подсети (транзит)]]<br /> * [[Установка параметров звонка Voip]]<br /> * [[Установка фиксированного пароля]]<br /> * [[Разделение атрибута User-Name на логин и пароль]]<br /> * [[Замена radius-атрибутов при авторизации]]<br /> <br /> ==== Плагин CRM ====<br /> *[[Обработка выполненных задач в журнале задач]]<br /> *[[Обработка задач по событию ядра &quot;Поступление платежа&quot;, создание новой задачи и изменение существующей]]<br /> *[[Пример получения информации о задаче]]<br /> *[[Уведомления монтажников о новых активных задачах путем отправки SMS XML запросом]]<br /> <br /> ==== Плагин CashCheck ====<br /> *[[Чек: добавление позиции]]<br /> *[[Чек: завершение формирования]]<br /> *[[Примеры скриптов CashCheck]]<br /> <br /> ==== Плагин Documents ====<br /> *[[Создание копий документа на договорах]]<br /> <br /> ==== Модуль Inet ====<br /> *[[Скрипт активации учетного периода]]<br /> <br /> === Решения для модулей и плагинов ===<br /> <br /> ==== Модуль DialUP ====<br /> *[[Настройка Lucent Ascend MAX6000 в качестве DialUP сервера]]<br /> *[[Настройка Dial-IN сервера FreeBSD PPPD]]<br /> *[[Настройка VPN сервера LINUX PPPD + POPTOP]]<br /> *[[Настройка шейпера в LINUX PPPD]]<br /> *[[Настройка VPN сервера FreeBSD MPD]]<br /> *[[Настройка PPPoE сервера на Cisco-роутере]]<br /> *[[Настройка PPPoE и/или РРТР (VPN) на Mikrotik]]<br /> *[[Проблема с прохождением update пакетов и сброса сессий в Debian и Ubuntu дистрибутивах]]<br /> *[[Настройка Dial-IN Windows RRAS сервера]]<br /> *[[VPN доступ с повременной тарификацией на базе FreeBSD MPD]]<br /> *[[Организация семейства UNLIMIT тарифов на базе FreeBSD MPD]]<br /> *[[Примеры тарифных планов VPN/DialUp]]<br /> *[[Отключение сессий по PoD на CISCO]]<br /> *[[Пример скрипта управления уровнями BGRadiusDialup]]<br /> *[[Настройка cisco с поддеркой ISG]]<br /> *[[Настройка BGBilling c поддеркой ISG]]<br /> *[[Настройка BGBilling с RedBack SmartEdge (PPPOE)]]<br /> <br /> ==== Модуль E-Mail ====<br /> *[[Почтовая система Exim + Cyrus + OpenLDAP на FreeBSD]]<br /> *[[Postfix/MySQL/BGBilling]]<br /> *[[Postfix+dovecot+ldap]]<br /> *[[Postfix+Mysql+Virtual domains]]<br /> <br /> ==== Модуль Inet ====<br /> *[[Inet FAQ]]<br /> *[[Схемы подключения]]<br /> *[[Расширения]]<br /> *[[Конвертеры из IPN в INET]]<br /> *[[Конвертер: логины Dialup в сервисы inet]]<br /> <br /> ==== Модуль IPN ====<br /> *[[IP/VPN]]<br /> *[[Примеры тарифных планов IPN]]<br /> *[[Настройка BGIPNNetflowCollector]]<br /> *[[Методика определения причины отсутствия трафика в отчете договора]]<br /> *[[Связка с flow-tools]]<br /> *[[Экспорт Netflow-данных в формат Nfdump]]<br /> *[[Реалиазация шлюза на Cisco]]<br /> *[[Реализация шлюзов на BeanShell,примеры стандартных и других шлюзов]] (Manad, Cisco, Zyxel, Mikrotik)<br /> *[[Изменения в manad для работы с одним pipe на множество IP адресов]]<br /> *[[FreeBSD manad, понимающий изменения правил в тарифах]]<br /> *[[Табличный FreeBSD manad, понимающий изменения правил в тарифах]]<br /> *[[Пример реализации скриптового универсального шлюза]]<br /> *[[Конвертер привязок услуг dialup в привязки ipn]]<br /> *[[Реализация скрипта Manad]]<br /> *[[Настройка шлюза Mikrotik]]<br /> *[[Обновление номеров интерфейсов при замене роутера]]<br /> <br /> ==== Модуль Phone ====<br /> * [[Конвертация и загрузка тарифов Телефонии в биллинг]]<br /> * [[Примеры тарифных планов Телефонии]]<br /> * [[Примеры реализации конверторов логов]]<br /> * [[Генератор отчётности для Совинтел]]<br /> <br /> ==== Модуль Reports ====<br /> *[[Редактирование отчетов в iReport]]<br /> *[[Примеры отчётов]]<br /> *[[Использование отчётов для организации универсального поиска]]<br /> *[[Табличные отчёты с динамическими столбцами]]<br /> *[[Табличные отчёты в динамическом коде]]<br /> *[[Сохранение JasperReports-отчёта на сервере в pdf]]<br /> <br /> ==== Модуль TV ====<br /> *[[Активация/добавление модуля на договор через дополнительное действие]]<br /> <br /> ==== Модуль VoiceIP ====<br /> *[[Интеграция Asterisk и BGBilling (Accounting) посредством скрипта предобработки запросов Radius]]<br /> *[[Интеграция Asterisk и BGBilling (Accounting) посредством изменения программного кода Asterisk]]<br /> *[[Интеграция c MVTS]]<br /> *[[Интеграция c Cisco Call Manager Express (CME)]]<br /> *[[Карточная IVR система на базе Cisco]]<br /> *[[Примеры IVR скриптов для Cisco]]<br /> *[[Пример настройки Cisco AS5350]]<br /> *[[Продажа пакетов минут на направления]]<br /> <br /> ==== Плагин Dispatch ====<br /> *[[Импорт старой схемы рассылок баланса в Dispatch]]<br /> <br /> === SQL-запросы ===<br /> *[[Схема связки таблиц тарифов]]<br /> *[[Разные SQL-запросы]]<br /> *[[SQL-запрос: кто сколько платит на каждом тарифе]]<br /> *[[Получение цен тарифов]]<br /> *[[Работа с группами, битовые маски]]<br /> *[[наработка по абонентке и услугам за месяц]]<br /> <br /> ==== CerberCrypt ====<br /> *[[Модуль CerberCrypt: Разные SQL-запросы]]<br /> *[[Модуль CerberCrypt: Поиск битых SQL-связей]]<br /> <br /> === Веб-Интерфейс ===<br /> *[[Свой action в личном кабинете]]<br /> **[[WebAction_CustomSuspend]] - управление статусом договора (v5.0)<br /> *[[Изменение параметров договора из личного кабинета]]<br /> *[[Как убрать ненужные действия в web]]<br /> <br /> === Протоколы ===<br /> *[[Протокол дилерский платежей]]<br /> *[[Протоколы, поддержанные в модуле MPS]]<br /> *[[Протоколы, поддержанные в модуле Phone]]<br /> *[[Медиа: Enaza.zip]]<br /> *[[Медиа: Payonline.zip]]<br /> <br /> === FAQ ===<br /> * [[Не запускается служба BSBillingServer под Windows]]<br /> * [[Вопросы вместо русских букв]]<br /> * [[Что происходит с пользователями при рестарте сервера биллинга и BGRadiusDialup]]<br /> * [[Тарификация максимального трафика]]<br /> * [[Field ... doesn't have a default value ]]<br /> * [[Character set ‘cp1251' is not a compiled character set and is not specified in the ‘C:\mysql\\share\charsets\Index.xml’ file ]]<br /> * [[com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown database 'bgbilling' ]]<br /> * [[Договор не отображается в поиске]]<br /> * [[PPPD проблема с сессиями больше 4ГБ]]<br /> * [[Меню личного кабинета]]<br /> * [[Java.lang.NoClassDefFoundError:_javax/xml/bind/DataBindingException|FreeBSD: Java.lang.NoClassDefFoundError: javax/xml/bind/DataBindingException]]<br /> * [[Manad: после некоторого количества договоров начинает передавать данные на биллинг неправильно ]]<br /> * [[Ошибка выполнения скиптов: Undefined argument:]]<br /> * [[Ошибка в логе &quot;Too many open files&quot;]]<br /> * [[Ошибка в клиенте &quot;Action NOT FOUND!..&quot;]]<br /> * [[Inet FAQ]]<br /> * [[java.lang.NoSuchMethodError]]<br /> <br /> == BGCRM ==<br /> <br /> === Плагин BGBilling ===<br /> * [[Синхронизация справочников адресов с BGBilling]]<br /> * [[Активация доверительного платежа в привязанном к процессу договоре биллинга]]<br /> <br /> === Плагин Document ===<br /> * [[Примеры шаблонов для генерации документов]]<br /> <br /> === Плагин Report ===<br /> * [[Примеры отчётов BGCRM]]<br /> <br /> === Комплексные решения ===<br /> *[[Организация отключения должников КТВ]]<br /> *[[Интеграция с Asterisk для обработки входящих звонков]]<br /> <br /> === Примеры динамического кода ===<br /> *[[Проверка уникальности контрагента по ИНН]]<br /> *[[Проверка уникальности контрагента по паспортным данным]]<br /> *[[Переключение статуса процессов по наступлению момента времени]]<br /> *[[Повышение приоритета процессов]]<br /> *[[Проверка правки параметра процесса]]<br /> *[[Изменение описания процесса по правке параметра]]<br /> *[[Обработка событий процесса согласования]]<br /> *[[Генерация новостей исполнителям при изменении процессов]]<br /> *[[Уведомление на email]]<br /> <br /> == DBInfo ==<br /> * [[Описание программы]]<br /> * [[Установка и настройка программы]]<br /> * [[Исходный код программы]]<br /> <br /> == Разработка ПО ==<br /> В данном разделе собираются рекомендации по разработке ПО. Это накопленная годами и пополняемая база знания призвана упростить обучение в первую очередь разработчиков, работающих с применяемыми в BiTel технологиями: Java, Web (JS, HTML), СУБД MySQL, LINUX, GIT. И разрабатывающих схожие приложения: тиражируемые продукты для автоматизации процессов организаций. Всё предельно конкретно, поэтому большая часть примеров будет приведена на Java.<br /> Однако значительная часть описываемых проблем и принципов довольно фундоментальна и может быть полезна разработчиками в иных областях.<br /> <br /> === В общем ===<br /> * [[Разработка]]<br /> * [[Оптимизация]]<br /> * [[Логирование]]<br /> * [[Сборка и публикация проекта]]<br /> <br /> === Java разработка ===<br /> * [[Работа с git в Eclipse(EGit)]]<br /> * [[Выявление неисправностей приложений]]<br /> * [[Обращение к Web-сервису]]<br /> * [[Работа с SQL в Java]]<br /> * [[Встроенный Application сервер в приложении]]<br /> * [[Потоки в Java]]<br /> * [[Обработка ошибок]]<br /> <br /> ==== Полезные Java библиотеки ====<br /> {| border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;<br /> |- valign=top align=&quot;center&quot; bgcolor=&quot;#eeeeee&quot; <br /> | Наименование || Область применения<br /> |-<br /> | [[Jimi - обработка изображений | JIMI]] || Обработка изображений<br /> |}<br /> <br /> === Технологии, используемые в проектах ===<br /> * [[XML]]<br /> * [[XSLT]]<br /> * [[FO(P)]]<br /> * [[REGEXP]]<br /> * [[MySQL REGEXP]]<br /> <br /> === Вспомогательные технологии ===<br /> * [[Сборщик Apache ANT]]<br /> * [[Сбор и анализ сетевого трафика]]<br /> * [[SSH]]<br /> * [[Оптимизация запросов в MySQL]]<br /> <br /> === Требования BiTel к оформлению ===<br /> * [[Java кода]]<br /> * [[MySQL кода]]</div> DimOn http://wiki.bitel.ru/index.php/%D0%A1%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_JasperReports-%D0%BE%D1%82%D1%87%D1%91%D1%82%D0%B0_%D0%BD%D0%B0_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5_%D0%B2_pdf Сохранение JasperReports-отчёта на сервере в pdf 2014-09-15T07:22:25Z <p>DimOn:&#32;</p> <hr /> <div>Пример динамического action, перегружающего стандартный ActionReport. Показывает как можно отрендерить в pdf результат выполнения JasperReports-отчёта. При выполнении отчёта (в данном примере - определённого) сохраняет результат отчёта в pdf файл на сервере. Дальше этот файл может передаваться в какую-то систему и т.п.<br /> <br /> &lt;source lang=&quot;java&quot;&gt;package ru.kristall.bgbilling.action;<br /> <br /> import java.io.File;<br /> import java.io.FileInputStream;<br /> import java.io.IOException;<br /> import java.io.OutputStream;<br /> import java.io.PrintStream;<br /> import java.sql.SQLException;<br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.common.Utils;<br /> import ru.bitel.common.XMLUtils;<br /> import ru.bitel.bgbilling.kernel.event.Event;<br /> import ru.bitel.bgbilling.server.util.Setup;<br /> import ru.bitel.common.sql.ConnectionSet;<br /> import bitel.billing.server.reports.BGCSVReport;<br /> import bitel.billing.server.reports.BGReport;<br /> import bitel.billing.server.ActionConType;<br /> <br /> import java.io.File;<br /> import java.io.FileWriter;<br /> import java.io.PrintWriter;<br /> import java.io.StringWriter;<br /> import java.util.Date;<br /> import java.io.FileOutputStream;<br /> import java.io.ByteArrayOutputStream;<br /> import java.io.ByteArrayInputStream;<br /> <br /> import net.sf.jasperreports.engine.JasperPrint;<br /> import net.sf.jasperreports.engine.JasperReport;<br /> import net.sf.jasperreports.engine.JasperFillManager;<br /> import net.sf.jasperreports.engine.JasperExportManager;<br /> import net.sf.jasperreports.engine.util.JRLoader;<br /> <br /> public class ActionReport<br /> extends bitel.billing.server.reports.action.ActionReport {<br /> <br /> @Override<br /> public void doAction() throws SQLException, BGException, IOException {<br /> super.doAction();<br /> //kernel_erkc_kp<br /> String id = getParameter(&quot;report_id&quot;);<br /> if (id.equalsIgnoreCase(&quot;kernel_erkc_kp&quot;)) {<br /> File o = new File(&quot;/tmp/report.stream.pdf&quot;);<br /> FileOutputStream outFile = new FileOutputStream(o);<br /> BGReport report = null;<br /> try {<br /> log.debug( &quot;Generate report with id=&quot; + id );<br /> report = getReport( id ); // запустили отчет заново<br /> }<br /> catch( Exception ex ) { ex.printStackTrace(); return; }<br /> if( report != null ) {<br /> try {<br /> ByteArrayOutputStream bOut = new ByteArrayOutputStream(); // выделим кусок памяти как выходной поток<br /> report.fillReportToStream(bOut); // получили результат отчета, заполненный xml<br /> ByteArrayInputStream bIn = new ByteArrayInputStream(bOut.toByteArray()); // входной поток из памяти<br /> JasperPrint jasperPrint = (JasperPrint)JRLoader.loadObject(bIn); // заполним джасперовский принтер<br /> // JasperExportManager.exportReportToPdfFile(jasperPrint, &quot;/tmp/report.pdf&quot;);<br /> JasperExportManager.exportReportToPdfStream(jasperPrint, outFile); // выведем форматированный пдф в поток<br /> } catch( Exception ex ) { ex.printStackTrace(); }<br /> }<br /> // уложить полученный байтовый массив в base64<br /> // получить идентификационный тикет<br /> // отправить на http://docum.local/alfresco/api/s/getFile<br /> // начать бизнес процесс в вебскрипте, повешенном на приемнике. <br /> }<br /> }<br /> }&lt;/source&gt;<br /> в конфиге:<br /> &lt;source lang=&quot;text&quot;&gt;dynaction:reports.ActionReport=ru.kristall.bgbilling.action.ActionReport&lt;/source&gt;</div> DimOn http://wiki.bitel.ru/index.php/%D0%A1%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_JasperReports-%D0%BE%D1%82%D1%87%D1%91%D1%82%D0%B0_%D0%BD%D0%B0_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5_%D0%B2_pdf Сохранение JasperReports-отчёта на сервере в pdf 2014-09-15T07:21:21Z <p>DimOn:&#32;Новая страница: «Пример динамического action, перегружающего стандартный ActionReport. Показывает как можно отренд…»</p> <hr /> <div>Пример динамического action, перегружающего стандартный ActionReport. Показывает как можно отрендерить в pdf результат выполнения JasperReports-отчёта. При выполнении отчёта (в данном примере - определённого) сохраняет результат отчёта в pdf файл на сервере. Дальше этот файл может передаваться в какую-то систему и т.п.<br /> <br /> &lt;source lang=&quot;java&quot;&gt;package ru.kristall.bgbilling.action;<br /> <br /> import java.io.File;<br /> import java.io.FileInputStream;<br /> import java.io.IOException;<br /> import java.io.OutputStream;<br /> import java.io.PrintStream;<br /> import java.sql.SQLException;<br /> <br /> import ru.bitel.bgbilling.common.BGException;<br /> import ru.bitel.common.Utils;<br /> import ru.bitel.common.XMLUtils;<br /> import ru.bitel.bgbilling.kernel.event.Event;<br /> import ru.bitel.bgbilling.server.util.Setup;<br /> import ru.bitel.common.sql.ConnectionSet;<br /> import bitel.billing.server.reports.BGCSVReport;<br /> import bitel.billing.server.reports.BGReport;<br /> import bitel.billing.server.ActionConType;<br /> <br /> import java.io.File;<br /> import java.io.FileWriter;<br /> import java.io.PrintWriter;<br /> import java.io.StringWriter;<br /> import java.util.Date;<br /> import java.io.FileOutputStream;<br /> import java.io.ByteArrayOutputStream;<br /> import java.io.ByteArrayInputStream;<br /> <br /> import net.sf.jasperreports.engine.JasperPrint;<br /> import net.sf.jasperreports.engine.JasperReport;<br /> import net.sf.jasperreports.engine.JasperFillManager;<br /> import net.sf.jasperreports.engine.JasperExportManager;<br /> import net.sf.jasperreports.engine.util.JRLoader;<br /> <br /> public class ActionReport<br /> extends bitel.billing.server.reports.action.ActionReport {<br /> <br /> @Override<br /> public void doAction() throws SQLException, BGException, IOException {<br /> super.doAction();<br /> //kernel_erkc_kp<br /> String id = getParameter(&quot;report_id&quot;);<br /> if (id.equalsIgnoreCase(&quot;kernel_erkc_kp&quot;)) {<br /> File o = new File(&quot;/tmp/report.stream.pdf&quot;);<br /> FileOutputStream outFile = new FileOutputStream(o);<br /> BGReport report = null;<br /> try {<br /> log.debug( &quot;Generate report with id=&quot; + id );<br /> report = getReport( id ); // запустили отчет заново<br /> }<br /> catch( Exception ex ) { ex.printStackTrace(); return; }<br /> if( report != null ) {<br /> try {<br /> ByteArrayOutputStream bOut = new ByteArrayOutputStream(); // выделим кусок памяти как выходной поток<br /> report.fillReportToStream(bOut); // получили результат отчета, заполненный xml<br /> ByteArrayInputStream bIn = new ByteArrayInputStream(bOut.toByteArray()); // входной поток из памяти<br /> JasperPrint jasperPrint = (JasperPrint)JRLoader.loadObject(bIn); // заполним джасперовский принтер<br /> // JasperExportManager.exportReportToPdfFile(jasperPrint, &quot;/tmp/report.pdf&quot;);<br /> JasperExportManager.exportReportToPdfStream(jasperPrint, outFile); // выведем форматированный пдф в поток<br /> } catch( Exception ex ) { ex.printStackTrace(); }<br /> }<br /> // уложить полученный байтовый массив в base64<br /> // получить идентификационный тикет<br /> // отправить на http://docum.local/alfresco/api/s/getFile<br /> // начать бизнес процесс в вебскрипте, повешенном на приемнике. <br /> }<br /> }<br /> }&lt;/source&gt;<br /> в конфиге:<br /> &lt;source&gt;dynaction:reports.ActionReport=ru.kristall.bgbilling.action.ActionReport&lt;/source&gt;</div> DimOn http://wiki.bitel.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0 Заглавная страница 2014-09-15T06:12:28Z <p>DimOn:&#32;/* Модуль Reports */</p> <hr /> <div>== О BiTel Wiki ==<br /> Здесь вы можете получить больше информации о продуктах BiTel: BGBilling, BGCRM, а также поделиться своим опытом с другими пользователями. В то время как документация часто предоставляет общие сведения о системе и ее настройках, в WiKi приводятся конкретные примеры.<br /> <br /> * &lt;b&gt;[[Как выложить статью на WiKi]]&lt;/b&gt;<br /> * [[Оформление статей]]<br /> * [http://forum.bitel.ru/ Форум BiTel]<br /> <br /> == Специалисты ==<br /> Уважаемые &quot;продвинутые пользователи&quot;. Здесь вы можете располагать записи со своими контактами для оказания воздмездной или безвозмездной помощи по настройке системы BGBilling пользователям, не столь далеко продвинувшимся. Желательно указывать ваши контактные данные и &quot;специализацию&quot;. Отзывы по исполнителям можно оставить/почитать [http://forum.bitel.ru/viewtopic.php?t=9329 на форуме].<br /> {| border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;<br /> |- valign=top align=&quot;center&quot; bgcolor=&quot;#eeeeee&quot; <br /> | Имя || Специализация || Контакт || Примечания<br /> |-<br /> | Рустам Тазуркаев || Mikrotik, переход с NetUp, CISCO || [[Изображение:Cpec_2_contact.png]] &lt;!-- ICQ: 648986--&gt; ||<br /> |-<br /> | Михаил Чернобаев || Скрипты биллинга, FreeBSD MPD || ICQ: 262986492 || Скриптование в биллинге, возможны крупные проекты.<br /> |- <br /> | Борис Близнюков || Скрипты биллинга, CISCO, Voip, Mera || [[Изображение:Cpec_4_contact.png]] &lt;!--ICQ: 1996944--&gt; || Только бесплатные краткие консультации. Очень хороший специалист по CISCO.<br /> |-<br /> | Андрей Бехтерев || Cisco, UNIX, ISP, Asterisk || ICQ: 7021464 WEB: http://behterev.su/ || Обширный спектр оборудования. Консалтинг.<br /> |-<br /> | Гершевич М.М. || Доработка конфигурации 1С и прочего ПО. || Тел. +79248454888 +7-(4162)-238-777 WEB: http://www.amurimpulse.ru/ mail: mike1008@mail.ru || Консалтинг. Информационная безопасность. Интеграция биллинга. Крупные проекты. Работа под заказ.<br /> |-<br /> | Андрей Зюзенков || Linux, BGBilling || http://bghelp.ru ICQ: 639121822 jabber: zavndw@jabber.ru e-mail: zavndw@gmail.com skype: zavndw || Настройка, запуск, обслуживание BGBilling и истем linux, консультации<br /> |-<br /> | Семён Кошечкин || Java || email/gtalk: [[Файл:Cpec_5_contact.jpg]]|| Скрипты, дополнения, модуль Inet. [[%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:Contributions/Cromeshnic|wiki]]<br /> |-<br /> |-<br /> | Конференция BGBilling || вопросы касаемо системы BGBilling || bgbilling@conference.jabber.ru || Администраторы АСР BGBillig(иногда и разработчики) помогают друг другу в разных вопросах.<br /> |}<br /> <br /> == BGBilling ==<br /> === Установка ===<br /> * [[Установка на gentoo]]<br /> * [[Установка на Sun Solaris]]<br /> * [[Установка на Slackware]]<br /> * [[Установка на FreeBSD]]<br /> * [[Установка на Ubuntu 8 Desktop]]<br /> * [[Установка на Ubuntu 9.10 Desktop]]<br /> <br /> ==== Перенос данных в биллинг ====<br /> *[[Пример конвертера данных из csv-файлов в базу BGBilling]]<br /> *[[Пример конвертера данных из CSV-файлов в базу BGBilling - 2]]<br /> *[[Пример конвертера данных из CSV-файлов в базу BGBilling - 3]]<br /> *[[Конвертер базы Netup]]<br /> *[[Примеры конвертеров данных из других биллинговых систем]]<br /> <br /> === Администрирование ===<br /> * [[Разграничение прав действий]]<br /> * [[Настройка безопасности сервера биллинга и компонентов биллинга]]<br /> * [[Принудительный останов процессов биллинга]]<br /> * [[Использование подписанного SSL сертификата]]<br /> * [[Запуск scheduler и data_loader с другими портами управления]]<br /> * [[bg-snmp-management|Мониторинг java-процессов по snmp]]<br /> * [[Скрипты автостарта демонов bgbilling для Debian]]<br /> * [[javaws|Запуск BGBillingClient через Java Web Start]]<br /> * [[Мониторинг Inet-Radius через JMX]]<br /> <br /> === Настройка вспомогательного ПО ===<br /> *[[Проксирование обращений к BGBillingServer посредством nginx]]<br /> <br /> ==== MySQL ====<br /> *[[Рекомендации по настройке MySQL]]<br /> *[[database backup|Backup MySQL базы с помощью snapshot'ов (Linux, LVM)]]<br /> *[[Настройка MySQL репликации]]<br /> *[[Установка триггера в MySQL для отслеживания изменений]]<br /> *[[Скрипт восстановления MySQL репликации]]<br /> *[[Simple DB backup]]<br /> <br /> ==== NetFlow ====<br /> *[[Настройка NetFlow-агента IPCAD]]<br /> *[[Разделение NetFlow-потоков]]<br /> <br /> === Технологии ===<br /> *[[BGBilling_XSLT|XSLT]]<br /> <br /> === Разработка ===<br /> *[[Отладка action'ов в IntelliJ IDEA]]<br /> *[[Разработка динамического кода в IDE Eclipse]]<br /> <br /> === [[XSLT]] шаблоны ===<br /> *[[Добавление параметров договора на страницу личного кабинета]]<br /> &lt;!-- *[[Красивые графики статистики в модуле IPN]] --&gt;<br /> *[[Карточки договора]]<br /> *[[Создание XSLT/FO шаблона со штрихкодами]]<br /> *[[Подстановка данных в зависимости от текущего пользователя биллинга]]<br /> *[[Генерация прайса модуля IP телефонии в карточке договора]]<br /> <br /> ==== Счета ====<br /> *[[Печать счета-фактуры и акта на отдельных листах]]<br /> *[[Расширенные счета модуля бухгалтерии]]<br /> *[[Квитанция телефонии физ. лицам]]<br /> *[[Шаблоны вывода названия месяца]]<br /> *[[Изменения в шаблоне в зависимости от месяца документа]]<br /> *[[Добавление новых шрифтов в FO шаблоны]]<br /> <br /> === Интеграция с внешними системами ===<br /> * [[Прямая интеграция с платежными терминалами ЭСФОР / SFOUR]]<br /> * [[Интеграция с платежной системой с использованием модуля Card]]<br /> * [[Интеграция с платежной системой Robokassa]]<br /> * [[SMS рассылка через SMPP]]<br /> * [[SMS рассылка через SMPP по средствам дин кода в 5.2]]<br /> * [[Система учета &quot;Заявки и Наряды&quot; на java]]<br /> * [[Bash скрипт-отсылка смс через телефон при отсутствие ping на заданный узел]]<br /> * [[Запросы в личный кабинет пользователя сторонними системами]]<br /> * [[Запросы к серверу биллинга сторонними системами]]<br /> <br /> ==== 1С ====<br /> * [[BGBilling-1C]]<br /> * [[amurimpulse.ru bgbilling]]<br /> * [[Integrator 1C-BGBilling]]<br /> * [[Пример обращения к биллингу из 1С v.7.7]]<br /> * [[Пример интеграции с 1С v.7.7]]<br /> * [[Пример интеграции с 1С v.8.1]]<br /> * [[Установка unload_status счета через HTTP-запрос]]<br /> <br /> === Динамический код (скрипты BGBS для старых версий) ===<br /> *[[Логгирование в скриптах поведения]]<br /> <br /> ==== Динамический код ====<br /> *[[Конвертирование адреса]]<br /> *[[Глобальная синхронзация услуг модуля npay с тарифным планом]]<br /> *[[Новый номер договора группе договоров]]<br /> <br /> ==== Комплексные решения ====<br /> *[[Предоставление тестового периода пользования услугой]]<br /> *[[Организация системы отслеживания и отключения КТВ должников на BGBS с использованием CRM плагина]]<br /> *[[Автоматизация подключений VPN-клиентов с использованием CRM плагина]]<br /> *[[Пример автоматизации подключения новых клиентов]]<br /> <br /> ==== Глобальные скрипты ====<br /> *[[Скрипт глобальный отмены перехода на тарифы при неоплате]]<br /> *[[Скрипт предоставление скидки пенсионерам]]<br /> *[[Скрипт создания субдоговоров по шаблону]]<br /> *[[Глобальное событие запуска сервера]]<br /> *[[Перемещение в группу через 3 месяца если не было движения денег в наработке]]<br /> *[[Поиск и изменение статусов у договоров]]<br /> *[[Получение списка доступных действий в SQL]]<br /> *[[Глобальный скрипт для удаления старых таблиц]]<br /> <br /> ==== Пользовательские библиотеки скриптов ====<br /> *[[Пересчеты и бонусы]]<br /> *[[Архивирование логов netflow и radius accaunting]]<br /> <br /> ==== Ядро ====<br /> *[[Смена тарифного плана по заданию пользователя]]<br /> *[[Валидация текстового параметра]]<br /> *[[Проверка ИНН/КПП при вводе]]<br /> *[[Проверка параметра договора перед изменением]]<br /> *[[Обработка смены параметра договора]]<br /> *[[Создание списка дополнительных действий для договора]]<br /> *[[Обработка события создания договора]]<br /> *[[Обработка события &quot;добавление услуги RSCM в договор&quot; . Скипт сменяет тариф, подключает абонплату ]]<br /> *[[Приостановление договора клиентом через WEB]]<br /> *[[Скрипт проверки баланса и отключения договора]]<br /> *[[Изменение стандартной логики перетирания статусов]]<br /> *[[Пример продажи OEM ключей с помощью скрипта]]<br /> *[[Пример копирования тарифного плана]]<br /> *[[Получение текущего пользователя биллинга]]<br /> *[[Запуск скрипта до и после акшена]]<br /> *[[Примеры скриптов до и после акшена]]<br /> *[[Примеры динамического кода акшена и веб-сервисов]]<br /> *[[Начисление бонусов на счет при платежах определенного типа]]<br /> *[[Включение должников по приходу платежа]]<br /> *[[Снижение лимита при внесении расхода]]<br /> *[[Синхронизация услуг договора в соответствии с тарифными планами]]<br /> *[[Добавление группы и снятие в зависимости от статуса]]<br /> *[[Управление статусом договора по состоянию баланса]]<br /> *[[Запрет на вход в личный кабинет с закрытых договоров]]<br /> *[[Переход на понижающий тариф только со следующего месяца]]<br /> *[[Пример создания своего интерфейса в клиенте]]<br /> *[[Метки услуг]]<br /> *[[Сравнение прав пользователей]]<br /> *[[Свой список шаблонов договоров]]<br /> <br /> ==== Модуль Bill ====<br /> *[[Создание счета в модуле Bill]]<br /> *[[Создание счета из суммы платежей по классу договоров]]<br /> *[[Создание счета по таблице позиций]]<br /> *[[Создание счета и счет-фактур в модуле Bill(выполнение тех же действий что и руками)]]<br /> *[[Создание счетов на предоплату]]<br /> *[[Распечатка счетов в pdf по событию генерации счета]]<br /> *[[Внешняя программа на JAVA для синхронизации номеров счетов и актов выполненных работ (версия BGBilling 5.0)]]<br /> *[[Автоматическая отправка счетов через глобальный скрипт поведения]]<br /> <br /> ==== Модуль DialUp ====<br /> *[[Запуск переначисления в модуле DialUp]]<br /> *[[Передача ACCEPT вместо REJECT вместе с доп. аттрибутами]]<br /> *[[Обработка запроса учетного периода]]<br /> *[[Переинициализация тарифа в пределах сессии | Обработка запроса учетного периода (переинициализация тарифа в пределах сессии) ]]<br /> *[[Ограничение доступа для различных групп пользователей для BGRadiusDialup]]<br /> *[[Детальное информирование абонентов о причинах ошибки 691]]<br /> *[[Аутентификация с учетом Calling-Id-Station]]<br /> *[[Доп. действие сброса активных соединений]]<br /> *[[Открытие абонплаты по первой установке соединения]]<br /> *[[Пересчет трафика по данным Radius (при потерянных Netflow-логах)]]<br /> *[[Отключение Fake сессий при приходе платежа]]<br /> *[[Ограничение доступа на основе объектов]]<br /> <br /> ==== Модуль DialUp / Cкрипты предобработки RADIUS запросов ====<br /> * [[Уcтановка услуги типа &quot;Время&quot; для BGRadiusDialup]]<br /> * [[Установка фиксированного пароля]]<br /> * [[Нормализация параметра Acct-Session-Id у маршрутизатора Cisco]]<br /> * [[Разделение атрибута User-Name на логин и пароль]]<br /> * [[Вынос MAC адреса из cisco-avp-pair в Calling-Station-Id]]<br /> * [[Копирование Тunnel-Client-Endpoint/Tunnel-Server-Endpoint в Calling-Station-Id/Called-Station-Id]]<br /> * [[Замена radius-атрибутов при авторизации]]<br /> <br /> ==== Модуль Inet / Cкрипты предобработки RADIUS запросов ====<br /> * [[Вынос MAC адреса из cisco-avp-pair в Calling-Station-Id для модуля Inet]]<br /> <br /> ==== Модуль СerberСrypt ====<br /> *[[Изменение подписки карты через web (cerbercrypt)]]<br /> *[[Управление подписками через веб (cerbercrypt)]]<br /> <br /> ==== Модуль NPay ====<br /> *[[Определение размера абонентской платы]]<br /> *[[Запуск переначисления в модуле NPay]]<br /> *[[Дебетовые абонплаты. Снятие штрафа за разблокировку.]]<br /> *[[Снятие абонентской платы в дебитовых договорах]]<br /> *[[Предварительное уведомление о блокировке по дебетовым абонплатам]]<br /> <br /> ==== Модуль Phone ====<br /> *[[При создании поинта модуля Phone добавление в него абонплат]]<br /> *[[Закрытие_телефонных_договоров]]<br /> <br /> ==== Модуль RSCM ====<br /> *[[Запуск переначисления в модуле RSCM]]<br /> *[[Перенос суммы расхода в наработку RSCM модуля]]<br /> <br /> ==== Модуль VoiceIp ====<br /> *[[Определение стоимости звонка VoiceIp]]<br /> <br /> ==== Модуль VoiceIp / Cкрипты предобработки RADIUS запросов ====<br /> * [[Идентификация Voip оператора по подсети (транзит)]]<br /> * [[Установка параметров звонка Voip]]<br /> * [[Установка фиксированного пароля]]<br /> * [[Разделение атрибута User-Name на логин и пароль]]<br /> * [[Замена radius-атрибутов при авторизации]]<br /> <br /> ==== Плагин CRM ====<br /> *[[Обработка выполненных задач в журнале задач]]<br /> *[[Обработка задач по событию ядра &quot;Поступление платежа&quot;, создание новой задачи и изменение существующей]]<br /> *[[Пример получения информации о задаче]]<br /> *[[Уведомления монтажников о новых активных задачах путем отправки SMS XML запросом]]<br /> <br /> ==== Плагин CashCheck ====<br /> *[[Чек: добавление позиции]]<br /> *[[Чек: завершение формирования]]<br /> *[[Примеры скриптов CashCheck]]<br /> <br /> ==== Плагин Documents ====<br /> *[[Создание копий документа на договорах]]<br /> <br /> === Решения для модулей и плагинов ===<br /> <br /> ==== Модуль DialUP ====<br /> *[[Настройка Lucent Ascend MAX6000 в качестве DialUP сервера]]<br /> *[[Настройка Dial-IN сервера FreeBSD PPPD]]<br /> *[[Настройка VPN сервера LINUX PPPD + POPTOP]]<br /> *[[Настройка шейпера в LINUX PPPD]]<br /> *[[Настройка VPN сервера FreeBSD MPD]]<br /> *[[Настройка PPPoE сервера на Cisco-роутере]]<br /> *[[Настройка PPPoE и/или РРТР (VPN) на Mikrotik]]<br /> *[[Проблема с прохождением update пакетов и сброса сессий в Debian и Ubuntu дистрибутивах]]<br /> *[[Настройка Dial-IN Windows RRAS сервера]]<br /> *[[VPN доступ с повременной тарификацией на базе FreeBSD MPD]]<br /> *[[Организация семейства UNLIMIT тарифов на базе FreeBSD MPD]]<br /> *[[Примеры тарифных планов VPN/DialUp]]<br /> *[[Отключение сессий по PoD на CISCO]]<br /> *[[Пример скрипта управления уровнями BGRadiusDialup]]<br /> *[[Настройка cisco с поддеркой ISG]]<br /> *[[Настройка BGBilling c поддеркой ISG]]<br /> *[[Настройка BGBilling с RedBack SmartEdge (PPPOE)]]<br /> <br /> ==== Модуль E-Mail ====<br /> *[[Почтовая система Exim + Cyrus + OpenLDAP на FreeBSD]]<br /> *[[Postfix/MySQL/BGBilling]]<br /> *[[Postfix+dovecot+ldap]]<br /> *[[Postfix+Mysql+Virtual domains]]<br /> <br /> ==== Модуль Inet ====<br /> *[[Inet FAQ]]<br /> *[[Схемы подключения]]<br /> *[[Расширения]]<br /> *[[Конвертеры из IPN в INET]]<br /> *[[Конвертер: логины Dialup в сервисы inet]]<br /> <br /> ==== Модуль IPN ====<br /> *[[IP/VPN]]<br /> *[[Примеры тарифных планов IPN]]<br /> *[[Настройка BGIPNNetflowCollector]]<br /> *[[Методика определения причины отсутствия трафика в отчете договора]]<br /> *[[Связка с flow-tools]]<br /> *[[Экспорт Netflow-данных в формат Nfdump]]<br /> *[[Реалиазация шлюза на Cisco]]<br /> *[[Реализация шлюзов на BeanShell,примеры стандартных и других шлюзов]] (Manad, Cisco, Zyxel, Mikrotik)<br /> *[[Изменения в manad для работы с одним pipe на множество IP адресов]]<br /> *[[FreeBSD manad, понимающий изменения правил в тарифах]]<br /> *[[Табличный FreeBSD manad, понимающий изменения правил в тарифах]]<br /> *[[Пример реализации скриптового универсального шлюза]]<br /> *[[Конвертер привязок услуг dialup в привязки ipn]]<br /> *[[Реализация скрипта Manad]]<br /> *[[Настройка шлюза Mikrotik]]<br /> *[[Обновление номеров интерфейсов при замене роутера]]<br /> <br /> ==== Модуль Phone ====<br /> * [[Конвертация и загрузка тарифов Телефонии в биллинг]]<br /> * [[Примеры тарифных планов Телефонии]]<br /> * [[Примеры реализации конверторов логов]]<br /> * [[Генератор отчётности для Совинтел]]<br /> <br /> ==== Модуль VoiceIP ====<br /> *[[Интеграция Asterisk и BGBilling (Accounting) посредством скрипта предобработки запросов Radius]]<br /> *[[Интеграция Asterisk и BGBilling (Accounting) посредством изменения программного кода Asterisk]]<br /> *[[Интеграция c MVTS]]<br /> *[[Интеграция c Cisco Call Manager Express (CME)]]<br /> *[[Карточная IVR система на базе Cisco]]<br /> *[[Примеры IVR скриптов для Cisco]]<br /> *[[Пример настройки Cisco AS5350]]<br /> *[[Продажа пакетов минут на направления]]<br /> <br /> ==== Модуль Reports ====<br /> *[[Редактирование отчетов в iReport]]<br /> *[[Примеры отчётов]]<br /> *[[Использование отчётов для организации универсального поиска]]<br /> *[[Табличные отчёты с динамическими столбцами]]<br /> *[[Табличные отчёты в динамическом коде]]<br /> *[[Сохранение JasperReports-отчёта на сервере в pdf]]<br /> <br /> ==== Плагин Dispatch ====<br /> *[[Импорт старой схемы рассылок баланса в Dispatch]]<br /> <br /> === SQL-запросы ===<br /> *[[Схема связки таблиц тарифов]]<br /> *[[Разные SQL-запросы]]<br /> *[[SQL-запрос: кто сколько платит на каждом тарифе]]<br /> *[[Получение цен тарифов]]<br /> *[[Работа с группами, битовые маски]]<br /> *[[наработка по абонентке и услугам за месяц]]<br /> <br /> ==== CerberCrypt ====<br /> *[[Модуль CerberCrypt: Разные SQL-запросы]]<br /> *[[Модуль CerberCrypt: Поиск битых SQL-связей]]<br /> <br /> === Веб-Интерфейс ===<br /> *[[Свой action в личном кабинете]]<br /> **[[WebAction_CustomSuspend]] - управление статусом договора (v5.0)<br /> *[[Изменение параметров договора из личного кабинета]]<br /> *[[Как убрать ненужные действия в web]]<br /> <br /> === Протоколы ===<br /> *[[Протокол дилерский платежей]]<br /> *[[Протоколы, поддержанные в модуле MPS]]<br /> *[[Протоколы, поддержанные в модуле Phone]]<br /> *[[Медиа: Enaza.zip]]<br /> *[[Медиа: Payonline.zip]]<br /> <br /> === FAQ ===<br /> * [[Не запускается служба BSBillingServer под Windows]]<br /> * [[Вопросы вместо русских букв]]<br /> * [[Что происходит с пользователями при рестарте сервера биллинга и BGRadiusDialup]]<br /> * [[Тарификация максимального трафика]]<br /> * [[Field ... doesn't have a default value ]]<br /> * [[Character set ‘cp1251' is not a compiled character set and is not specified in the ‘C:\mysql\\share\charsets\Index.xml’ file ]]<br /> * [[com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown database 'bgbilling' ]]<br /> * [[Договор не отображается в поиске]]<br /> * [[PPPD проблема с сессиями больше 4ГБ]]<br /> * [[Меню личного кабинета]]<br /> * [[Java.lang.NoClassDefFoundError:_javax/xml/bind/DataBindingException|FreeBSD: Java.lang.NoClassDefFoundError: javax/xml/bind/DataBindingException]]<br /> * [[Manad: после некоторого количества договоров начинает передавать данные на биллинг неправильно ]]<br /> * [[Ошибка выполнения скиптов: Undefined argument:]]<br /> * [[Ошибка в логе &quot;Too many open files&quot;]]<br /> * [[Ошибка в клиенте &quot;Action NOT FOUND!..&quot;]]<br /> * [[Inet FAQ]]<br /> * [[java.lang.NoSuchMethodError]]<br /> <br /> == BGCRM ==<br /> <br /> === Плагин BGBilling ===<br /> * [[Синхронизация справочников адресов с BGBilling]]<br /> * [[Активация доверительного платежа в привязанном к процессу договоре биллинга]]<br /> <br /> === Плагин Document ===<br /> * [[Примеры шаблонов для генерации документов]]<br /> <br /> === Плагин Report ===<br /> * [[Примеры отчётов BGCRM]]<br /> <br /> === Комплексные решения ===<br /> *[[Организация отключения должников КТВ]]<br /> *[[Интеграция с Asterisk для обработки входящих звонков]]<br /> <br /> === Примеры динамического кода ===<br /> *[[Проверка уникальности контрагента по ИНН]]<br /> *[[Проверка уникальности контрагента по паспортным данным]]<br /> *[[Переключение статуса процессов по наступлению момента времени]]<br /> *[[Повышение приоритета процессов]]<br /> *[[Проверка правки параметра процесса]]<br /> *[[Изменение описания процесса по правке параметра]]<br /> *[[Обработка событий процесса согласования]]<br /> *[[Генерация новостей исполнителям при изменении процессов]]<br /> <br /> == DBInfo ==<br /> * [[Описание программы]]<br /> * [[Установка и настройка программы]]<br /> * [[Исходный код программы]]<br /> <br /> == Разработка ПО ==<br /> В данном разделе собираются рекомендации по разработке ПО. Это накопленная годами и пополняемая база знания призвана упростить обучение в первую очередь разработчиков, работающих с применяемыми в BiTel технологиями: Java, Web (JS, HTML), СУБД MySQL, LINUX, GIT. И разрабатывающих схожие приложения: тиражируемые продукты для автоматизации процессов организаций. Всё предельно конкретно, поэтому большая часть примеров будет приведена на Java.<br /> Однако значительная часть описываемых проблем и принципов довольно фундоментальна и может быть полезна разработчиками в иных областях.<br /> <br /> === В общем ===<br /> * [[Разработка]]<br /> * [[Оптимизация]]<br /> * [[Логирование]]<br /> * [[Сборка и публикация проекта]]<br /> <br /> === Java разработка ===<br /> * [[Работа с git в Eclipse(EGit)]]<br /> * [[Выявление неисправностей приложений]]<br /> * [[Обращение к Web-сервису]]<br /> * [[Работа с SQL в Java]]<br /> * [[Встроенный Application сервер в приложении]]<br /> * [[Потоки в Java]]<br /> * [[Обработка ошибок]]<br /> <br /> ==== Полезные Java библиотеки ====<br /> {| border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;<br /> |- valign=top align=&quot;center&quot; bgcolor=&quot;#eeeeee&quot; <br /> | Наименование || Область применения<br /> |-<br /> | [[Jimi - обработка изображений | JIMI]] || Обработка изображений<br /> |}<br /> <br /> === Технологии, используемые в проектах ===<br /> * [[XML]]<br /> * [[XSLT]]<br /> * [[FO(P)]]<br /> * [[REGEXP]]<br /> * [[MySQL REGEXP]]<br /> <br /> === Вспомогательные технологии ===<br /> * [[Сборщик Apache ANT]]<br /> * [[Сбор и анализ сетевого трафика]]<br /> * [[SSH]]<br /> * [[Оптимизация запросов в MySQL]]<br /> <br /> === Требования BiTel к оформлению ===<br /> * [[Java кода]]<br /> * [[MySQL кода]]</div> DimOn http://wiki.bitel.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0 Заглавная страница 2014-06-05T10:19:02Z <p>DimOn:&#32;/* Специалисты */</p> <hr /> <div>== О BiTel Wiki ==<br /> Здесь вы можете получить больше информации о продуктах BiTel: BGBilling, BGCRM, а также поделиться своим опытом с другими пользователями. В то время как документация часто предоставляет общие сведения о системе и ее настройках, в WiKi приводятся конкретные примеры.<br /> <br /> * &lt;b&gt;[[Как выложить статью на WiKi]]&lt;/b&gt;<br /> * [[Оформление статей]]<br /> * [http://forum.bitel.ru/ Форум BiTel]<br /> <br /> == Специалисты ==<br /> Уважаемые &quot;продвинутые пользователи&quot;. Здесь вы можете располагать записи со своими контактами для оказания воздмездной или безвозмездной помощи по настройке системы BGBilling пользователям, не столь далеко продвинувшимся. Желательно указывать ваши контактные данные и &quot;специализацию&quot;. Отзывы по исполнителям можно оставить/почитать [http://forum.bitel.ru/viewtopic.php?t=9329 на форуме].<br /> {| border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;<br /> |- valign=top align=&quot;center&quot; bgcolor=&quot;#eeeeee&quot; <br /> | Имя || Специализация || Контакт || Примечания<br /> |-<br /> | Рустам Тазуркаев || Mikrotik, переход с NetUp, CISCO || [[Изображение:Cpec_2_contact.png]] &lt;!-- ICQ: 648986--&gt; ||<br /> |-<br /> | Михаил Чернобаев || Скрипты биллинга, FreeBSD MPD || ICQ: 262986492 || Скриптование в биллинге, возможны крупные проекты.<br /> |- <br /> | Борис Близнюков || Скрипты биллинга, CISCO, Voip, Mera || [[Изображение:Cpec_4_contact.png]] &lt;!--ICQ: 1996944--&gt; || Только бесплатные краткие консультации. Очень хороший специалист по CISCO.<br /> |-<br /> | Андрей Бехтерев || Cisco, UNIX, ISP, Asterisk || ICQ: 7021464 WEB: http://behterev.su/ || Обширный спектр оборудования. Консалтинг.<br /> |-<br /> | Гершевич М.М. || Доработка конфигурации 1С и прочего ПО. || Тел. +79248454888 +7-(4162)-238-777 WEB: http://www.amurimpulse.ru/ mail: mike1008@mail.ru || Консалтинг. Информационная безопасность. Интеграция биллинга. Крупные проекты. Работа под заказ.<br /> |-<br /> | Андрей Зюзенков || Linux, GEPON, Zabbix || ICQ: 639121822 jabber: zavndw@jabber.ru e-mail: zavndw@gmail.com skype: zavndw || Настройка, запуск, обслуживание BGBilling в системах linux, консультации<br /> |-<br /> |-<br /> | Конференция BGBilling || вопросы касаемо системы BGBilling || bgbilling@conference.jabber.ru || Администраторы АСР BGBillig(иногда и разработчики) помогают друг другу в разных вопросах.<br /> |}<br /> <br /> == BGBilling ==<br /> === Установка ===<br /> * [[Установка на gentoo]]<br /> * [[Установка на Sun Solaris]]<br /> * [[Установка на Slackware]]<br /> * [[Установка на FreeBSD]]<br /> * [[Установка на Ubuntu 8 Desktop]]<br /> * [[Установка на Ubuntu 9.10 Desktop]]<br /> <br /> ==== Перенос данных в биллинг ====<br /> *[[Пример конвертера данных из csv-файлов в базу BGBilling]]<br /> *[[Пример конвертера данных из CSV-файлов в базу BGBilling - 2]]<br /> *[[Пример конвертера данных из CSV-файлов в базу BGBilling - 3]]<br /> *[[Конвертер базы Netup]]<br /> *[[Примеры конвертеров данных из других биллинговых систем]]<br /> <br /> === Администрирование ===<br /> * [[Разграничение прав действий]]<br /> * [[Настройка безопасности сервера биллинга и компонентов биллинга]]<br /> * [[Принудительный останов процессов биллинга]]<br /> * [[Использование подписанного SSL сертификата]]<br /> * [[Запуск scheduler и data_loader с другими портами управления]]<br /> * [[bg-snmp-management|Мониторинг java-процессов по snmp]]<br /> * [[Скрипты автостарта демонов bgbilling для Debian]]<br /> * [[javaws|Запуск BGBillingClient через Java Web Start]]<br /> * [[Мониторинг Inet-Radius через JMX]]<br /> <br /> === Настройка вспомогательного ПО ===<br /> *[[Проксирование обращений к BGBillingServer посредством nginx]]<br /> <br /> ==== MySQL ====<br /> *[[Рекомендации по настройке MySQL]]<br /> *[[database backup|Backup MySQL базы с помощью snapshot'ов (Linux, LVM)]]<br /> *[[Настройка MySQL репликации]]<br /> *[[Установка триггера в MySQL для отслеживания изменений]]<br /> *[[Скрипт восстановления MySQL репликации]]<br /> *[[Simple DB backup]]<br /> <br /> ==== NetFlow ====<br /> *[[Настройка NetFlow-агента IPCAD]]<br /> *[[Разделение NetFlow-потоков]]<br /> <br /> === Технологии ===<br /> *[[BGBilling_XSLT|XSLT]]<br /> <br /> === Разработка ===<br /> *[[Отладка action'ов в IntelliJ IDEA]]<br /> *[[Разработка динамического кода в IDE Eclipse]]<br /> <br /> === [[XSLT]] шаблоны ===<br /> *[[Добавление параметров договора на страницу личного кабинета]]<br /> &lt;!-- *[[Красивые графики статистики в модуле IPN]] --&gt;<br /> *[[Карточки договора]]<br /> *[[Создание XSLT/FO шаблона со штрихкодами]]<br /> *[[Подстановка данных в зависимости от текущего пользователя биллинга]]<br /> *[[Генерация прайса модуля IP телефонии в карточке договора]]<br /> <br /> ==== Счета ====<br /> *[[Печать счета-фактуры и акта на отдельных листах]]<br /> *[[Расширенные счета модуля бухгалтерии]]<br /> *[[Квитанция телефонии физ. лицам]]<br /> *[[Шаблоны вывода названия месяца]]<br /> *[[Изменения в шаблоне в зависимости от месяца документа]]<br /> *[[Добавление новых шрифтов в FO шаблоны]]<br /> <br /> === Интеграция с внешними системами ===<br /> * [[Прямая интеграция с платежными терминалами ЭСФОР / SFOUR]]<br /> * [[Интеграция с платежной системой с использованием модуля Card]]<br /> * [[Интеграция с платежной системой Robokassa]]<br /> * [[SMS рассылка через SMPP]]<br /> * [[SMS рассылка через SMPP по средствам дин кода в 5.2]]<br /> * [[Система учета &quot;Заявки и Наряды&quot; на java]]<br /> * [[Bash скрипт-отсылка смс через телефон при отсутствие ping на заданный узел]]<br /> * [[Запросы в личный кабинет пользователя сторонними системами]]<br /> * [[Запросы к серверу биллинга сторонними системами]]<br /> <br /> ==== 1С ====<br /> * [[BGBilling-1C]]<br /> * [[amurimpulse.ru bgbilling]]<br /> * [[Integrator 1C-BGBilling]]<br /> * [[Пример обращения к биллингу из 1С v.7.7]]<br /> * [[Пример интеграции с 1С v.7.7]]<br /> * [[Пример интеграции с 1С v.8.1]]<br /> * [[Установка unload_status счета через HTTP-запрос]]<br /> <br /> === Динамический код (скрипты BGBS для старых версий) ===<br /> *[[Логгирование в скриптах поведения]]<br /> <br /> ==== Динамический код ====<br /> *[[Конвертирование адреса]]<br /> *[[Новый номер договора группе договоров]]<br /> <br /> ==== Комплексные решения ====<br /> *[[Предоставление тестового периода пользования услугой]]<br /> *[[Организация системы отслеживания и отключения КТВ должников на BGBS с использованием CRM плагина]]<br /> *[[Автоматизация подключений VPN-клиентов с использованием CRM плагина]]<br /> *[[Пример автоматизации подключения новых клиентов]]<br /> <br /> ==== Глобальные скрипты ====<br /> *[[Скрипт глобальный отмены перехода на тарифы при неоплате]]<br /> *[[Скрипт предоставление скидки пенсионерам]]<br /> *[[Скрипт создания субдоговоров по шаблону]]<br /> *[[Глобальное событие запуска сервера]]<br /> *[[Перемещение в группу через 3 месяца если не было движения денег в наработке]]<br /> *[[Поиск и изменение статусов у договоров]]<br /> *[[Получение списка доступных действий в SQL]]<br /> *[[Глобальный скрипт для удаления старых таблиц]]<br /> <br /> ==== Пользовательские библиотеки скриптов ====<br /> *[[Пересчеты и бонусы]]<br /> *[[Архивирование логов netflow и radius accaunting]]<br /> <br /> ==== Ядро ====<br /> *[[Смена тарифного плана по заданию пользователя]]<br /> *[[Валидация текстового параметра]]<br /> *[[Проверка ИНН/КПП при вводе]]<br /> *[[Проверка параметра договора перед изменением]]<br /> *[[Обработка смены параметра договора]]<br /> *[[Создание списка дополнительных действий для договора]]<br /> *[[Обработка события создания договора]]<br /> *[[Обработка события &quot;добавление услуги RSCM в договор&quot; . Скипт сменяет тариф, подключает абонплату ]]<br /> *[[Приостановление договора клиентом через WEB]]<br /> *[[Скрипт проверки баланса и отключения договора]]<br /> *[[Изменение стандартной логики перетирания статусов]]<br /> *[[Пример продажи OEM ключей с помощью скрипта]]<br /> *[[Пример копирования тарифного плана]]<br /> *[[Получение текущего пользователя биллинга]]<br /> *[[Запуск скрипта до и после акшена]]<br /> *[[Примеры скриптов до и после акшена]]<br /> *[[Примеры динамического кода акшена и веб-сервисов]]<br /> *[[Начисление бонусов на счет при платежах определенного типа]]<br /> *[[Включение должников по приходу платежа]]<br /> *[[Снижение лимита при внесении расхода]]<br /> *[[Синхронизация услуг договора в соответствии с тарифными планами]]<br /> *[[Добавление группы и снятие в зависимости от статуса]]<br /> *[[Управление статусом договора по состоянию баланса]]<br /> *[[Запрет на вход в личный кабинет с закрытых договоров]]<br /> *[[Переход на понижающий тариф только со следующего месяца]]<br /> *[[Пример создания своего интерфейса в клиенте]]<br /> *[[Метки услуг]]<br /> *[[Сравнение прав пользователей]]<br /> *[[Свой список шаблонов договоров]]<br /> <br /> ==== Модуль Bill ====<br /> *[[Создание счета в модуле Bill]]<br /> *[[Создание счета из суммы платежей по классу договоров]]<br /> *[[Создание счета по таблице позиций]]<br /> *[[Создание счета и счет-фактур в модуле Bill(выполнение тех же действий что и руками)]]<br /> *[[Создание счетов на предоплату]]<br /> *[[Распечатка счетов в pdf по событию генерации счета]]<br /> *[[Внешняя программа на JAVA для синхронизации номеров счетов и актов выполненных работ (версия BGBilling 5.0)]]<br /> <br /> ==== Модуль DialUp ====<br /> *[[Запуск переначисления в модуле DialUp]]<br /> *[[Передача ACCEPT вместо REJECT вместе с доп. аттрибутами]]<br /> *[[Обработка запроса учетного периода]]<br /> *[[Переинициализация тарифа в пределах сессии | Обработка запроса учетного периода (переинициализация тарифа в пределах сессии) ]]<br /> *[[Ограничение доступа для различных групп пользователей для BGRadiusDialup]]<br /> *[[Детальное информирование абонентов о причинах ошибки 691]]<br /> *[[Аутентификация с учетом Calling-Id-Station]]<br /> *[[Доп. действие сброса активных соединений]]<br /> *[[Открытие абонплаты по первой установке соединения]]<br /> *[[Пересчет трафика по данным Radius (при потерянных Netflow-логах)]]<br /> *[[Отключение Fake сессий при приходе платежа]]<br /> *[[Ограничение доступа на основе объектов]]<br /> <br /> ==== Модуль DialUp / Cкрипты предобработки RADIUS запросов ====<br /> * [[Уcтановка услуги типа &quot;Время&quot; для BGRadiusDialup]]<br /> * [[Установка фиксированного пароля]]<br /> * [[Нормализация параметра Acct-Session-Id у маршрутизатора Cisco]]<br /> * [[Разделение атрибута User-Name на логин и пароль]]<br /> * [[Вынос MAC адреса из cisco-avp-pair в Calling-Station-Id]]<br /> * [[Копирование Тunnel-Client-Endpoint/Tunnel-Server-Endpoint в Calling-Station-Id/Called-Station-Id]]<br /> * [[Замена radius-атрибутов при авторизации]]<br /> <br /> ==== Модуль Inet / Cкрипты предобработки RADIUS запросов ====<br /> * [[Вынос MAC адреса из cisco-avp-pair в Calling-Station-Id для модуля Inet]]<br /> <br /> ==== Модуль СerberСrypt ====<br /> *[[Изменение подписки карты через web (cerbercrypt)]]<br /> *[[Управление подписками через веб (cerbercrypt)]]<br /> <br /> ==== Модуль NPay ====<br /> *[[Определение размера абонентской платы]]<br /> *[[Запуск переначисления в модуле NPay]]<br /> *[[Дебетовые абонплаты. Снятие штрафа за разблокировку.]]<br /> *[[Снятие абонентской платы в дебитовых договорах]]<br /> *[[Предварительное уведомление о блокировке по дебетовым абонплатам]]<br /> <br /> ==== Модуль Phone ====<br /> *[[При создании поинта модуля Phone добавление в него абонплат]]<br /> *[[Закрытие_телефонных_договоров]]<br /> <br /> ==== Модуль RSCM ====<br /> *[[Запуск переначисления в модуле RSCM]]<br /> *[[Перенос суммы расхода в наработку RSCM модуля]]<br /> <br /> ==== Модуль VoiceIp ====<br /> *[[Определение стоимости звонка VoiceIp]]<br /> <br /> ==== Модуль VoiceIp / Cкрипты предобработки RADIUS запросов ====<br /> * [[Идентификация Voip оператора по подсети (транзит)]]<br /> * [[Установка параметров звонка Voip]]<br /> * [[Установка фиксированного пароля]]<br /> * [[Разделение атрибута User-Name на логин и пароль]]<br /> * [[Замена radius-атрибутов при авторизации]]<br /> <br /> ==== Плагин CRM ====<br /> *[[Обработка выполненных задач в журнале задач]]<br /> *[[Обработка задач по событию ядра &quot;Поступление платежа&quot;, создание новой задачи и изменение существующей]]<br /> *[[Пример получения информации о задаче]]<br /> *[[Уведомления монтажников о новых активных задачах путем отправки SMS XML запросом]]<br /> <br /> ==== Плагин CashCheck ====<br /> *[[Чек: добавление позиции]]<br /> *[[Чек: завершение формирования]]<br /> *[[Примеры скриптов CashCheck]]<br /> <br /> ==== Плагин Documents ====<br /> *[[Создание копий документа на договорах]]<br /> <br /> === Решения для модулей и плагинов ===<br /> <br /> ==== Модуль DialUP ====<br /> *[[Настройка Lucent Ascend MAX6000 в качестве DialUP сервера]]<br /> *[[Настройка Dial-IN сервера FreeBSD PPPD]]<br /> *[[Настройка VPN сервера LINUX PPPD + POPTOP]]<br /> *[[Настройка шейпера в LINUX PPPD]]<br /> *[[Настройка VPN сервера FreeBSD MPD]]<br /> *[[Настройка PPPoE сервера на Cisco-роутере]]<br /> *[[Настройка PPPoE и/или РРТР (VPN) на Mikrotik]]<br /> *[[Проблема с прохождением update пакетов и сброса сессий в Debian и Ubuntu дистрибутивах]]<br /> *[[Настройка Dial-IN Windows RRAS сервера]]<br /> *[[VPN доступ с повременной тарификацией на базе FreeBSD MPD]]<br /> *[[Организация семейства UNLIMIT тарифов на базе FreeBSD MPD]]<br /> *[[Примеры тарифных планов VPN/DialUp]]<br /> *[[Отключение сессий по PoD на CISCO]]<br /> *[[Пример скрипта управления уровнями BGRadiusDialup]]<br /> *[[Настройка cisco с поддеркой ISG]]<br /> *[[Настройка BGBilling c поддеркой ISG]]<br /> *[[Настройка BGBilling с RedBack SmartEdge (PPPOE)]]<br /> <br /> ==== Модуль E-Mail ====<br /> *[[Почтовая система Exim + Cyrus + OpenLDAP на FreeBSD]]<br /> *[[Postfix/MySQL/BGBilling]]<br /> *[[Postfix+dovecot+ldap]]<br /> *[[Postfix+Mysql+Virtual domains]]<br /> <br /> ==== Модуль Inet ====<br /> *[[Inet FAQ]]<br /> *[[Схемы подключения]]<br /> *[[Расширения]]<br /> *[[Конвертеры из IPN в INET]]<br /> *[[Конвертер: логины Dialup в сервисы inet]]<br /> <br /> ==== Модуль IPN ====<br /> *[[IP/VPN]]<br /> *[[Примеры тарифных планов IPN]]<br /> *[[Настройка BGIPNNetflowCollector]]<br /> *[[Методика определения причины отсутствия трафика в отчете договора]]<br /> *[[Связка с flow-tools]]<br /> *[[Экспорт Netflow-данных в формат Nfdump]]<br /> *[[Реалиазация шлюза на Cisco]]<br /> *[[Реализация шлюзов на BeanShell,примеры стандартных и других шлюзов]] (Manad, Cisco, Zyxel, Mikrotik)<br /> *[[Изменения в manad для работы с одним pipe на множество IP адресов]]<br /> *[[FreeBSD manad, понимающий изменения правил в тарифах]]<br /> *[[Табличный FreeBSD manad, понимающий изменения правил в тарифах]]<br /> *[[Пример реализации скриптового универсального шлюза]]<br /> *[[Конвертер привязок услуг dialup в привязки ipn]]<br /> *[[Реализация скрипта Manad]]<br /> *[[Настройка шлюза Mikrotik]]<br /> *[[Обновление номеров интерфейсов при замене роутера]]<br /> <br /> ==== Модуль Phone ====<br /> * [[Конвертация и загрузка тарифов Телефонии в биллинг]]<br /> * [[Примеры тарифных планов Телефонии]]<br /> * [[Примеры реализации конверторов логов]]<br /> * [[Генератор отчётности для Совинтел]]<br /> <br /> ==== Модуль VoiceIP ====<br /> *[[Интеграция Asterisk и BGBilling (Accounting) посредством скрипта предобработки запросов Radius]]<br /> *[[Интеграция Asterisk и BGBilling (Accounting) посредством изменения программного кода Asterisk]]<br /> *[[Интеграция c MVTS]]<br /> *[[Интеграция c Cisco Call Manager Express (CME)]]<br /> *[[Карточная IVR система на базе Cisco]]<br /> *[[Примеры IVR скриптов для Cisco]]<br /> *[[Пример настройки Cisco AS5350]]<br /> *[[Продажа пакетов минут на направления]]<br /> <br /> ==== Модуль Reports ====<br /> *[[Редактирование отчетов в iReport]]<br /> *[[Примеры отчётов]]<br /> *[[Использование отчётов для организации универсального поиска]]<br /> *[[Табличные отчёты с динамическими столбцами]]<br /> *[[Табличные отчёты в динамическом коде]]<br /> <br /> ==== Плагин Dispatch ====<br /> *[[Импорт старой схемы рассылок баланса в Dispatch]]<br /> <br /> === SQL-запросы ===<br /> *[[Схема связки таблиц тарифов]]<br /> *[[Разные SQL-запросы]]<br /> *[[SQL-запрос: кто сколько платит на каждом тарифе]]<br /> *[[Получение цен тарифов]]<br /> *[[Работа с группами, битовые маски]]<br /> *[[наработка по абонентке и услугам за месяц]]<br /> <br /> ==== CerberCrypt ====<br /> *[[Модуль CerberCrypt: Разные SQL-запросы]]<br /> *[[Модуль CerberCrypt: Поиск битых SQL-связей]]<br /> <br /> === Веб-Интерфейс ===<br /> *[[Свой action в личном кабинете]]<br /> **[[WebAction_CustomSuspend]] - управление статусом договора (v5.0)<br /> *[[Изменение параметров договора из личного кабинета]]<br /> *[[Как убрать ненужные действия в web]]<br /> <br /> === Протоколы ===<br /> *[[Протокол дилерский платежей]]<br /> *[[Протоколы, поддержанные в модуле MPS]]<br /> *[[Протоколы, поддержанные в модуле Phone]]<br /> *[[Медиа: Enaza.zip]]<br /> *[[Медиа: Payonline.zip]]<br /> <br /> === FAQ ===<br /> * [[Не запускается служба BSBillingServer под Windows]]<br /> * [[Вопросы вместо русских букв]]<br /> * [[Что происходит с пользователями при рестарте сервера биллинга и BGRadiusDialup]]<br /> * [[Тарификация максимального трафика]]<br /> * [[Field ... doesn't have a default value ]]<br /> * [[Character set ‘cp1251' is not a compiled character set and is not specified in the ‘C:\mysql\\share\charsets\Index.xml’ file ]]<br /> * [[com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown database 'bgbilling' ]]<br /> * [[Договор не отображается в поиске]]<br /> * [[PPPD проблема с сессиями больше 4ГБ]]<br /> * [[Меню личного кабинета]]<br /> * [[Java.lang.NoClassDefFoundError:_javax/xml/bind/DataBindingException|FreeBSD: Java.lang.NoClassDefFoundError: javax/xml/bind/DataBindingException]]<br /> * [[Manad: после некоторого количества договоров начинает передавать данные на биллинг неправильно ]]<br /> * [[Ошибка выполнения скиптов: Undefined argument:]]<br /> * [[Ошибка в логе &quot;Too many open files&quot;]]<br /> * [[Ошибка в клиенте &quot;Action NOT FOUND!..&quot;]]<br /> * [[Inet FAQ]]<br /> * [[java.lang.NoSuchMethodError]]<br /> <br /> == BGCRM ==<br /> <br /> === Плагин BGBilling ===<br /> * [[Синхронизация справочников адресов с BGBilling]]<br /> <br /> === Плагин Document ===<br /> * [[Примеры шаблонов для генерации документов]]<br /> <br /> === Плагин Report ===<br /> * [[Примеры отчётов BGCRM]]<br /> <br /> === Комплексные решения ===<br /> *[[Организация отключения должников КТВ]]<br /> *[[Интеграция с Asterisk для обработки входящих звонков]]<br /> <br /> === Примеры динамического кода ===<br /> *[[Проверка уникальности контрагента по ИНН]]<br /> *[[Проверка уникальности контрагента по паспортным данным]]<br /> *[[Переключение статуса процессов по наступлению момента времени]]<br /> *[[Повышение приоритета процессов]]<br /> *[[Проверка правки параметра процесса]]<br /> *[[Изменение описания процесса по правке параметра]]<br /> *[[Обработка событий процесса согласования]]<br /> *[[Генерация новостей исполнителям при изменении процессов]]<br /> <br /> == DBInfo ==<br /> * [[Описание программы]]<br /> * [[Установка и настройка программы]]<br /> * [[Исходный код программы]]<br /> <br /> == Разработка ПО ==<br /> В данном разделе собираются рекомендации по разработке ПО. Это накопленная годами и пополняемая база знания призвана упростить обучение в первую очередь разработчиков, работающих с применяемыми в BiTel технологиями: Java, Web (JS, HTML), СУБД MySQL, LINUX, GIT. И разрабатывающих схожие приложения: тиражируемые продукты для автоматизации процессов организаций. Всё предельно конкретно, поэтому большая часть примеров будет приведена на Java.<br /> Однако значительная часть описываемых проблем и принципов довольно фундоментальна и может быть полезна разработчиками в иных областях.<br /> <br /> === В общем ===<br /> * [[Разработка]]<br /> * [[Оптимизация]]<br /> * [[Логирование]]<br /> * [[Сборка и публикация проекта]]<br /> <br /> === Java разработка ===<br /> * [[Работа с git в Eclipse(EGit)]]<br /> * [[Выявление неисправностей приложений]]<br /> * [[Обращение к Web-сервису]]<br /> * [[Работа с SQL в Java]]<br /> * [[Встроенный Application сервер в приложении]]<br /> * [[Потоки в Java]]<br /> * [[Обработка ошибок]]<br /> <br /> ==== Полезные Java библиотеки ====<br /> {| border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;<br /> |- valign=top align=&quot;center&quot; bgcolor=&quot;#eeeeee&quot; <br /> | Наименование || Область применения<br /> |-<br /> | [[Jimi - обработка изображений | JIMI]] || Обработка изображений<br /> |}<br /> <br /> === Технологии, используемые в проектах ===<br /> * [[XML]]<br /> * [[XSLT]]<br /> * [[FO(P)]]<br /> * [[REGEXP]]<br /> * [[MySQL REGEXP]]<br /> <br /> === Вспомогательные технологии ===<br /> * [[Сборщик Apache ANT]]<br /> * [[Сбор и анализ сетевого трафика]]<br /> * [[SSH]]<br /> * [[Оптимизация запросов в MySQL]]<br /> <br /> === Требования BiTel к оформлению ===<br /> * [[Java кода]]<br /> * [[MySQL кода]]</div> DimOn