BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 27 апр 2024, 21:05

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
СообщениеДобавлено: 12 ноя 2015, 16:26 
Не в сети
Клиент

Зарегистрирован: 10 ноя 2014, 18:38
Сообщения: 396
Карма: 0
каким классом/методом можно очистить наработку на договоре за какой-то месяц?
я так понимаю которая в contract_account и contract_balance


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 12 ноя 2015, 18:18 
Не в сети
Клиент

Зарегистрирован: 10 ноя 2014, 18:38
Сообщения: 396
Карма: 0
да и кстати что-то
PrintLog("Делаю перерасчёт для: "+cid[i]+", с даты: "+get_from_date()+" по текущий момент");
BalanceUtils balance = new BalanceUtils(con);
balance.recalculateBalance(cid[i],get_from_date());
-----------------------
ВЫВОД ПЕРЕМЕННЫХ, ЧТОБ НЕ БЫЛО СОМНЕНИЙ В НИХ ->
Accunting_recalculate_AB_B: Делаю перерасчёт для: 15578, с даты: Thu Oct 01 00:00:00 SAMT 2015 по текущий момент

отрабатывает молча и без ошибок, но и результат нулевой - перерасчёт не происходит. если его делать вручную, через модуль абонплаты - отрабатывает правильно..
-------------------------

помогите плиз... не хочется в этом случае ковырять базу напрямую ...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 12 ноя 2015, 18:37 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
balance.updateBalance(TimeUtils.convertCalendarToDate(contractDate), contract.getId());

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 12 ноя 2015, 19:28 
Не в сети
Клиент

Зарегистрирован: 10 ноя 2014, 18:38
Сообщения: 396
Карма: 0
я делаю в глобальном скрипте, по собственной выборке contract.id из mysql

и что
balance.recalculateBalance(cid[i],get_from_date(con));

что
balance.updateBalance(get_from_date(con),cid[i]);

одинаково не работает (я пытаюсь переначислить не за текущий месяц, а за предыдущий).
а случаем нечто такое в конфиге модуля не влияиет на эти классы? =>>>>

# Автоматическое переначисление абонентских плат договора при изменении их периода, количества и т.п.
# 0 - выключить переначисление, 1 - включить переначисление, 2 - включить переначисление, но выполнять только для текущего месяца
recalculate.on.service.change=2

---------------------------------------------------


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 12 ноя 2015, 19:55 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
Покажите скрипт

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 12 ноя 2015, 20:10 
Не в сети
Клиент

Зарегистрирован: 10 ноя 2014, 18:38
Сообщения: 396
Карма: 0
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.sql.ConnectionSet;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import bitel.billing.server.contract.bean.Contract;
import bitel.billing.server.contract.bean.ContractManager;
import bitel.billing.server.contract.bean.ContractStatus;
import bitel.billing.server.contract.bean.ContractStatusManager;
import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;
import bitel.billing.server.contract.bean.BalanceUtils;

/*
@galkov
скрипт выполняет перенос крайнего начисления в статусе автоблокировки на текущий месяц, перенос самого статуcа на последний месяц и перерасчёт баланса для вычета лишней абонплаты.предыдущий месяц ставится в статус, на котором ничего не начисляется, если он был = 8
баланс абонента не растёт после ухода в статус 8 (автоблокировка).
cid=15578 -> только для теста
*/


public class Accunting_recalculate_AB_B
extends GlobalScriptBase
{
// маркер для лога
private static final String ARROW = "Accunting_recalculate_AB_B: ";
private static final boolean DEBUG = true;
//
private static final int N_BLOCK = 10; // статус, в котором не ведутся начисления за услуги абонента (блокировка)
private static final int BLOCK = 8; // статус, в котором ведутся начисления за услуги абонента (автоблокировка)

private static final int SERVER = 0; // автор правки.

@Override
public void execute( Setup setup1, ConnectionSet connectionSet2 )
throws Exception
{
Connection con = connectionSet2.getConnection();
int[] cid = get_cids(con); //выбираем список договоров, которые в автоблокировке прошлый и этот месяц.
ContractStatusManager cm = new ContractStatusManager( con );
for (int i = 0; i < cid.length; i++)
{
if (DEBUG) { PrintLog("CID: "+cid[i]); }
// гасим статуc предыдущего месяца в 10
STATUS_change(cid[i], cm, N_BLOCK,con);
if (DEBUG) {PrintLog(BLOCK+" -> "+N_BLOCK);}

// делаем перерасчёт баланса с начала предыдущего месяца этому абоненту.
PrintLog("Делаю перерасчёт для: "+cid[i]+", с даты: "+get_from_date(con)+" по текущий момент");


// clear_acount(cid[i],get_from_date(con), con); // это обход неработы recalculateBalance совместно с общим стандартным начислением перед скриптом.
BalanceUtils balance = new BalanceUtils(con);
// balance.recalculateBalance(cid[i],get_from_date(con));
balance.updateBalance(get_from_date(con),cid[i]);

}
}



// --------------------------------------------------------------------------------------

private static void clear_acount(int cid1, java.util.Date dt2, Connection conn3)
{
String SQL = "delete from contract_account where (cid= "+cid1+") and (yy=YEAR(DATE_SUB(CURDATE(), INTERVAL 1 MONTH))) and (mm= MONTH(DATE_SUB(CURDATE(), INTERVAL 1 MONTH)))";
String SQL_1 = "update contract_balance set summa3=0.00 where (cid= "+cid1+") and (yy=YEAR(DATE_SUB(CURDATE(), INTERVAL 1 MONTH))) and (mm= MONTH(DATE_SUB(CURDATE(), INTERVAL 1 MONTH)))";
if (DEBUG) { PrintLog("Удаляю наработку SQL: "+SQL); }
if (DEBUG) { PrintLog("Удаляю наработку SQL: "+SQL_1); }
try
{
Statement stmt = conn3.createStatement();
stmt.executeUpdate(SQL);
stmt.executeUpdate(SQL_1);
}
catch (Exception e) { e.printStackTrace(); }
}

private static void STATUS_change(int cid1, ContractStatusManager cm2, int St3, Connection con4)
{
try
{
// Меняем статус
ContractStatus ncs = new ContractStatus();
ncs.setContractId(cid1);
ncs.setComment("Статус измёнён биллингом автоматически. Алгоритм №3: "+ARROW);
ncs.setDateFrom(get_from_date(con4));
ncs.setDateTo(get_to_date(con4));
ncs.setStatus(St3);
cm2.changeStatus(ncs, SERVER, true); // 1 - код пользователя, от лица которого производится изменение состояния
}
catch (Exception e) { e.printStackTrace(); }
}


private static java.util.Date get_to_date(Connection conn1)
{
java.util.Date asd = null;
ResultSet res = null;
Statement stmt = null;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try
{
stmt = conn1.createStatement();
// последний день предыдущего месяца.
String SQL = "select LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 1 MONTH)) as last_day_last_month";
res = stmt.executeQuery(SQL);
if (res.next()) { asd = format.parse(res.getString("last_day_last_month")); }
}
catch (Exception e) { e.printStackTrace(); }
finally
{
try { if (stmt != null) stmt.close(); } catch (SQLException e) { e.printStackTrace(); }
try { if (res != null) res.close(); } catch (SQLException e) { e.printStackTrace(); }
}
if (DEBUG) { PrintLog("последний день предыдущего месяца: "+asd); }
return asd;
}


private static java.util.Date get_from_date(Connection conn1)
{
java.util.Date asd = null;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Statement stmt = null;
ResultSet res = null;
// первый день предыдущего месяца
try
{
stmt = conn1.createStatement();
String SQL = "select DATE_ADD(LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 2 MONTH)), INTERVAL 1 DAY) as first_day_last_month";
res = stmt.executeQuery(SQL);
if (res.next()) { asd = format.parse(res.getString("first_day_last_month")); }
}
catch (Exception e) { e.printStackTrace(); }
finally
{
try { if (stmt != null) stmt.close(); } catch (SQLException e) { e.printStackTrace(); }
try { if (res != null) res.close(); } catch (SQLException e) { e.printStackTrace(); }
}
if (DEBUG) { PrintLog("первый день предыдущего месяца: "+asd); }
return asd;
}



private static int[] get_cids(Connection con1)
{
// список CIDов абонентов, у которых статус автоблокировка ПОКА тянется 2а месяца; ТЕКУЩИЙ(!) и предыдущий.
// and contract_status.cid=15578 -> только для теста переделать фигню с месяцем - не универсально!!!
String SQL = "select contract_status.cid as cid from contract_status where (status ="+BLOCK+") and ((date2>NOW() or (date2 is NULL))) and (MONTH(NOW())-MONTH(date1)=1) and contract_status.cid=15578 order by cid";
if (DEBUG) { PrintLog("SQL"+SQL); }
Statement stmt = null;
int[] arr = null;
int i = 0;
try
{
stmt = con1.createStatement();

ResultSet res = stmt.executeQuery(SQL);
if (res.next()) { i++; } // число cid-ов
res.beforeFirst();
arr = new int[i];
i = 0;
while (res.next()) { arr[i] = Integer.valueOf(res.getString("cid")); }

}
catch (Exception e) { e.printStackTrace(); }

return arr;
}


private static void PrintLog(String Str) { try { System.out.println(ARROW+Str); } catch (Exception e) { e.printStackTrace(); } }

}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 12 ноя 2015, 20:33 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
мама

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 12 ноя 2015, 20:39 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
Сразу вопрос
Цитата:
скрипт выполняет перенос крайнего начисления в статусе автоблокировки на текущий месяц, перенос самого статуcа на последний месяц и перерасчёт баланса для вычета лишней абонплаты.предыдущий месяц ставится в статус, на котором ничего не начисляется, если он был = 8
баланс абонента не растёт после ухода в статус 8 (автоблокировка).

Для чего это?
Вы хотите видеть текущий баланс абонента в скриптах?
Вас бухгалтерия за это не гладит по головке? О.о

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 12 ноя 2015, 20:54 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
И вне зависимости от вашего ответа на предыдущее сообщение
Код:
import bitel.billing.common.TimeUtils;
import java.util.Calendar;
....
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MONTH, -1);
        print("StartDate: " + TimeUtils.convertCalendarToDate(TimeUtils.getStartMonth(cal)));
        print("EndDate: " + TimeUtils.convertCalendarToDate(TimeUtils.getEndMonth(cal)));

Код:
StartDate: Thu Oct 01 17:52:43 MSK 2015
 EndDate: Sat Oct 31 17:52:43 MSK 2015

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 ноя 2015, 11:38 
Не в сети
Клиент

Зарегистрирован: 10 ноя 2014, 18:38
Сообщения: 396
Карма: 0
Да вот это вопрос такой... "ну надо!" (с)
Нужно, чтобы у абонента в пользовательском статусе абонплата за месяц, после остановки услуг расчитывалась, останавливалась и переносилась из месяца в месяц (выставлять её по бухгалтерии нужно тем месяцем, в котором абонент заплатит за услугу). а так он видит сколько нужно заплатить, чтобы услуга работала (абоненту надо заплатить полную абонентскую плату по договору за месяц, а не вывести баланс в 0, так как при выведении в 0 произойдёт расчёт абонплаты и она снимется не пропорционально дням, а за весь месяц(условие тарифа), в итоге при балансе -100 руб и абонплате 500 руб абонент, заплатив 100 рублей получит на балансе -400 рублей... вопросов у абонента будет МОРЕ и даже правильные ответы на них его не удовлетворят.).

потом скрипт работает... можно сказать нормально
не работает только блок с перерасчётом стандартными классами, приходится лезть в базу руками. вопрос только в этом... для оптимизации код написанного на коленке в хорошо читаемое потом... скажем через полгода. )

Phricker писал(а):
Сразу вопрос
Цитата:
скрипт выполняет перенос крайнего начисления в статусе автоблокировки на текущий месяц, перенос самого статуcа на последний месяц и перерасчёт баланса для вычета лишней абонплаты.предыдущий месяц ставится в статус, на котором ничего не начисляется, если он был = 8
баланс абонента не растёт после ухода в статус 8 (автоблокировка).

Для чего это?
Вы хотите видеть текущий баланс абонента в скриптах?
Вас бухгалтерия за это не гладит по головке? О.о


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 ноя 2015, 11:56 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
Еще один которому нужно чтобы модуль NPAY требовал оплаты не до конца месяца и не в ноль, а сумму по тарифу :)


Попробуйте
Код:
balance.setBalanceFromAccount(cid, get_from_date(con));

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 ноя 2015, 12:03 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
npay.jar
ActionClearAccount.class

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 ноя 2015, 14:49 
Не в сети
Клиент

Зарегистрирован: 10 ноя 2014, 18:38
Сообщения: 396
Карма: 0
блин.. работает.. причём и updateBalance и setBalanceFromAccount и recalculateBalance ...просто я не осознал момент... мне ж нужен не только переасчёт баланса, мне нужен перерасчёт начислений за предыдущий месяц, так как был статус, в котором начисления производятся, а меняется он на статус, в котором нет начислений и после этого - нужно инициировать расчёт начислений предыдущего месяца, т.е. как минимум - очистка начислений за предыдущий месяц в (в таблице contract_account) а как максимум - честный расчёт начислений... эквивалент моей ручной коректировки в clear_acount()


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
POWERED_BY
Русская поддержка phpBB
[ Time : 0.080s | 44 Queries | GZIP : On ]