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

Минимальная сумма платежа равная абонентки
http://forum.bitel.ru/viewtopic.php?f=16&t=11347
Страница 1 из 1

Автор:  telesystem [ 17 фев 2016, 13:45 ]
Заголовок сообщения:  Минимальная сумма платежа равная абонентки

Добрый день, пытаемся реализовать схему, с минимальной суммой платежка для разблокировки договора равной абонентской плате (ну или абонентской плате минус остаток заблокированного депозита), методами биллинга можно установить только фиксированную сумму на модуль, не совсем то что нужно.
Подскажите может есть у кого реализация данной задачи ?

Автор:  stark [ 17 фев 2016, 14:35 ]
Заголовок сообщения:  Re: Минимальная сумма платежа равная абонентки

Там есть событие, можно свою сумму в скрипте выставить. Но возможно будут проблемы с ее вычислением.

Автор:  Phricker [ 17 фев 2016, 16:20 ]
Заголовок сообщения:  Re: Минимальная сумма платежа равная абонентки

Версии?

Автор:  Phricker [ 17 фев 2016, 16:26 ]
Заголовок сообщения:  Re: Минимальная сумма платежа равная абонентки

Мы вышли из ситуации следующим образом.
В каждом тарифе в названии была добавлена стоимость тарифа.
И нарисованы три метки (соответственно списанию абонплат и собственно требованию доп. расхода).
Изображение
На событие "Запрос доп. расхода для открытия договора" повесили скрипт.
Код:
package ru.ellcom.bgbilling.scripts.tariff;

import bitel.billing.server.contract.bean.*;
import ru.bitel.bgbilling.kernel.event.Event;
import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase;
import ru.bitel.bgbilling.kernel.tariff.common.bean.TariffLabelItem;
import ru.bitel.bgbilling.kernel.tariff.common.bean.TariffPlan;
import ru.bitel.bgbilling.kernel.tariff.server.bean.TariffLabelManager;
import ru.bitel.bgbilling.kernel.tariff.server.bean.TariffPlanManager;
import ru.bitel.bgbilling.modules.npay.server.bean.event.DebetStatusManageOpenGetAdditionalCharge;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.Utils;
import ru.bitel.common.sql.ConnectionSet;

        import java.math.BigDecimal;
        import java.sql.Connection;
        import java.util.Date;
        import java.util.List;
        import java.util.Set;

public class GetAdditionalCharge
        extends EventScriptBase {
    private static int LABEL_GET_ADD_CHARGE = 84;
    private static int LABEL_DAY_TARIFF = 86;
    private static int LABEL_MONTH_TARIFF = 85;

    @Override
    public void onEvent(Event event, Setup setup, ConnectionSet connectionSet)
            throws Exception {
        Connection con = connectionSet.getConnection();
        ContractTariffManager ctm = new ContractTariffManager(con);
        ContractManager cm = new ContractManager(con);
        TariffPlanManager tpm = new TariffPlanManager(con);
        TariffLabelManager tariffLabelManager = new TariffLabelManager(con);
        BalanceUtils bu = new BalanceUtils(con);
        Boolean needAddCharge = false;

        DebetStatusManageOpenGetAdditionalCharge e = (DebetStatusManageOpenGetAdditionalCharge) event;
        int cid = e.getContractId();
        Date nowDate = new Date();
        Contract contract = cm.getContractById(cid);
        BigDecimal result = BigDecimal.ZERO;
        BigDecimal currentBalance = bu.getBalance(nowDate, contract);
        BigDecimal currentLimit = contract.getBalanceLimit();
        result = currentBalance.subtract(currentLimit).negate();
        BigDecimal tariffPrice = BigDecimal.ZERO;
       
        List<ContractTariff> contractTariffs = ctm.getContractTariffList(cid, new Date());
        for (ContractTariff ct : contractTariffs) {
            TariffPlan tp = tpm.getTariffPlan(ct.getTariffPlanId());
            List<TariffLabelItem> tariffLabelItems = tariffLabelManager.getTariffLabelItemList();
            Set<Integer> tariffLabelSet = tariffLabelManager.getTariffLabelIds(tp.getId());
            if (tariffLabelSet.contains(LABEL_GET_ADD_CHARGE)) {
                needAddCharge = true;
                for (TariffLabelItem tariffLabelItem : tariffLabelItems) {
                    if (tariffLabelSet.contains(tariffLabelItem.getId())) {
                        if (tariffLabelItem.getId() == LABEL_DAY_TARIFF) {
                            String tpTitle = tp.getTitle();
                            int indexOf = tp.getTitle().indexOf("=");
                            tpTitle = tpTitle.substring(indexOf);
                            tariffPrice = tariffPrice.add(Utils.parseBigDecimal(tpTitle.replaceAll("[^0-9]", ""), BigDecimal.ZERO));
                            tariffPrice = tariffPrice.multiply(new BigDecimal(30.0));
                        }
                        if (tariffLabelItem.getId() == LABEL_MONTH_TARIFF) {
                            String tpTitle = tp.getTitle();
                            int indexOf = tp.getTitle().indexOf("=");
                            tpTitle = tpTitle.substring(indexOf);
                            tariffPrice = tariffPrice.add(Utils.parseBigDecimal(tpTitle.replaceAll("[^0-9]", ""), BigDecimal.ZERO));
                        }
                    }
                }
            }
        }
        if(needAddCharge && tariffPrice.compareTo(BigDecimal.ZERO) > 0){
            result = result.add(tariffPrice);
            //System.err.print("RESULT! Договор " + contract.getTitle() + ". Сумма для разблокировки = " + result);
            e.setMode(DebetStatusManageOpenGetAdditionalCharge.MODE_REPLACE);
            e.setSumma(result);
        }
    }
}


Вроде работает.

P.S. Это версия с тестового сервера, но она рабочая.
На рабочем были изменены условие needAddCharge. Я от него тупо избавился.

Автор:  Phricker [ 17 фев 2016, 16:28 ]
Заголовок сообщения:  Re: Минимальная сумма платежа равная абонентки

На вики нет потому что пока проходит боевую эксплуатацию и было пару фиксов.
Работает с 01.02.2016 :)

Автор:  telesystem [ 17 фев 2016, 16:53 ]
Заголовок сообщения:  Re: Минимальная сумма платежа равная абонентки

А почему не стали по id тарифу вычислять нужную сумму для открытия статуса ?

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

Автор:  Phricker [ 17 фев 2016, 17:55 ]
Заголовок сообщения:  Re: Минимальная сумма платежа равная абонентки

telesystem писал(а):
А почему не стали по id тарифу вычислять нужную сумму для открытия статуса ?

Ну ну.
Вы еще попросите чтобы можно было высчитать сумму абонплат тарифа )

Автор:  stark [ 17 фев 2016, 20:14 ]
Заголовок сообщения:  Re: Минимальная сумма платежа равная абонентки

telesystem писал(а):
А почему не стали по id тарифу вычислять нужную сумму для открытия статуса ?

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



Я тут расписывал вроде вариант со скриптом. И еще вроде в какой-то другой теме для Phricker. Можно попробовать пойти по этому пути.

Автор:  Phricker [ 17 фев 2016, 20:27 ]
Заголовок сообщения:  Re: Минимальная сумма платежа равная абонентки

viewtopic.php?f=19&t=10988
Тут.
Но мне не понравилось )
И я решил скриптом.

Автор:  skyb [ 29 фев 2016, 19:34 ]
Заголовок сообщения:  Re: Минимальная сумма платежа равная абонентки

а что за метки в скрине, как они добавляются и на кой они нужны?

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