Код:
public void subscriptionActivate( Subscription subscription, Date initDate, int moduleId, int userId, boolean changeBalance, SubscriptionDao subscriptionDao )
throws BGException
{
int contractId = subscription.getContractId();
// проверяем, не активирована ли уже подписка
int registrationPeriodId = subscription.getRegistrationPeriodId();
if ( registrationPeriodId > 0 )
{
RegistrationPeriod registrationPeriod = new SubscriptionPeriodDao( con, moduleId, userId ).get( registrationPeriodId );
if ( registrationPeriod != null )
{
PeriodWithTime lastRegistrationPeriod = registrationPeriod.getPeriod();
if ( TimeUtils.dateInPeriod( initDate, lastRegistrationPeriod ) )
{
throw new BGException( "Активация не возможна, так как на заданое время уже есть активный период." );
}
}
}
// проверка периода действия подписки
PeriodWithTime subscriptionPeriod = subscription.getPeriod();
if ( !TimeUtils.timeInRange( new Date(), subscriptionPeriod.getDateFrom(), subscriptionPeriod.getDateTo() ) )
{
throw new BGException( "Период подписки еще не наступил или уже закончился" );
}
// проверим если создать новый период, дата его окончания будет раньше,
// даты окончания периода подписки
SubscriptionType subscriptionType = new SubscriptionTypeDao( con, moduleId ).get( subscription.getTypeId() );
PeriodWithTime newRegistrationPeriod = subscriptionType.getNewRegistrationPeriod( initDate );
if ( subscriptionPeriod.getDateTo() != null && newRegistrationPeriod.getDateTo().after( subscriptionPeriod.getDateTo() ) )
{
throw new BGException( "Активация не возможна, так как дата окончания учетного периода выходит за период окончания подписки" );
}
BigDecimal cost = BigDecimal.ZERO;
try( BalanceUtils bu = new BalanceUtils( con ) )
{
if ( changeBalance )
{
// находим стоимость подписки для сравнения с балансом
List<TariffModuleTree> tariffModuleTrees = getSubscriptionTariffModuleTree( contractId, initDate, moduleId );
if ( tariffModuleTrees == null || tariffModuleTrees.size() == 0 )
{
throw new BGException( "Активация не возможна, не найден актуальный тариф на дату - " + TimeUtils.formatDate( initDate ) );
}
cost = getSubscriptionCost( tariffModuleTrees, initDate, subscriptionType.getServiceId() );
if ( cost == null )
{
throw new BGException( "Активация не возможна, в тарифе не найдена цена" );
}
// проверяем баланс, достаточно ли средств на продление подписки
BigDecimal balanceSumma = bu.getBalance( initDate, contractId );
// сравниваем стоимость подписки и кол-во средств на балансе
if ( balanceSumma.compareTo( cost ) == -1 )
{
throw new BGMessageException( "Активация не возможна, не достаточно средств на балансе" );
}
}
//
subscriptionActivateApply( contractId, subscription.getId(), subscriptionType.getServiceId(), initDate, cost,
newRegistrationPeriod, moduleId, userId, subscriptionDao, bu );
// добавляем задание на продление подписки по ее окончанию, если у подписки стоит флаг автопродления
addSubscriptionJob( subscription, moduleId, newRegistrationPeriod.getDateTo(), subscriptionDao );
// кидаем событие
EventProcessor.getInstance().publish( new SubscriptionActivateEvent( moduleId, subscription.getContractId(), userId, subscription.getId() ) );
}
}