forum.bitel.ru http://forum.bitel.ru/ |
|
подскажите каким классом+методом очистить наработку? http://forum.bitel.ru/viewtopic.php?f=19&t=11092 |
Страница 1 из 1 |
Автор: | Galkov [ 12 ноя 2015, 16:26 ] |
Заголовок сообщения: | подскажите каким классом+методом очистить наработку? |
каким классом/методом можно очистить наработку на договоре за какой-то месяц? я так понимаю которая в contract_account и contract_balance |
Автор: | Galkov [ 12 ноя 2015, 18:18 ] |
Заголовок сообщения: | Re: подскажите каким классом+методом очистить наработку? |
да и кстати что-то 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 по текущий момент отрабатывает молча и без ошибок, но и результат нулевой - перерасчёт не происходит. если его делать вручную, через модуль абонплаты - отрабатывает правильно.. ------------------------- помогите плиз... не хочется в этом случае ковырять базу напрямую ... |
Автор: | Phricker [ 12 ноя 2015, 18:37 ] |
Заголовок сообщения: | Re: подскажите каким классом+методом очистить наработку? |
balance.updateBalance(TimeUtils.convertCalendarToDate(contractDate), contract.getId()); |
Автор: | Galkov [ 12 ноя 2015, 19:28 ] |
Заголовок сообщения: | Re: подскажите каким классом+методом очистить наработку? |
я делаю в глобальном скрипте, по собственной выборке 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 --------------------------------------------------- |
Автор: | Phricker [ 12 ноя 2015, 19:55 ] |
Заголовок сообщения: | Re: подскажите каким классом+методом очистить наработку? |
Покажите скрипт |
Автор: | Galkov [ 12 ноя 2015, 20:10 ] |
Заголовок сообщения: | Re: подскажите каким классом+методом очистить наработку? |
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(); } } } |
Автор: | Phricker [ 12 ноя 2015, 20:33 ] |
Заголовок сообщения: | Re: подскажите каким классом+методом очистить наработку? |
мама |
Автор: | Phricker [ 12 ноя 2015, 20:39 ] |
Заголовок сообщения: | Re: подскажите каким классом+методом очистить наработку? |
Сразу вопрос Цитата: скрипт выполняет перенос крайнего начисления в статусе автоблокировки на текущий месяц, перенос самого статуcа на последний месяц и перерасчёт баланса для вычета лишней абонплаты.предыдущий месяц ставится в статус, на котором ничего не начисляется, если он был = 8 баланс абонента не растёт после ухода в статус 8 (автоблокировка). Для чего это? Вы хотите видеть текущий баланс абонента в скриптах? Вас бухгалтерия за это не гладит по головке? О.о |
Автор: | Phricker [ 12 ноя 2015, 20:54 ] |
Заголовок сообщения: | Re: подскажите каким классом+методом очистить наработку? |
И вне зависимости от вашего ответа на предыдущее сообщение Код: 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 |
Автор: | Galkov [ 13 ноя 2015, 11:38 ] |
Заголовок сообщения: | Re: подскажите каким классом+методом очистить наработку? |
Да вот это вопрос такой... "ну надо!" (с) Нужно, чтобы у абонента в пользовательском статусе абонплата за месяц, после остановки услуг расчитывалась, останавливалась и переносилась из месяца в месяц (выставлять её по бухгалтерии нужно тем месяцем, в котором абонент заплатит за услугу). а так он видит сколько нужно заплатить, чтобы услуга работала (абоненту надо заплатить полную абонентскую плату по договору за месяц, а не вывести баланс в 0, так как при выведении в 0 произойдёт расчёт абонплаты и она снимется не пропорционально дням, а за весь месяц(условие тарифа), в итоге при балансе -100 руб и абонплате 500 руб абонент, заплатив 100 рублей получит на балансе -400 рублей... вопросов у абонента будет МОРЕ и даже правильные ответы на них его не удовлетворят.). потом скрипт работает... можно сказать нормально не работает только блок с перерасчётом стандартными классами, приходится лезть в базу руками. вопрос только в этом... для оптимизации код написанного на коленке в хорошо читаемое потом... скажем через полгода. ) Phricker писал(а): Сразу вопрос
Цитата: скрипт выполняет перенос крайнего начисления в статусе автоблокировки на текущий месяц, перенос самого статуcа на последний месяц и перерасчёт баланса для вычета лишней абонплаты.предыдущий месяц ставится в статус, на котором ничего не начисляется, если он был = 8 баланс абонента не растёт после ухода в статус 8 (автоблокировка). Для чего это? Вы хотите видеть текущий баланс абонента в скриптах? Вас бухгалтерия за это не гладит по головке? О.о |
Автор: | Phricker [ 13 ноя 2015, 11:56 ] |
Заголовок сообщения: | Re: подскажите каким классом+методом очистить наработку? |
Еще один которому нужно чтобы модуль NPAY требовал оплаты не до конца месяца и не в ноль, а сумму по тарифу Попробуйте Код: balance.setBalanceFromAccount(cid, get_from_date(con));
|
Автор: | Phricker [ 13 ноя 2015, 12:03 ] |
Заголовок сообщения: | Re: подскажите каким классом+методом очистить наработку? |
npay.jar ActionClearAccount.class |
Автор: | Galkov [ 13 ноя 2015, 14:49 ] |
Заголовок сообщения: | Re: подскажите каким классом+методом очистить наработку? |
блин.. работает.. причём и updateBalance и setBalanceFromAccount и recalculateBalance ...просто я не осознал момент... мне ж нужен не только переасчёт баланса, мне нужен перерасчёт начислений за предыдущий месяц, так как был статус, в котором начисления производятся, а меняется он на статус, в котором нет начислений и после этого - нужно инициировать расчёт начислений предыдущего месяца, т.е. как минимум - очистка начислений за предыдущий месяц в (в таблице contract_account) а как максимум - честный расчёт начислений... эквивалент моей ручной коректировки в clear_acount() |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |