Модификация приходящего платежа (снятие процента)
Материал из BiTel WiKi
Динамический код на событие "приход платежа". Позволяет снять с приходящего платежа процент. В данном примере снимается 5% за платежи, приходящие через систему Assist.
package ru.qwerty; import java.math.BigDecimal; import java.sql.Connection; import ru.bitel.bgbilling.kernel.contract.balance.common.bean.Payment; import ru.bitel.bgbilling.kernel.contract.balance.server.bean.PaymentDao; import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase; import ru.bitel.bgbilling.server.util.ServerUtils; import ru.bitel.bgbilling.server.util.Setup; import ru.bitel.common.sql.ConnectionSet; import bitel.billing.server.contract.bean.BalanceUtils; import bitel.billing.server.contract.bean.Contract; import bitel.billing.server.contract.bean.ContractManager; /** * Событие на приход платежа (асинхронное). * Вычитает из платежа нужный процент и модифицирует комментарий. * @author dimon */ public class AssistPayment extends EventScriptBase<ru.bitel.bgbilling.kernel.contract.balance.server.event.PaymentEvent> { /** тип платежа, который будет обрабатываться */ private static int PAYMENT_TYPE = 33; /** множитель суммы платежа */ private static BigDecimal MULTIPLIER = new BigDecimal("0.95"); /** шаблон комментария платежа (первый параметр %s - оригинальная сумма, второй - оригинальный комментарий, знак процента должен дублироваться) */ private static String COMMENT = "Платёж %s р. (комиссия 5%%) - %s"; @Override public void onEvent( ru.bitel.bgbilling.kernel.contract.balance.server.event.PaymentEvent event, Setup setup, ConnectionSet connectionSet ) throws Exception { Payment contractPayment = event.getPayment(); if( contractPayment.getTypeId() == PAYMENT_TYPE && !event.isEditMode() ) { Connection con = connectionSet.getConnection(); BigDecimal originalSumm = contractPayment.getSum(); String originalComment = contractPayment.getComment(); contractPayment.setSum(originalSumm.multiply(MULTIPLIER)); contractPayment.setComment(String.format(COMMENT, originalSumm, originalComment)); new PaymentDao( con ).update( contractPayment ); // обновление баланса Contract contract = new ContractManager( con ).getContractById( contractPayment.getContractId() ); ServerUtils.commitConnection( con ); // во избежание косяка с необновлением баланса при параллельных транзакциях коммитим после изменения платежа/расхода {213fc512-b1b2-4787-926c-a5bc44eb615a} new BalanceUtils( con ).updateBalance( contractPayment.getDate(), contract ); ServerUtils.commitConnection( con ); //EventProcessor.getInstance().publish( new PaymentEvent( User.USER_SERVER, contractPayment ) ); //EventProcessor.getInstance().publish( new ContractBalanceChangedEvent( contract.getId(), contractPayment.getSum() ) ); } } }