Примеры скриптов CashCheck
Материал из BiTel WiKi
Версия от 16:50, 22 марта 2011; DimOn (Обсуждение | вклад)
Готовый скрипт с двумя действиями
Демонстрация того, как вытащить какой-либо параметр договора и как в подвал чека вытащить баланс.
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 ){} } } }