Не знаю, что имел ввиду
skyb, но мне в своё время не удалось опциями настроить нужное нам поведение, поэтому пришлось писать скрипт... Специальных метод API не нашёл, поэтому работаю через базу:
Код:
package ru.xxx.contract.tasks;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import ru.bitel.bgbilling.kernel.task.server.TaskBase;
public class ClearLockOfDeferredPayment extends TaskBase {
private int mode;
private String groups;
@Override
public String getDescription() {
return this.defaultDescription + "Очистка блокировки отложенного платежа по положительному балансу";
}
@Override
protected boolean initTask() {
mode = taskSetup.getInt("mode", 0);
groups = taskSetup.get("groups", "");
return true;
}
@Override
protected void executeTask() {
Connection conn = setup.getDBConnectionFromPool();
PreparedStatement ps;
try {
String query = "" +
" SELECT" +
" c.id," +
" c.title," +
" m.mode," +
" m.cnt," +
" b.summa1 + b.summa2 - b.summa3 - b.summa4 AS balance" +
" FROM" +
" contract c," +
" contract_limit_manage_mode m," +
" contract_balance b" +
" WHERE" +
" c.status != 2 AND" +
" c.id = m.cid AND" +
" (m.mode > 0 OR m.cnt > 0) AND" +
" c.id = b.cid AND" +
" b.yy = YEAR(NOW()) AND" +
" b.mm = MONTH(NOW()) AND" +
" b.summa1 + b.summa2 - b.summa3 - b.summa4 >= 0";
if (!groups.isEmpty()) {
query += " AND (";
for (String gid : groups.split(",")) {
query += " (c.gr >> " + gid + ") & 1" + " OR";
}
query += " 0=1 )";
}
ps = conn.prepareStatement(query);
ps.execute();
ResultSet rs = ps.getResultSet();
PreparedStatement psUpd = conn.prepareStatement("UPDATE contract_limit_manage_mode SET mode = 0, cnt = 0 WHERE cid = ?");
PreparedStatement psIns = conn.prepareStatement("INSERT INTO log_contract_limit_manage_mode VALUES (NOW(), 0, 0, ?)");
if (rs.next()) {
do {
int id = rs.getInt("id");
String contract = rs.getString("title");
int mode = rs.getInt("mode");
int cnt = rs.getInt("cnt");
BigDecimal balance = rs.getBigDecimal("balance");
psUpd.setInt(1, id);
psIns.setInt(1, id);
try {
if (this.mode == 1) {
psUpd.executeUpdate();
psIns.executeUpdate();
}
log.info(contract + ": mode=" + mode + ", cnt=" + cnt + ", balance=" + balance + ", result=cleared.");
} catch (SQLException e) {
log.error(contract + ": mode=" + mode + ", cnt=" + cnt + ", balance=" + balance + ", result=" + e.getMessage());
}
} while(rs.next());
} else {
log.info("The contracts with a locked deferred payment not found.");
}
psIns.close();
ps.close();
} catch (SQLException e) {
log.error("Cannot get contracts with a locked deferred payment: " + e.getMessage());
}
try {
conn.close();
} catch (SQLException e) {
}
}
}
Скрипт сделан в виде задачи для планировщика, но лучше переделать в глобальный скрипт поведения. Скрипт разблокирует возможность понижения, если баланс договора стал больше нуля.