Извините, что встреваю в ваш спор, но в преддверии 6.1 решил навести порядок в старых скриптах, переписать то, что писалось временно (но как оказалось проработало очень долго) в динкод (да да. лучше поздно чем никогда).
Собственно есть скрипт который заносит расход, на определенных типах платежах, в сумме равной сумме платежа.
Решил воспользоваться советами из темы и бросать события об изменении баланса (ранее событий не бросалось просто вызывалось bu.updateBalance();
Код:
public class addChargeForInstall
extends EventScriptBase
{
//ID платежей для которых заносить расходы
private final List<Integer> PAY_FOR_CHARGE = Arrays.asList(14,23,25,27,28,31,29);
@Override
public void onEvent( Event event, Setup setup, ConnectionSet connectionSet )
throws Exception
{
Connection con = connectionSet.getConnection();
int cid = event.getContractId();
Payment payment = ((PaymentEvent) event).getPayment();
int tpid = payment.getTypeId();
if(PAY_FOR_CHARGE.contains(tpid)){
BalanceUtils bu = new BalanceUtils( con );
ChargeManager chm = new ChargeManager( con );
BigDecimal paySum = payment.getSumma();
Date payDate = payment.getPaymentDate();
//Карта соотношений ID платежей к ID расходов
Map<Integer,Integer> chargeMap = new HashMap();
chargeMap.put(14,8);
chargeMap.put(23,21);
chargeMap.put(25,22);
chargeMap.put(27,23);
chargeMap.put(28,24);
chargeMap.put(31,28);
chargeMap.put(29,25);
Charge c = new Charge();
c.setContractId( cid );
c.setChargeDate( payDate );
c.setTypeId(chargeMap.get(tpid));
c.setUserId(User.USER_SERVER);
c.setSumma(paySum);
c.setComment("Автоматическое занесение расхода за установку");
chm.updateCharge( c );
bu.updateBalance(payDate, cid);
EventProcessor.getInstance().publishAfterCommit(new ChargeEvent(User.USER_SERVER, c));
EventProcessor.getInstance().publishAfterCommit(new ContractBalanceChangedEvent(cid, c.getSumma()));
}
}
}
Мой вопрос в следующем.
Если писать
Код:
chm.updateCharge( c );
bu.updateBalance(payDate, cid);
EventProcessor.getInstance().publishAfterCommit(new ChargeEvent(User.USER_SERVER, c));
EventProcessor.getInstance().publishAfterCommit(new ContractBalanceChangedEvent(cid, c.getSumma()));
То произойдет добавление 2 (!двух) расходов.
Если же писать
Код:
//chm.updateCharge( c );
bu.updateBalance(payDate, cid);
EventProcessor.getInstance().publishAfterCommit(new ChargeEvent(User.USER_SERVER, c));
EventProcessor.getInstance().publishAfterCommit(new ContractBalanceChangedEvent(cid, c.getSumma()));
То все в порядке, добавляется один расход и все замечательно.
И теперь меня интересует то ли я дурак, то ли я что-то упускаю и все равно дурак.
У вас так же прописано для платежей
Код:
pm.updatePayment(payment);
eventProc.publish(new PaymentEvent(user, payment));
eventProc.publish( new ContractBalanceChangedEvent(cid, payment.getSumma()) );
и судя по всему никаких двойных платежей нет.
В чем же прикол у меня?