BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 26 мар 2019, 02:53

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




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Обещанный платеж
СообщениеДобавлено: 15 мар 2019, 16:53 
Не в сети

Зарегистрирован: 29 май 2018, 18:12
Сообщения: 33
Карма: 0
Пытаюсь сделать услугу "обещанный платеж" для абонентов. Но так, чтобы абонент не выбирал срок и сумму, а просто нажал на кнопку в новом ЛК. Срок фиксированный, а недостающая для активации сумма вычисляется и на нее понижается лимит.
Но как-то криво все выходит:
1. Событие понижения лимита пользователем вызывается после его понижения, что убивает возможность внесения изменений в сумму и срок постфактум, т.е. стандартный limitBean использовать не получается, ибо до его вызова надо как-то просчитать необходимую для активации сумму, но как воспользоваться calculator в limit.xhtml вариантов не вижу.
2. Можно сделать через дополнительное действие, но там надо тогда делать разнообразные проверки, типа не заблокирована ли у абонента возможность управления лимитом через web, есть ли у него просроченные платежи. Готовых инструментов для работы с этим я не нашел, остается вариант прямой работы с базой contract_limit_manage_mode.
Встает вопрос, я правильно мыслю, или чего-то не догоняю?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обещанный платеж
СообщениеДобавлено: 15 мар 2019, 17:02 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5765
Карма: 463
Код:
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.bitel.bgbilling.common.BGException;
import ru.bitel.bgbilling.common.BGMessageException;
import ru.bitel.mybgbilling.kernel.common.AbstractBean;
import ru.bitel.mybgbilling.kernel.common.inject.BGInject;
import ru.bitel.mybgbilling.kernel.common.inject.BGInjection;
import ru.bitel.mybgbilling.kernel.contract.BalanceBean;
import ru.bitel.mybgbilling.kernel.contract.LimitBean;
import ru.bitel.mybgbilling.kernel.contract.StatusBean;
import ru.ellco.bgbilling.kernel.scripts.mybgbilling.MyBGBillingService;

@Named
@ViewScoped
@BGInjection
public class MyLimitBean extends AbstractBean implements Serializable {
    private static final Logger logger = LoggerFactory.getLogger(MyLimitBean.class);
    @Inject
    private BalanceBean balanceBean;
    @Inject
    private LimitBean limitBean;
    @Inject
    private StatusBean statusBean;
    @BGInject
    private MyBGBillingService myBGBillingService;

    public MyLimitBean() {
    }

    @PostConstruct
    protected void init() throws BGException {
        super.init();
        this.populate();
    }

    public void populate() throws BGException {
    }

    public void lowerLimit() throws BGException {
        try {
            this.myBGBillingService.lowerLimit(this.getContractId());
            this.balanceBean.populateCurrentContractBalance();
            this.limitBean.populate();
            this.statusBean.populate();
            this.addInfoMessage((String)null, "Доверительный платёж подключен на 3 дня");
        } catch (BGMessageException var5) {
            this.addErrorMessage((String)null, var5.getMessage());
        } finally {
            this.populate();
        }

    }

    public String getContractMoveTasks() throws BGException {
        return this.myBGBillingService.getContractMoveTasks(this.getContractId());
    }
}


Код:
@Override
    public void lowerLimit(int contractId) throws BGMessageException {
        try {
            ContractService contractService = this.context.getService(ContractService.class, 0);
            ContractStatusService contractStatusService = this.context.getService(ContractStatusService.class, 0);
            ContractLimitService contractLimitService = this.context.getService(ContractLimitService.class, 0);
            BalanceService balanceService = this.context.getService(BalanceService.class, 0);
            Calendar cal = Calendar.getInstance();
            Calendar cal2 = (Calendar) cal.clone();
            cal2.add(Calendar.MONTH, -2);


            Contract contract = contractService.contractGet(contractId);
            if (contract.getBalanceMode() != 1 || contract.getPersonType() != 0) {
                throw new BGMessageException("Возможность получения доверительного платежа заблокирована");
            } else if (contract.getStatus() != 0 && contract.getStatus() != 3) {
                throw new BGMessageException("Текущий статус договора не позволяет воспользоваться доверительным платежом");
            } else if (balanceService.contractBalanceGet(contractId, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1).toBalance().compareTo(BigDecimal.ZERO) < 0) {
                throw new BGMessageException("Доверительный платёж можно получить при положительном балансе");
            } else if (contractLimitService.getCurrentContractLimit(contractId).compareTo(BigDecimal.ZERO) < 0) {
                throw new BGMessageException("Доверительный платёж уже подключён");
            } else if (TimeUtils.dateBefore(cal2.getTime(), contract.getDateFrom())) {
                throw new BGMessageException("Договор действует менее 2 месяцев");
            } else {
                BigDecimal newLimit = getLimitAmount(contractId);
                if (newLimit.compareTo(BigDecimal.ZERO) == 0) {
                    AlarmSender.sendAlarm(new AlarmErrorMessage("mybgbilling.limitService", "Ошибка при подключении доверительного платежа " + MyBGBillingServiceImpl.class, "Какая-то хуйня на договоре с id=" + contractId + " при подключении лимита из ЛК\n. Не удалось вычислить сумму тарифа."), System.currentTimeMillis());
                    throw new BGMessageException("Не удалось вычислить цену тарифного плана. Администраторы уведомлены о возникшей проблеме. Пожалуйста, попробуйте позже.");
                }
                contractLimitService.updateContractLimitPeriod(contractId, newLimit.negate(), COUNT_DAYS_LIMIT, "Доверительный платёж");
                if (contract.getStatus() != 0) {
                    ContractStatus contractStatus = new ContractStatus();
                    contractStatus.setStatus(0);
                    contractStatus.setDateFrom(new Date());
                    contractStatus.setContractId(contractId);
                    contractStatus.setComment("Установлен при взятии доверительного платежа");
                    contractStatusService.contractStatusChange(contractId, contractStatus, false);
                }
            }
        } catch (BGMessageException e) {
            throw new BGMessageException(e.getMessage());
        } catch (BGException e) {
            AlarmSender.sendAlarm(new AlarmErrorMessage("mybgbilling.limitService", "Ошибка при подключении доверительного платежа " + MyBGBillingServiceImpl.class, "Какая-то хуйня на договоре с id=" + contractId + " при подключении лимита из ЛК\n" + e), System.currentTimeMillis());
        }
    }


Код:
private BigDecimal getLimitAmount(int contractId) {
        BigDecimal result = BigDecimal.ZERO;
        try {
            ContractTariffService contractTariffService = this.context.getService(ContractTariffService.class, 0);
            TariffService tariffService = this.context.getService(TariffService.class, 0);
            List<ContractTariff> contractTariffList = contractTariffService.contractTariffList(contractId, new Date(), 0, 0);
            for (ContractTariff contractTariff : contractTariffList) {
                BigDecimal tariffPrice = Utils.parseBigDecimal(tariffService.tariffPlanGet(contractTariff.getTariffPlanId()).getConfigPreferences().get("price"), BigDecimal.ZERO);
                String tariffType = tariffService.tariffPlanGet(contractTariff.getTariffPlanId()).getConfigPreferences().get("type");
                if (tariffType != null && tariffType.equals("month") && tariffPrice.compareTo(BigDecimal.ZERO) > 0) {
                    tariffPrice = tariffPrice.divide(new BigDecimal(30), RoundingMode.HALF_UP);
                }
                tariffPrice = tariffPrice.multiply(new BigDecimal(COUNT_DAYS_LIMIT));
                tariffPrice = tariffPrice.divide(new BigDecimal(50), RoundingMode.CEILING).multiply(new BigDecimal(50));
                result = result.add(tariffPrice);
            }
        } catch (BGException e) {
            logger.error(e);

        }
        return result;
    }


Код:
<ui:define name="page-content-header">
      <h1>#{msg['myLimit.title']}</h1>
      <!--<f:event listener="#{limitBean.populate}" type="preRenderView" /> -->
   </ui:define>

   <ui:define name="page-content-data">
      <div class="panel panel-default">
         <div class="panel-body">
            <div jsf:id="currentLimit" class="well ">
               <!-- Текущий лимит: x руб -->
               <strong>#{msg['myLimit.currentLimit']} <h:outputText value="#{limitBean.contractLimit}" converter="#{currencyConverter}"/></strong> <br /> <br />
            <em jsf:rendered="#{not empty myLimitBean.getContractMoveTasks()}"><h:outputText value="#{myLimitBean.getContractMoveTasks()}"/></em>
            </div>
            <em><h:outputText value="#{msg['myLimit.about']}" escape="false" /></em> <br /> <br />
            <div class="form-group">
               <h:commandButton type="button" class="btn btn-primary" value="Подключить доверительный платёж" action="#{myLimitBean.lowerLimit()}"
                  a:update-target="page-content-data">
                  <f:ajax render=":page-content-data :currentLimit " listener="#{limitBean.populate}"/>
               </h:commandButton>
            </div>
         </div>
      </div>
   </ui:define>


https://www.youtube.com/watch?v=2Kgzc1sUSWg


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

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


Последний раз редактировалось Phricker 15 мар 2019, 17:13, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обещанный платеж
СообщениеДобавлено: 15 мар 2019, 17:05 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5765
Карма: 463
Я даже уверен что на рабочем уже не так, т.к. человек заводящий и редактирующий тарифы вечно косячит
с установкой month/day и я туда впилил еще проверку на сумму лимита. Так же через AlarmSender.
А может и еще параллельно что-то поправил.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обещанный платеж
СообщениеДобавлено: 15 мар 2019, 17:51 
Не в сети

Зарегистрирован: 29 май 2018, 18:12
Сообщения: 33
Карма: 0
Большое спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обещанный платеж
СообщениеДобавлено: 19 мар 2019, 18:08 
Не в сети

Зарегистрирован: 29 май 2018, 18:12
Сообщения: 33
Карма: 0
Прошу прощения за глупый вопрос, но...как это скомпилировать? То javax... не находит, то ru.bitel.bgbilling...


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

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


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

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


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

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