Advertisement
vokernesss

trf_changeUserTariff

Feb 26th, 2021
625
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 6.40 KB | None | 0 0
  1. CREATE PROCEDURE [dbo].[trf_changeUserTariff]
  2.     @username nvarchar(128),
  3.     @tariffID int,
  4.     @period int -- кол-во месяцев действия тарифа (1, 6, 12, 36)
  5. as
  6.   begin
  7.     -- процедура принимает username, tariffID и period
  8.     -- username - заказчика тарифа
  9.     -- tariffID - id заказуемого тарифа
  10.     -- period - период действия заказуемого тарифа в месяцах
  11.  
  12.     declare @now date, @userID int
  13.     set @now = getdate()
  14.     select @userID = id from as_users where username = @username
  15.  
  16.     -- определяем состояние текущего тарифа, и вычисляем параметры нового тарифа
  17.     declare @currentTariffDeadline date, @currentTariffID int, @newTariffDeadline date, @newTariffName nvarchar(256)
  18.  
  19.     select @currentTariffID = tariffID from as_users where username = @username
  20.     select @currentTariffDeadline = tariffDeadline from as_users where username = @username
  21.     select @newTariffDeadline = dateadd(month, @period, @now)
  22.     select @newTariffName = name from as_trf_tariffs where id = @tariffID
  23.  
  24.     if isnull(@currentTariffID,0) = @tariffID and isnull(@currentTariffDeadline,'2000-01-01') > @now begin
  25.       select @newTariffDeadline = dateadd(day, datediff(day, @now, @currentTariffDeadline), @newTariffDeadline)
  26.     end
  27.  
  28.     -- !!! если у пользователя установлен тариф отличный от заказываемого и его период еще не истек,
  29.     -- !!! то в этом случае устанавливается новый тариф, а остаток по старому тарифу теряется
  30.     -- !!! проверка и соотв-е предупреждение выполняется в форме заказ тарифа
  31.     -- !!! если у пользователя уже установлен заказуемый тариф и его период еще не истек, то добавляем остаток к @newTariffDeadline
  32.     --------------------------------------------------------------------------------------------------------------------
  33.     ------------------------------ устанавливаем новый тариф и проводим фин. операцию -----------------------------------
  34.     --------------------------------------------------------------------------------------------------------------------
  35.     declare @price decimal(18,2), @statusDoneID int, @clientAccountID int, @adminAccountID int, @nowDateime datetime,
  36.             @isEnoughBalance int = 0, @res bit, @msg nvarchar(1024)
  37.  
  38.     set @nowDateime = getdate()
  39.     select @statusDoneID = id from fin_financeStatuses where code = 'done'
  40.     select @clientAccountID = id from fin_accounts where contragentID = (select id from ctr_contragents where username = @username)
  41.     -- определение счета площадки (при необходимости можно настроить)
  42.     select @adminAccountID = id from fin_accounts where account = 'iDrive'
  43.  
  44.     -- определяем цену тарифа
  45.     -- если период = 0, то цена тоже = 0 (например, при регистрации для установки базового бесплатного тарифа)
  46.     select @price = case @period
  47.                       when 1 then isnull(price,0)
  48.                       when 6 then isnull(price6,0)
  49.                       when 12 then isnull(price12,0)
  50.                       when 36 then isnull(price36,0)
  51.                       else 0
  52.                     end from as_trf_tariffs where id = @tariffID
  53.  
  54.     -- проверяем достаточно ли у пользователя средств для переход на тариф
  55.     select @isEnoughBalance = 1 from fin_accounts where (id = @clientAccountID and isnull(balance,0) >= @price) or isnull(@period,0) = 0
  56.  
  57.     if @isEnoughBalance = 1 begin
  58.  
  59.       -- устанавливаем тариф
  60.       -- если @period = 0, то в tariffDeadline пишем null, тем самым обозначая, что тариф не имеет срока окончания (для базовых тарифов)
  61.       update as_users
  62.       set tariffID = @tariffID,
  63.           tariffDeadline = iif(isnull(@period,0) > 0, @newTariffDeadline, null)
  64.       where username = @username
  65.  
  66.       insert into as_trf_tariffLog (userID, tariffID, created, deadline)
  67.       select @userID, @tariffID, @now, @newTariffDeadline
  68.  
  69.       -- добавляем финансовую операцию
  70.       declare @finID int
  71.       insert into fin_finances (accountFromID, accountToID, sum, description, statusID, created, completed, relatedTypeCode, relatedItemID)
  72.       values (@clientAccountID, @adminAccountID, @price, '', @statusDoneID, @nowDateime, @nowDateime, 'tariff', @tariffID)
  73.       set @finID = scope_identity()
  74.  
  75.       -- логируем статус фин операции
  76.       insert into fin_financeStatusLog (financeID, statusID, created, createdBy)
  77.       values (@finID, @statusDoneID, @nowDateime, @username)
  78.  
  79.       -- обновляем баланс заказчика тарифа
  80.       update fin_accounts set balance = isnull(balance,0) - isnull(@price,0) where id = @clientAccountID
  81.  
  82.       -- обновляем баланс площадки
  83.       update fin_accounts set balance = isnull(balance,0) + isnull(@price,0) where id = @adminAccountID
  84.  
  85.       set @res = 1
  86.       set @msg = 'Переход нв тариф '+@newTariffName+' осуществлен.' +
  87.                  iif(isnull(@period,0)=0,'',
  88.                      '<br>С Вашего счета списана сумма в размере '+try_cast(@price as nvarchar)+' грн.' +
  89.                      '<br>Тариф действителен до '+try_convert(nvarchar, @newTariffDeadline, 104)
  90.                     )
  91.  
  92.     end else begin
  93.  
  94.       set @res = 0
  95.       set @msg = 'Недостаточно средств для перехода на данный тариф. Пожалуйста, пополните Ваш баланс.'
  96.  
  97.     end
  98.     --------------------------------------------------------------------------------------------------------------------
  99.     --------------------------------------------------------------------------------------------------------------------
  100.  
  101.  
  102.     select @res result, @msg msg
  103.   end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement