Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- CREATE PROCEDURE [dbo].[trf_changeUserTariff]
- @username nvarchar(128),
- @tariffID int,
- @period int -- кол-во месяцев действия тарифа (1, 6, 12, 36)
- as
- begin
- -- процедура принимает username, tariffID и period
- -- username - заказчика тарифа
- -- tariffID - id заказуемого тарифа
- -- period - период действия заказуемого тарифа в месяцах
- declare @now date, @userID int
- set @now = getdate()
- select @userID = id from as_users where username = @username
- -- определяем состояние текущего тарифа, и вычисляем параметры нового тарифа
- declare @currentTariffDeadline date, @currentTariffID int, @newTariffDeadline date, @newTariffName nvarchar(256)
- select @currentTariffID = tariffID from as_users where username = @username
- select @currentTariffDeadline = tariffDeadline from as_users where username = @username
- select @newTariffDeadline = dateadd(month, @period, @now)
- select @newTariffName = name from as_trf_tariffs where id = @tariffID
- if isnull(@currentTariffID,0) = @tariffID and isnull(@currentTariffDeadline,'2000-01-01') > @now begin
- select @newTariffDeadline = dateadd(day, datediff(day, @now, @currentTariffDeadline), @newTariffDeadline)
- end
- -- !!! если у пользователя установлен тариф отличный от заказываемого и его период еще не истек,
- -- !!! то в этом случае устанавливается новый тариф, а остаток по старому тарифу теряется
- -- !!! проверка и соотв-е предупреждение выполняется в форме заказ тарифа
- -- !!! если у пользователя уже установлен заказуемый тариф и его период еще не истек, то добавляем остаток к @newTariffDeadline
- --------------------------------------------------------------------------------------------------------------------
- ------------------------------ устанавливаем новый тариф и проводим фин. операцию -----------------------------------
- --------------------------------------------------------------------------------------------------------------------
- declare @price decimal(18,2), @statusDoneID int, @clientAccountID int, @adminAccountID int, @nowDateime datetime,
- @isEnoughBalance int = 0, @res bit, @msg nvarchar(1024)
- set @nowDateime = getdate()
- select @statusDoneID = id from fin_financeStatuses where code = 'done'
- select @clientAccountID = id from fin_accounts where contragentID = (select id from ctr_contragents where username = @username)
- -- определение счета площадки (при необходимости можно настроить)
- select @adminAccountID = id from fin_accounts where account = 'iDrive'
- -- определяем цену тарифа
- -- если период = 0, то цена тоже = 0 (например, при регистрации для установки базового бесплатного тарифа)
- select @price = case @period
- when 1 then isnull(price,0)
- when 6 then isnull(price6,0)
- when 12 then isnull(price12,0)
- when 36 then isnull(price36,0)
- else 0
- end from as_trf_tariffs where id = @tariffID
- -- проверяем достаточно ли у пользователя средств для переход на тариф
- select @isEnoughBalance = 1 from fin_accounts where (id = @clientAccountID and isnull(balance,0) >= @price) or isnull(@period,0) = 0
- if @isEnoughBalance = 1 begin
- -- устанавливаем тариф
- -- если @period = 0, то в tariffDeadline пишем null, тем самым обозначая, что тариф не имеет срока окончания (для базовых тарифов)
- update as_users
- set tariffID = @tariffID,
- tariffDeadline = iif(isnull(@period,0) > 0, @newTariffDeadline, null)
- where username = @username
- insert into as_trf_tariffLog (userID, tariffID, created, deadline)
- select @userID, @tariffID, @now, @newTariffDeadline
- -- добавляем финансовую операцию
- declare @finID int
- insert into fin_finances (accountFromID, accountToID, sum, description, statusID, created, completed, relatedTypeCode, relatedItemID)
- values (@clientAccountID, @adminAccountID, @price, '', @statusDoneID, @nowDateime, @nowDateime, 'tariff', @tariffID)
- set @finID = scope_identity()
- -- логируем статус фин операции
- insert into fin_financeStatusLog (financeID, statusID, created, createdBy)
- values (@finID, @statusDoneID, @nowDateime, @username)
- -- обновляем баланс заказчика тарифа
- update fin_accounts set balance = isnull(balance,0) - isnull(@price,0) where id = @clientAccountID
- -- обновляем баланс площадки
- update fin_accounts set balance = isnull(balance,0) + isnull(@price,0) where id = @adminAccountID
- set @res = 1
- set @msg = 'Переход нв тариф '+@newTariffName+' осуществлен.' +
- iif(isnull(@period,0)=0,'',
- '<br>С Вашего счета списана сумма в размере '+try_cast(@price as nvarchar)+' грн.' +
- '<br>Тариф действителен до '+try_convert(nvarchar, @newTariffDeadline, 104)
- )
- end else begin
- set @res = 0
- set @msg = 'Недостаточно средств для перехода на данный тариф. Пожалуйста, пополните Ваш баланс.'
- end
- --------------------------------------------------------------------------------------------------------------------
- --------------------------------------------------------------------------------------------------------------------
- select @res result, @msg msg
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement