forum.bitel.ru
http://forum.bitel.ru/

Блокировка управлением лимита
http://forum.bitel.ru/viewtopic.php?f=19&t=10836
Страница 1 из 1

Автор:  optimous [ 30 авг 2015, 17:16 ]
Заголовок сообщения:  Блокировка управлением лимита

Доброго дня.

Стандартная ситуация: клиент берет обещанный платеж, не оплачивает его вовремя, сервер после определенного времени подтягивает лимит снова до 0.
Позже клиент оплачивает этот платеж, но сервер не дает снова абоненту понизить лимит, т.к. возможность понижения заблокирована и нужно лезть в админку для принудительного деблокинга этого режима.
Вопрос: есть ли возможность где-то опционно указать, что при поступлении достаточного платежа нужно разблокировать возможность понижения лимита? Или может кто подскажет метод api соответствующий?

Автор:  skyb [ 31 авг 2015, 07:38 ]
Заголовок сообщения:  Re: Блокировка управлением лимита

Код:
#коды групп договоров для которых действует данная настройка, через ',' (чтобы узнать код группы нажмите Ctrl+i в справочнике
#групп при выбранной строке таблицы)
contract.limit.1.groups=4
#максимальное количество не оплаченных(не возвратившихся) понижений
#при котором клиенту будет доступно понижение, при 0 клиент не сможет выполнять
#понижение до тех пор пока будет хотя бы одно не оплаченное
contract.limit.1.maxnotpayoffed=0
#максимальное количество частично оплаченных понижений
#при котором клиенту будет доступно понижение (0-1, частично оплаченное понижение
#может быть только одно)
contract.limit.1.maxpartialpayoffed=0
#количество просроченных платежей после последней разблокировки
#после которых доступ к понижению будет заблокирован
contract.limit.1.maxexpiredforblock=0
#дни от до
contract.limit.1.mindays=2
contract.limit.1.maxdays=2
#сумма от до
contract.limit.1.minsumm=30
contract.limit.1.maxsumm=200
#нижний порог лимита при понижении клиентом (по умолчанию -100)
#т.е ниже этого порога клиент понизить не сможет
contract.limit.1.minlimit=-200

Автор:  vkulakov [ 31 авг 2015, 12:26 ]
Заголовок сообщения:  Re: Блокировка управлением лимита

Не знаю, что имел ввиду 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) {
      }
   }
}

Скрипт сделан в виде задачи для планировщика, но лучше переделать в глобальный скрипт поведения. Скрипт разблокирует возможность понижения, если баланс договора стал больше нуля.

Автор:  optimous [ 31 авг 2015, 17:31 ]
Заголовок сообщения:  Re: Блокировка управлением лимита

skyb писал(а):
Код:
#коды групп договоров для которых действует данная настройка, через ',' (чтобы узнать код группы нажмите Ctrl+i в справочнике
#групп при выбранной строке таблицы)
contract.limit.1.groups=4
#максимальное количество не оплаченных(не возвратившихся) понижений
#при котором клиенту будет доступно понижение, при 0 клиент не сможет выполнять
#понижение до тех пор пока будет хотя бы одно не оплаченное
contract.limit.1.maxnotpayoffed=0
#максимальное количество частично оплаченных понижений
#при котором клиенту будет доступно понижение (0-1, частично оплаченное понижение
#может быть только одно)
contract.limit.1.maxpartialpayoffed=0
#количество просроченных платежей после последней разблокировки
#после которых доступ к понижению будет заблокирован
contract.limit.1.maxexpiredforblock=0
#дни от до
contract.limit.1.mindays=2
contract.limit.1.maxdays=2
#сумма от до
contract.limit.1.minsumm=30
contract.limit.1.maxsumm=200
#нижний порог лимита при понижении клиентом (по умолчанию -100)
#т.е ниже этого порога клиент понизить не сможет
contract.limit.1.minlimit=-200


в вашей схеме клиент может брать несколько раз подряд обещанный платеж, не принося реальных денег, у нас политика пожестче )
А когда у абонента лимит улетел ниже -200, вы как регулируете ситуацию? Закрываете договор?

Автор:  optimous [ 31 авг 2015, 17:34 ]
Заголовок сообщения:  Re: Блокировка управлением лимита

vkulakov писал(а):
Не знаю, что имел ввиду skyb, но мне в своё время не удалось опциями настроить нужное нам поведение, поэтому пришлось писать скрипт... Специальных метод API не нашёл, поэтому работаю через базу:

Скрипт сделан в виде задачи для планировщика, но лучше переделать в глобальный скрипт поведения. Скрипт разблокирует возможность понижения, если баланс договора стал больше нуля.


Спасибо, попробую ваш скрипт на досуге

Автор:  skyb [ 01 сен 2015, 08:10 ]
Заголовок сообщения:  Re: Блокировка управлением лимита

Да договор закрывается, это базовый пример, я тоже переписывал обещанный платеж в лк, там была совершенно другая логика зашита

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/