у нас пока только один)
Код:
//Отправка СМС с напоминанием о приближающейся блокировке
import bitel.billing.server.contract.bean.BalanceUtils;
import bitel.billing.server.contract.bean.ContractStatus;
import bitel.billing.server.contract.bean.ContractStatusManager;
//import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import ru.bitel.bgbilling.modules.npay.server.Calculator;
import java.text.SimpleDateFormat;
import java.net.*;
import java.io.*;
public void main( setup, con, conSlave )
{
//Начало функции подсчета суммы оплаты за n-количество дней
public static double payday (StartDate, int days) {
double result = 0;//переменная в которой будет содержаться результат
payday = 0;
paymonth = 0;
paymonthtoday = 0;
String DateQuery = StartDate;
for (int i = 0; i < days; i++)
{
//Достаем сумму списания в день на сегодня
querytoday = "SELECT ROUND(SUM(REPLACE(data,'type&1%cost&',''))/EXTRACT(DAY FROM LAST_DAY('"+DateQuery+"')),3) as ap FROM module_tariff_tree as a " +
"LEFT JOIN mtree_node AS b ON (a.id=b.mtree_id) " +
"LEFT JOIN contract_tariff AS c ON (c.tpid=a.tree_id) " +
"WHERE (a.mid=7)AND(type LIKE \"%cos%t\")AND(c.cid="+cid+")AND(c.date1<='"+DateQuery+"')AND((c.date2 is NULL)OR(c.date2>='"+DateQuery+"'))AND(type='day_cost')";
PreparedStatement psSelect = conSlave.prepareStatement(querytoday);
ResultSet rs = psSelect.executeQuery();
while (rs.next())
{
payday = rs.getDouble(1);
}
//Достаем сумму списания в месяц на сегодня
querytoday = "SELECT IFNULL(ROUND(SUM(REPLACE(data,'type&0%cost&',''))/EXTRACT(DAY FROM LAST_DAY('"+DateQuery+"')),3),0) as ap FROM module_tariff_tree as a " +
"LEFT JOIN mtree_node AS b ON (a.id=b.mtree_id) " +
"LEFT JOIN contract_tariff AS c ON (c.tpid=a.tree_id) " +
"WHERE (a.mid=7)AND(type LIKE \"%cos%t\")AND(c.cid="+cid+")AND(c.date1<='"+DateQuery+"')AND((c.date2 is NULL)OR(c.date2>='"+DateQuery+"'))AND(type='month_cost')AND(DAYOFMONTH('"+DateQuery+"')=1)";
PreparedStatement psSelect = conSlave.prepareStatement(querytoday);
ResultSet rs = psSelect.executeQuery();
while (rs.next())
{
paymonth = rs.getDouble(1);
}
result = result + payday + paymonth;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
c.setTime(sdf.parse(DateQuery));
c.add(Calendar.DATE, 1); // +1 день
DateQuery = sdf.format(c.getTime()); // Новая дата
}
return result;//возвращаю его
}
//Конец функции подсчета суммы оплаты за n-количество дней
//Достаем сегодняшнюю дату
Date currentDate = new Date();
//Достаем параметры договоров
String query = "SELECT a.id, b.value, c.summa1+c.summa2-c.summa3-c.summa4, SUBSTRING(f.title,1,1), CONCAT(e.house, '', e.frac), d.flat " +
"FROM contract AS a " +
"LEFT JOIN contract_parameter_type_phone AS b ON (b.cid=a.id) " +
"LEFT JOIN contract_balance AS c ON ((c.cid=a.id) AND (c.mm=month(now())) AND (c.yy=year(now()))) " +
"LEFT JOIN contract_parameter_type_2 AS d ON (d.cid=a.id) " +
"LEFT JOIN address_house AS e ON (d.hid=e.id) " +
"LEFT JOIN address_street AS f ON (f.id=e.streetid) " +
"LEFT JOIN contract_module AS g ON (g.cid=a.id) " +
"LEFT JOIN ipn_contract_status_9 AS h ON (h.cid=a.id) " +
"WHERE (a.status=0) AND NOT ISNULL(b.value) AND ((c.summa1+c.summa2-c.summa3-c.summa4)>0) AND (g.mid=9) AND (h.status=0)";
PreparedStatement contractPs = con.prepareStatement( query );
ResultSet contractRs = contractPs.executeQuery();
int cid;
String ContractPhone = "";
int ksms = 0;
int ksms1 = 0;
int ksms5 = 0;
while ( contractRs.next() )
{
cid = contractRs.getInt( 1 );
//print (cid +" start");
ContractPhone = contractRs.getString( 2 );
ContractPhone = ContractPhone.replace("; ", ",");//Заменяем точку с запятой и пробел на запятую (требование СМС пилота)
balance = contractRs.getDouble( 3 );
Street = contractRs.getString(4);
H = contractRs.getBytes(5);
String House = new String(H,"cp1251");
Flat = contractRs.getString(6);
Adress = Street + ". " + House + "-" + Flat;
SMSText2 = "";
//Применяем к дате маску для использования в СМС-Пилоте
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
senddt = sdf.format(currentDate);
//Забираем суммы оплат на ближайшие дни
double paytoday = payday(senddt,1);//Сумма оплаты на 1 день
double payto2day = payday(senddt,2);//Сумма оплаты на 2 дня
//double payto3day = payday(senddt,3);//Сумма оплаты на 3 дня
double payto5day = payday(senddt,5);//Сумма оплаты на 5 дней
double payto6day = payday(senddt,6);//Сумма оплаты на 6 дней
if (balance < payto2day && balance >=paytoday) {
SMSText2 = URLEncoder.encode(" руб. До блокировки 1 день.", "UTF-8") + "&to=";
ksms1++;;
}
/* else if (balance < payto3day && balance >= payto2day) {
SMSText2 = URLEncoder.encode(" руб. До блокировки 2 дня.", "UTF-8") + "&to=";
}*/
else if (balance < payto6day && balance >= payto5day) {
SMSText2 = URLEncoder.encode(" руб. До блокировки 5 дней.", "UTF-8") + "&to=";
ksms5++;
}
if (SMSText2 != "") {
balance = balance - paytoday;
balance = Math.rint(100.0 * balance) / 100.0;
SMSSend = "";
SMSSender = "Fialka";
APIKey = "";
SMSSend = "http://smspilot.ru/api.php?send=" + URLEncoder.encode("Баланс ", "UTF-8") + URLEncoder.encode(Adress, "UTF-8") + ": " + balance + SMSText2 + ContractPhone + "&from=" + SMSSender + "&apikey=" + APIKey + "&send_datetime=" + senddt + " 05:00:00";
// -- START SENDING SMS MESSAGE --
URL url = new URL(SMSSend);
URLConnection c = url.openConnection();
BufferedReader in = new BufferedReader(
new InputStreamReader(
c.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
// -- END SENDING SMS MESSAGE --
ksms++;
}
}
print("Кол-во отправленных СМСок " +ksms );
print("Из них:");
print("1 день " +ksms1 );
print("5 дней " +ksms5 );
contractRs.close();
contractPs.close();
}