Создание счета из суммы платежей по классу договоров

Материал из BiTel WiKi

Перейти к: навигация, поиск

Есть группа договоров, по которой нужно выставить один счет с позицией, равной сумме приходов на эти договора за месяц. Для этого создан отдельный договор, на котором есть только модуль 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);
Личные инструменты