Примеры скриптов CashCheck
Материал из BiTel WiKi
(Различия между версиями)
DimOn (Обсуждение | вклад) (→Готовый скрипт с двумя действиями) |
DimOn (Обсуждение | вклад) (→Скрипт печати чека при добавлении платежа 2) |
||
(10 промежуточных версий не показаны.) | |||
Строка 14: | Строка 14: | ||
check.addString( "Телематические услуги связи" ); | check.addString( "Телематические услуги связи" ); | ||
check.addString( "Договор №: " + payment.getContractTitle() ); | check.addString( "Договор №: " + payment.getContractTitle() ); | ||
- | + | check.addString( "Абонент: " + payment.getContractComment() ); | |
- | // | + | |
+ | // добавляем параметр договора | ||
int PARAM_ID = 3; | int PARAM_ID = 3; | ||
ContractParameterManager bgParamMan = new ContractParameterManager( con ); | ContractParameterManager bgParamMan = new ContractParameterManager( con ); | ||
String paramVal = bgParamMan.getStringParam( event.getContractID(), PARAM_ID ); | String paramVal = bgParamMan.getStringParam( event.getContractID(), PARAM_ID ); | ||
- | check.addString( " | + | check.addString( "Какой-то параметр договора: " + paramVal ); |
check.addString( " " ); | check.addString( " " ); | ||
Строка 32: | Строка 33: | ||
"Ваш текущий баланс: " + | "Ваш текущий баланс: " + | ||
(new BalanceUtils( con )).getBalance( new Date(), event.getContractID() ).toPlainString() | (new BalanceUtils( con )).getBalance( new Date(), event.getContractID() ).toPlainString() | ||
- | ); | + | ); |
check.addString( " " ); | check.addString( " " ); | ||
} | } | ||
</source>--[[Участник:DimOn|dimOn]] 13:07, 10 ноября 2009 (UTC) | </source>--[[Участник:DimOn|dimOn]] 13:07, 10 ноября 2009 (UTC) | ||
- | == | + | == Вывод параметра Адрес в чек == |
+ | <source lang="java"> | ||
+ | int PARAM_ID = 13; //id параметра Адрес | ||
+ | ContractParameterManager bgParamMan = new ContractParameterManager( con ); | ||
+ | paramVal = bgParamMan.getAddressParam( event.getContractID(), PARAM_ID ); | ||
+ | adress = paramVal.getAddress().replace( ',','.' ) ; //меняем запятые в адресе на точки | ||
+ | check.addString( adress.trim() );//убираем лишние пробелы | ||
+ | </source> | ||
+ | |||
+ | == Скрипт печати чека при добавлении платежа == | ||
+ | <source lang="java"> | ||
+ | import bitel.billing.server.util.*; | ||
+ | import bitel.billing.server.script.bean.event.PaymentEvent; | ||
+ | import bitel.billing.server.contract.bean.Payment; | ||
+ | import ru.bitel.bgbilling.plugins.cashcheck.server.bean.*; | ||
+ | import ru.bitel.bgbilling.kernel.plugin.server.*; | ||
+ | import org.w3c.dom.*; | ||
+ | import javax.servlet.http.HttpSession; | ||
+ | import java.math.BigDecimal; | ||
+ | import ru.bitel.frk.client.CmdProtocolClient; | ||
+ | |||
+ | /* | ||
+ | Скрипт печати чека при добавлении платежа. | ||
+ | Вешается на событие PaymentEvent ("приход платежа"). | ||
+ | |||
+ | В данной версии отслеживается тип платежа и реакция происходит на какой-то из них. | ||
+ | Используется настройка регистратора из конфига плагина CashCheck. | ||
+ | |||
+ | Внимание: | ||
+ | 1) очередь печати чеков игнорируется. | ||
+ | 2) настройки маппинга платежей на принтеры из конфига плагина игнорируются. | ||
+ | Это означает, что ОЧЕНЬ ЖЕЛАТЕЛЬНО, чтобы на тот тип платежей, которые здесь печатаются автоматом | ||
+ | в конфиге плагина НЕ БЫЛО маппинга на принтер. Иначе все эти платежи помимо распечатки тут попадут | ||
+ | также и в очередь, будут мешаться и смогут быть повторно распечатаны. Также при добавлении прихода | ||
+ | в клиенте биллинга нельзя ставить галочку "печатать чек", иначе печать чека будет инициирована ДВАЖДЫ. | ||
+ | Отсутствие маппинга спасёт и в этом случае - напечатать чек по галочке (как и из очереди) станет невозможно. | ||
+ | |||
+ | Скрипт написан для версии 5.1 | ||
+ | */ | ||
+ | public void onEvent( event, setup, con, conSlave ) | ||
+ | { | ||
+ | // тип платежа, на который реагировать (если несколько, то самим добавить сравнения ниже) | ||
+ | final static int PAYMENT_TYPE_ID = 24; | ||
+ | // параметры регистратора: номер (из конфига плагина) и пароль | ||
+ | final static int FR_ID = 5; | ||
+ | final static String FR_PASS = "12345"; | ||
+ | // | ||
+ | PaymentEvent paymentEvent = (PaymentEvent)event; | ||
+ | Payment payment = paymentEvent.getPayment(); | ||
+ | if( payment.getPaymentTypeID() == PAYMENT_TYPE_ID ) | ||
+ | { | ||
+ | print( "CashCheck Autoprint: Payment-type-ID="+payment.getPaymentTypeID()+" should be automatically printed" ); | ||
+ | // Получаем плагин, принтер менеджер и сам принтер пытаемся получить | ||
+ | BGPluginServer plugin = BGPluginManagerServer.getManager().getPlugin( "ru.bitel.bgbilling.plugins.cashcheck" ); | ||
+ | Element rootNode = null; | ||
+ | HttpSession session = null; | ||
+ | PrinterManager printerManager = new PrinterManager( plugin, session, rootNode ); | ||
+ | Map printers = printerManager.getPrinterMap(); | ||
+ | Printer printer = printers.get( FR_ID ); | ||
+ | if ( printer == null ) | ||
+ | { | ||
+ | error( "CashCheck Autoprint: ККМ не настроен" ); | ||
+ | return; | ||
+ | } | ||
+ | // код похож на тот, что в экшене печати чека, но в отличие от него тут мы | ||
+ | // ничего не чекаем в очереди. надо озаботиться, чтобы в очередь не попадало. | ||
+ | // | ||
+ | // далее формируем объект-чек. | ||
+ | // Добавляются сколько-то строк и одна только addPayment, ведь платёж у нас тут всегда один | ||
+ | // и позиция, стало быть, тоже всегда одна | ||
+ | BigDecimal summa = payment.getSumma(); | ||
+ | Check check = new Check(); | ||
+ | check.addString( "произвольная строка" ); | ||
+ | check.addPayment( summa.floatValue(), "товар", 0 ); | ||
+ | // | ||
+ | String clientsumma = check.getPaymentsum().toPlainString(); | ||
+ | // запрос к серверу печати | ||
+ | CmdProtocolClient client = new CmdProtocolClient( printer.getAddress(), printer.getPort() ); | ||
+ | try | ||
+ | { | ||
+ | client.connect(); | ||
+ | boolean result = client.send( "check", new Object[]{FR_PASS, clientsumma, check.getPlines()} ); | ||
+ | if( result == false ) | ||
+ | { | ||
+ | error( "CashCheck Autoprint: Ошибка! ККМ сказала: " + client.getReply() ); | ||
+ | return; | ||
+ | } | ||
+ | print( "CashCheck Autoprint: check was printed!" ); | ||
+ | } | ||
+ | catch( ConnectException e ) | ||
+ | { | ||
+ | error( "CashCheck Autoprint: Ошибка обмена с сервером печати ККМ: " + e.getMessage() ); | ||
+ | } | ||
+ | finally | ||
+ | { | ||
+ | try{client.disconnect();}catch( ConnectException e ){} | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | --[[Участник:DimOn|dimOn]] 16:50, 22 марта 2011 (UTC) | ||
+ | |||
+ | == Скрипт печати чека при добавлении платежа 2 == | ||
+ | <source lang="java"> | ||
+ | import bitel.billing.server.util.*; | ||
+ | import bitel.billing.server.script.bean.event.PaymentEvent; | ||
+ | import bitel.billing.server.contract.bean.Payment; | ||
+ | import bitel.billing.server.contract.bean.*; | ||
+ | import ru.bitel.bgbilling.plugins.cashcheck.server.bean.*; | ||
+ | import ru.bitel.bgbilling.kernel.plugin.server.*; | ||
+ | import ru.bitel.bgbilling.common.BGMessageException; | ||
+ | import bitel.billing.common.BGException; | ||
+ | import bitel.billing.plugin.BGPluginServer; | ||
+ | import bitel.billing.plugin.BGPluginManagerServer; | ||
+ | import org.w3c.dom.*; | ||
+ | import javax.servlet.http.HttpSession; | ||
+ | import java.math.BigDecimal; | ||
+ | import ru.bitel.frk.client.CmdProtocolClient; | ||
+ | import java.util.Arrays; | ||
+ | import java.util.List; | ||
+ | import java.sql.Connection; | ||
+ | |||
+ | /* | ||
+ | Скрипт печати чека при добавлении платежа. | ||
+ | Вешается на событие PaymentEvent ("приход платежа"). | ||
+ | |||
+ | В данной версии отслеживается тип платежа и реакция происходит на какой-то из них. | ||
+ | В зависимости от типа платежа печатается на определённый регистратор и определённого вида чек. | ||
+ | Используется настройка регистратора из конфига плагина CashCheck. | ||
+ | Также печатается только для определённых групп юзеров биллинга. | ||
+ | |||
+ | Внимание: | ||
+ | 1) очередь печати чеков игнорируется. | ||
+ | 2) настройки маппинга платежей на принтеры из конфига плагина игнорируются. | ||
+ | Это означает, что ОЧЕНЬ ЖЕЛАТЕЛЬНО, чтобы на тот тип платежей, которые здесь печатаются автоматом | ||
+ | в конфиге плагина НЕ БЫЛО маппинга на принтер. Иначе все эти платежи помимо распечатки тут попадут | ||
+ | также и в очередь, будут мешаться и смогут быть повторно распечатаны. Также при добавлении прихода | ||
+ | в клиенте биллинга нельзя ставить галочку "печатать чек", иначе печать чека будет инициирована ДВАЖДЫ. | ||
+ | Отсутствие маппинга спасёт и в этом случае - напечатать чек по галочке (как и из очереди) станет невозможно. | ||
+ | |||
+ | Скрипт написан для версии 5.0 | ||
+ | */ | ||
+ | |||
+ | /** | ||
+ | * Здесь список всех юзеров, для которых сработает автопечать при приходе платежа. | ||
+ | */ | ||
+ | final static int[] USERS ={1, 32, 3}; | ||
+ | |||
+ | /** | ||
+ | * Здесь выборка принтера по типу платежа. Берутся настройки из конфига плагина. | ||
+ | */ | ||
+ | |||
+ | // параметры регистратора: номер (из конфига плагина) и пароль, заполняются в методе | ||
+ | int FR_ID; | ||
+ | String FR_PASS; | ||
+ | |||
+ | private boolean changePrinter( int paymentTypeId ) | ||
+ | { | ||
+ | switch( paymentTypeId ) | ||
+ | { | ||
+ | case 24: | ||
+ | FR_ID = 5; | ||
+ | FR_PASS = "12345"; | ||
+ | return true; | ||
+ | case 29: | ||
+ | FR_ID = 5; | ||
+ | FR_PASS = "12345"; | ||
+ | return true; | ||
+ | default: | ||
+ | return false; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * формируем объект-чек. | ||
+ | * Добавляются сколько-то строк и одна только addPayment, ведь платёж у нас тут всегда один | ||
+ | * и позиция, стало быть, тоже всегда одна | ||
+ | */ | ||
+ | private Check makeCheck( Payment payment, int paymentTypeId, Connection con ) | ||
+ | { | ||
+ | switch( paymentTypeId ) | ||
+ | { | ||
+ | case 24: | ||
+ | BigDecimal summa = payment.getSumma(); | ||
+ | int cid = payment.getContractID(); | ||
+ | Check check = new Check(); | ||
+ | check.addString( " " ); | ||
+ | check.addString( "Телематические услуги связи(Интернет)" ); | ||
+ | //check.addString( "Договор №: " + payment.getContractTitle() ); | ||
+ | // догогор вытаскиваем | ||
+ | Contract contract = new ContractManager( con ).getContractByID( cid ); | ||
+ | if( contract != null ) | ||
+ | { | ||
+ | check.addString( "Договор №: " + contract.getTitle() ); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | check.addString( "Договор неизвестный (ошибка)" ); | ||
+ | } | ||
+ | // параметр вытаскиваем | ||
+ | int PARAM_ID = 3; | ||
+ | ContractParameterManager bgParamMan = new ContractParameterManager( con ); | ||
+ | String paramVal = bgParamMan.getStringParam( cid, PARAM_ID ); | ||
+ | check.addString( "ФИО/Организация: "); | ||
+ | check.addString( paramVal ); | ||
+ | check.addString( " " ); | ||
+ | check.addString( | ||
+ | "Ваш текущий баланс: " + | ||
+ | (new BalanceUtils( con )).getBalance( new Date(), cid ).toPlainString() | ||
+ | ); | ||
+ | check.addPayment( summa.floatValue(), "Оплата услуг интернета", 0 ); | ||
+ | return check; | ||
+ | |||
+ | |||
+ | case 29: | ||
+ | BigDecimal summa = payment.getSumma(); | ||
+ | Check check = new Check(); | ||
+ | check.addString( "произвольная строка вид 2" ); | ||
+ | check.addPayment( summa.floatValue(), "товар", 0 ); | ||
+ | return check; | ||
+ | default: | ||
+ | return null; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | public void onEvent( event, setup, con, conSlave ) | ||
+ | { | ||
+ | PaymentEvent paymentEvent = (PaymentEvent)event; | ||
+ | Payment payment = paymentEvent.getPayment(); | ||
+ | Arrays.sort( USERS ); | ||
+ | if( Arrays.binarySearch( USERS, payment.getUserID() ) >=0 ) | ||
+ | { | ||
+ | print( "CashCheck Autoprint: user id="+payment.getUserID()+", payment should be automatically printed!" ); | ||
+ | int paymentTypeId = payment.getPaymentTypeID(); | ||
+ | if( changePrinter( paymentTypeId ) ) | ||
+ | { | ||
+ | print( "CashCheck Autoprint: paymentTypeId="+paymentTypeId+", payment should be automatically printed!" ); | ||
+ | // Получаем плагин, принтер менеджер и сам принтер пытаемся получить | ||
+ | BGPluginServer plugin = BGPluginManagerServer.getManager().getPlugin( "ru.bitel.bgbilling.plugins.cashcheck" ); | ||
+ | Element rootNode = null; | ||
+ | HttpSession session = null; | ||
+ | PrinterManager printerManager = new PrinterManager( plugin, session, rootNode ); | ||
+ | Map printers = printerManager.getPrinterMap(); | ||
+ | Printer printer = printers.get( FR_ID ); | ||
+ | if ( printer == null ) | ||
+ | { | ||
+ | error( "CashCheck Autoprint: ККМ не настроен" ); | ||
+ | return; | ||
+ | } | ||
+ | // код похож на тот, что в экшене печати чека, но в отличие от него тут мы | ||
+ | // ничего не чекаем в очереди. надо озаботиться, чтобы в очередь не попадало. | ||
+ | Check check = makeCheck( payment, paymentTypeId, con ); | ||
+ | if( check != null ) | ||
+ | { | ||
+ | String clientsumma = check.getPaymentsum().toPlainString(); | ||
+ | // запрос к серверу печати | ||
+ | CmdProtocolClient client = new CmdProtocolClient( printer.getAddress(), printer.getPort() ); | ||
+ | try | ||
+ | { | ||
+ | client.connect(); | ||
+ | boolean result = client.send( "check", new Object[]{FR_PASS, clientsumma, check.getPlines()} ); | ||
+ | if( result == false ) | ||
+ | { | ||
+ | error( "CashCheck Autoprint: Ошибка! ККМ сказала: " + client.getReply() ); | ||
+ | return; | ||
+ | } | ||
+ | print( "CashCheck Autoprint: check was printed!" ); | ||
+ | } | ||
+ | catch( ConnectException e ) | ||
+ | { | ||
+ | error( "CashCheck Autoprint: Ошибка обмена с сервером печати ККМ: " + e.getMessage() ); | ||
+ | } | ||
+ | finally | ||
+ | { | ||
+ | try{client.disconnect();}catch( ConnectException e ){} | ||
+ | } | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | print( "CashCheck Autoprint: makeCheck: paymentTypeId="+paymentTypeId+", payment NOT printed!" ); | ||
+ | } | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | print( "CashCheck Autoprint: changePrinter: paymentTypeId="+paymentTypeId+", payment NOT printed!" ); | ||
+ | } | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | print( "CashCheck Autoprint: user id="+payment.getUserID()+", payment NOT printed!" ); | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | --[[Участник:DimOn|dimOn]] 13:41, 21 апреля 2011 (UTC) | ||
+ | --[[Участник:DimOn|dimOn]] 15:24, 10 мая 2011 (UTC) | ||
+ | |||
+ | |||
+ | |||
+ | [[Категория:Плагин CashCheck]] | ||
+ | [[Категория:Скрипты поведения]] | ||
+ | [[Категория:BGBS API]] |
Текущая версия на 07:35, 17 мая 2011
Содержание |
Готовый скрипт с двумя действиями
Демонстрация того, как вытащить какой-либо параметр договора и как в подвал чека вытащить баланс.
import ru.bitel.bgbilling.plugins.cashcheck.server.bean.*; import bitel.billing.server.contract.bean.*; check = event.getCheck(); if ( event instanceof AddPaymentCheckEvent) { payment = event.getPayment(); check.addString( " " ); check.addString( "Телематические услуги связи" ); check.addString( "Договор №: " + payment.getContractTitle() ); check.addString( "Абонент: " + payment.getContractComment() ); // добавляем параметр договора int PARAM_ID = 3; ContractParameterManager bgParamMan = new ContractParameterManager( con ); String paramVal = bgParamMan.getStringParam( event.getContractID(), PARAM_ID ); check.addString( "Какой-то параметр договора: " + paramVal ); check.addString( " " ); check.addPayment( payment.getSumma(), payment.getContractTitle(), event.getPaymentDep() ); check.addString( " " ); } if(event instanceof EndCreateCheckEvent) { check.addString( "Ваш текущий баланс: " + (new BalanceUtils( con )).getBalance( new Date(), event.getContractID() ).toPlainString() ); check.addString( " " ); }
Вывод параметра Адрес в чек
int PARAM_ID = 13; //id параметра Адрес ContractParameterManager bgParamMan = new ContractParameterManager( con ); paramVal = bgParamMan.getAddressParam( event.getContractID(), PARAM_ID ); adress = paramVal.getAddress().replace( ',','.' ) ; //меняем запятые в адресе на точки check.addString( adress.trim() );//убираем лишние пробелы
Скрипт печати чека при добавлении платежа
import bitel.billing.server.util.*; import bitel.billing.server.script.bean.event.PaymentEvent; import bitel.billing.server.contract.bean.Payment; import ru.bitel.bgbilling.plugins.cashcheck.server.bean.*; import ru.bitel.bgbilling.kernel.plugin.server.*; import org.w3c.dom.*; import javax.servlet.http.HttpSession; import java.math.BigDecimal; import ru.bitel.frk.client.CmdProtocolClient; /* Скрипт печати чека при добавлении платежа. Вешается на событие PaymentEvent ("приход платежа"). В данной версии отслеживается тип платежа и реакция происходит на какой-то из них. Используется настройка регистратора из конфига плагина CashCheck. Внимание: 1) очередь печати чеков игнорируется. 2) настройки маппинга платежей на принтеры из конфига плагина игнорируются. Это означает, что ОЧЕНЬ ЖЕЛАТЕЛЬНО, чтобы на тот тип платежей, которые здесь печатаются автоматом в конфиге плагина НЕ БЫЛО маппинга на принтер. Иначе все эти платежи помимо распечатки тут попадут также и в очередь, будут мешаться и смогут быть повторно распечатаны. Также при добавлении прихода в клиенте биллинга нельзя ставить галочку "печатать чек", иначе печать чека будет инициирована ДВАЖДЫ. Отсутствие маппинга спасёт и в этом случае - напечатать чек по галочке (как и из очереди) станет невозможно. Скрипт написан для версии 5.1 */ public void onEvent( event, setup, con, conSlave ) { // тип платежа, на который реагировать (если несколько, то самим добавить сравнения ниже) final static int PAYMENT_TYPE_ID = 24; // параметры регистратора: номер (из конфига плагина) и пароль final static int FR_ID = 5; final static String FR_PASS = "12345"; // PaymentEvent paymentEvent = (PaymentEvent)event; Payment payment = paymentEvent.getPayment(); if( payment.getPaymentTypeID() == PAYMENT_TYPE_ID ) { print( "CashCheck Autoprint: Payment-type-ID="+payment.getPaymentTypeID()+" should be automatically printed" ); // Получаем плагин, принтер менеджер и сам принтер пытаемся получить BGPluginServer plugin = BGPluginManagerServer.getManager().getPlugin( "ru.bitel.bgbilling.plugins.cashcheck" ); Element rootNode = null; HttpSession session = null; PrinterManager printerManager = new PrinterManager( plugin, session, rootNode ); Map printers = printerManager.getPrinterMap(); Printer printer = printers.get( FR_ID ); if ( printer == null ) { error( "CashCheck Autoprint: ККМ не настроен" ); return; } // код похож на тот, что в экшене печати чека, но в отличие от него тут мы // ничего не чекаем в очереди. надо озаботиться, чтобы в очередь не попадало. // // далее формируем объект-чек. // Добавляются сколько-то строк и одна только addPayment, ведь платёж у нас тут всегда один // и позиция, стало быть, тоже всегда одна BigDecimal summa = payment.getSumma(); Check check = new Check(); check.addString( "произвольная строка" ); check.addPayment( summa.floatValue(), "товар", 0 ); // String clientsumma = check.getPaymentsum().toPlainString(); // запрос к серверу печати CmdProtocolClient client = new CmdProtocolClient( printer.getAddress(), printer.getPort() ); try { client.connect(); boolean result = client.send( "check", new Object[]{FR_PASS, clientsumma, check.getPlines()} ); if( result == false ) { error( "CashCheck Autoprint: Ошибка! ККМ сказала: " + client.getReply() ); return; } print( "CashCheck Autoprint: check was printed!" ); } catch( ConnectException e ) { error( "CashCheck Autoprint: Ошибка обмена с сервером печати ККМ: " + e.getMessage() ); } finally { try{client.disconnect();}catch( ConnectException e ){} } } }
--dimOn 16:50, 22 марта 2011 (UTC)
Скрипт печати чека при добавлении платежа 2
import bitel.billing.server.util.*; import bitel.billing.server.script.bean.event.PaymentEvent; import bitel.billing.server.contract.bean.Payment; import bitel.billing.server.contract.bean.*; import ru.bitel.bgbilling.plugins.cashcheck.server.bean.*; import ru.bitel.bgbilling.kernel.plugin.server.*; import ru.bitel.bgbilling.common.BGMessageException; import bitel.billing.common.BGException; import bitel.billing.plugin.BGPluginServer; import bitel.billing.plugin.BGPluginManagerServer; import org.w3c.dom.*; import javax.servlet.http.HttpSession; import java.math.BigDecimal; import ru.bitel.frk.client.CmdProtocolClient; import java.util.Arrays; import java.util.List; import java.sql.Connection; /* Скрипт печати чека при добавлении платежа. Вешается на событие PaymentEvent ("приход платежа"). В данной версии отслеживается тип платежа и реакция происходит на какой-то из них. В зависимости от типа платежа печатается на определённый регистратор и определённого вида чек. Используется настройка регистратора из конфига плагина CashCheck. Также печатается только для определённых групп юзеров биллинга. Внимание: 1) очередь печати чеков игнорируется. 2) настройки маппинга платежей на принтеры из конфига плагина игнорируются. Это означает, что ОЧЕНЬ ЖЕЛАТЕЛЬНО, чтобы на тот тип платежей, которые здесь печатаются автоматом в конфиге плагина НЕ БЫЛО маппинга на принтер. Иначе все эти платежи помимо распечатки тут попадут также и в очередь, будут мешаться и смогут быть повторно распечатаны. Также при добавлении прихода в клиенте биллинга нельзя ставить галочку "печатать чек", иначе печать чека будет инициирована ДВАЖДЫ. Отсутствие маппинга спасёт и в этом случае - напечатать чек по галочке (как и из очереди) станет невозможно. Скрипт написан для версии 5.0 */ /** * Здесь список всех юзеров, для которых сработает автопечать при приходе платежа. */ final static int[] USERS ={1, 32, 3}; /** * Здесь выборка принтера по типу платежа. Берутся настройки из конфига плагина. */ // параметры регистратора: номер (из конфига плагина) и пароль, заполняются в методе int FR_ID; String FR_PASS; private boolean changePrinter( int paymentTypeId ) { switch( paymentTypeId ) { case 24: FR_ID = 5; FR_PASS = "12345"; return true; case 29: FR_ID = 5; FR_PASS = "12345"; return true; default: return false; } } /** * формируем объект-чек. * Добавляются сколько-то строк и одна только addPayment, ведь платёж у нас тут всегда один * и позиция, стало быть, тоже всегда одна */ private Check makeCheck( Payment payment, int paymentTypeId, Connection con ) { switch( paymentTypeId ) { case 24: BigDecimal summa = payment.getSumma(); int cid = payment.getContractID(); Check check = new Check(); check.addString( " " ); check.addString( "Телематические услуги связи(Интернет)" ); //check.addString( "Договор №: " + payment.getContractTitle() ); // догогор вытаскиваем Contract contract = new ContractManager( con ).getContractByID( cid ); if( contract != null ) { check.addString( "Договор №: " + contract.getTitle() ); } else { check.addString( "Договор неизвестный (ошибка)" ); } // параметр вытаскиваем int PARAM_ID = 3; ContractParameterManager bgParamMan = new ContractParameterManager( con ); String paramVal = bgParamMan.getStringParam( cid, PARAM_ID ); check.addString( "ФИО/Организация: "); check.addString( paramVal ); check.addString( " " ); check.addString( "Ваш текущий баланс: " + (new BalanceUtils( con )).getBalance( new Date(), cid ).toPlainString() ); check.addPayment( summa.floatValue(), "Оплата услуг интернета", 0 ); return check; case 29: BigDecimal summa = payment.getSumma(); Check check = new Check(); check.addString( "произвольная строка вид 2" ); check.addPayment( summa.floatValue(), "товар", 0 ); return check; default: return null; } } public void onEvent( event, setup, con, conSlave ) { PaymentEvent paymentEvent = (PaymentEvent)event; Payment payment = paymentEvent.getPayment(); Arrays.sort( USERS ); if( Arrays.binarySearch( USERS, payment.getUserID() ) >=0 ) { print( "CashCheck Autoprint: user id="+payment.getUserID()+", payment should be automatically printed!" ); int paymentTypeId = payment.getPaymentTypeID(); if( changePrinter( paymentTypeId ) ) { print( "CashCheck Autoprint: paymentTypeId="+paymentTypeId+", payment should be automatically printed!" ); // Получаем плагин, принтер менеджер и сам принтер пытаемся получить BGPluginServer plugin = BGPluginManagerServer.getManager().getPlugin( "ru.bitel.bgbilling.plugins.cashcheck" ); Element rootNode = null; HttpSession session = null; PrinterManager printerManager = new PrinterManager( plugin, session, rootNode ); Map printers = printerManager.getPrinterMap(); Printer printer = printers.get( FR_ID ); if ( printer == null ) { error( "CashCheck Autoprint: ККМ не настроен" ); return; } // код похож на тот, что в экшене печати чека, но в отличие от него тут мы // ничего не чекаем в очереди. надо озаботиться, чтобы в очередь не попадало. Check check = makeCheck( payment, paymentTypeId, con ); if( check != null ) { String clientsumma = check.getPaymentsum().toPlainString(); // запрос к серверу печати CmdProtocolClient client = new CmdProtocolClient( printer.getAddress(), printer.getPort() ); try { client.connect(); boolean result = client.send( "check", new Object[]{FR_PASS, clientsumma, check.getPlines()} ); if( result == false ) { error( "CashCheck Autoprint: Ошибка! ККМ сказала: " + client.getReply() ); return; } print( "CashCheck Autoprint: check was printed!" ); } catch( ConnectException e ) { error( "CashCheck Autoprint: Ошибка обмена с сервером печати ККМ: " + e.getMessage() ); } finally { try{client.disconnect();}catch( ConnectException e ){} } } else { print( "CashCheck Autoprint: makeCheck: paymentTypeId="+paymentTypeId+", payment NOT printed!" ); } } else { print( "CashCheck Autoprint: changePrinter: paymentTypeId="+paymentTypeId+", payment NOT printed!" ); } } else { print( "CashCheck Autoprint: user id="+payment.getUserID()+", payment NOT printed!" ); } }
--dimOn 13:41, 21 апреля 2011 (UTC) --dimOn 15:24, 10 мая 2011 (UTC)