Создание счета из суммы платежей по классу договоров
Материал из BiTel WiKi
Версия от 06:14, 23 марта 2010; Cromeshnic (Обсуждение | вклад)
Есть группа договоров, по которой нужно выставить один счет с позицией, равной сумме приходов на эти договора за месяц. Для этого создан отдельный договор, на котором есть только модуль bill, отдельный тип счетов и скрипт, по событию "Создан счет" заменяющий родной пустой счет на самодельный.
import java.math.*; import bitel.billing.server.contract.bean.*; import bitel.billing.server.bill.bean.*; import bitel.billing.server.util.*; import ru.bitel.bgbilling.server.util.*; //При создании счета типа bill_type если его сумма <=0, то заменяем его на счет типа bill_new_type с одной позицией - сумма приходов всех договоров в группе grp bill_mid = 6; grp=57; bill_type = 9; bill_new_type = 1; position_id = 100; position_title = "Услуги связи"; bill_manager = new BillManager(setup,con,bill_mid,Setup.getSetup().getModuleSetup(bill_mid)); created_bill_id = event.getBillId(); Bill created_bill = bill_manager.getBill(created_bill_id); if(created_bill.getTypeId()!=bill_type){ print("Не тот тип счета, выходим"); return; } if(created_bill.getSumm()>0.0){ print("Счет уже сгенерирован, прекращаем выполнение для предотвращения рекурсии"); return; } cid = event.getContractID(); cm = new ContractManager( con ); c = cm.getContractByID( event.getContractID() ); float sum = 0.01; //Определяем сумму платежей по всем связанным договорам: ps = con.prepareStatement("select sum(summa) from contract_payment cp left join contract c on cp.cid=c.id where month(cp.dt)=? and year(cp.dt)=? and c.gr&pow(2,?) >0;"); ps.setInt(1, created_bill.getMm()+1); ps.setInt(2, created_bill.getYy()); ps.setInt(3, grp); rs = ps.executeQuery(); if(rs.next()) { sum = rs.getFloat(1); } ps.close(); print(sum); print(c.getTitle()); bill_doc = new Bill(); bill_doc.setCid(cid); bill_doc.setContractTitle(created_bill.getContractTitle()); bill_doc.setCreateDate(created_bill.getCreateDate()); bill_doc.setMm(created_bill.getMm()); bill_doc.setSumm(new BigDecimal(sum)); bill_doc.setTypeId(bill_new_type); bill_doc.setTypeTitle(created_bill.getTypeTitle()); bill_doc.setUid(0); bill_doc.setYy(created_bill.getYy()); bill_doc.setAccountId(created_bill.getAccountId()); position = new Position(); position.setId(position_id); position.setName(position_title); position.setQuantity("1"); position.setSumm(""+sum); position.setUnit("шт."); position_value = new PositionValue(); position_value.setCid(cid); position_value.setName(position_title); position_value.setPosition(position); position_value.setPositionId(1); position_value.setQuantity(new BigDecimal(1)); position_value.setSumma(new BigDecimal(sum)); position_value.setUnit("шт."); position_value_list = new java.util.ArrayList(); position_value_list.add(position_value); //Проверка - сумма должна быть > 0, иначе рекурсия! if(bill_doc.getSumm()<=0.0){ bill_doc.setSumm(new BigDecimal("0.01")); } bill_manager.addBillDoc(bill_doc,position_value_list,Collections.emptyList()); //удаляем старый счет bill_manager.deleteBill(cid,created_bill_id,true);