:SetVar Procedure "ЛК::Авторизация" -- authorization
:r $(DropProcedureScript_AUX)
create procedure [$(Procedure)]
   @КодЛС         bigint,                          -- account code
   @КодДоступа    $(dt_AccessCode),                -- user access code
   @Статус        uniqueidentifier  = null   out,  -- status
   @Сообщение     $(dt_Message_AUX) = null   out   -- message
AS
/*==================================================================================================
# Flat owner personal cabinet | MyFlat sample project | Author: Sergei Y.Kitáev
----------------------------------------------------------------------------------------------------
#
# USER AUTHORIZATION:
#
# === Usage: ===
# exec @Возврат = [ЛК::Авторизация] -- authorization
#    @КодЛС = <Account code>, @КодДоступа = <User access code>,
#    @Статус = @<Status GUID variable> out, -- status
#    @Сообщение = @<Error message variable> out -- message
#
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# === Result-set #1: ===
# [ИД ЛС]               uniqueidentifier  not null -- account ID
# [Код ЛС]              bigint            not null -- account code (human R/W as decimal number)
# [Дата регистрации]    datetime2         not null -- registration date (with time)
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# === Result-set #2: ===
# [ФИО]                 $(dt_String_RUH)  not null -- flat owner initials
# [Адрес]               $(dt_String_RUH)  not null -- flat address
# [Кол-во проживающих]  int               not null -- really live (person count)
# [Общая площадь]       $(dt_Square_2)    not null -- total flat territory square
# [Жилая площадь]       $(dt_Square_2)    not null -- living territory square
# [Название района]     $(dt_String_RUH)  not null -- district name
# [Название жил.орг.]   $(dt_String_RUH)  not null -- name of technical subdivision
--------------------------------------------------------------------------------------------------*/
-- commstat_, commstat_, ...
:SetVar Status_ServiceNotAvailable        "'71F0A024-228F-4199-B2B9-0C70D912D0F1'"
:SetVar Status_AuthorizationNotPassed     "'7AD9B001-A3D2-4E3F-AD14-018D27742634'"
:SetVar Status_AccessNotOpen              "'0EDF636D-FDE1-4E07-9C15-6BB123B0DCF2'"
:SetVar Status_AccountNotFound            "'3BF5D1C7-AA30-410F-A9C0-358035C2A156'"
:SetVar Status_NewRegistrationRequired    "'64F1A24C-8F10-4A39-A9ED-92E18DBB0751'"
/*================================================================================================*/
$(BEGIN_AUX)
----------------------------------------------------------------------------------------------------
select @Статус=null, @Сообщение=null
----------------------------------------------------------------------------------------------------
if @КодЛС is null or @КодДоступа is null
   exec [AUX:RaiseIncorrectProcedureCall] N'$(Procedure)'
----------------------------------------------------------------------------------------------------
--exec [AUX:RaiseBlockedProcedure] N'$(Procedure)'
--/*
if DATEPART(second,GETDATE()) >= 50
begin
   select @Статус=$(Status_ServiceNotAvailable), @Сообщение=dbo.[AUX:LocalizedText](
      'Every last 10 seconds period of every minute — authorization request is unavailable (for the sake of DB-originated error test).',
      N'Каждый последний 10-секундный период каждой минуты — запрос на авторизацию недоступен (ради тестирования ошибки, исходящей из БД).' )
   RETURN 1
end
--*/
----------------------------------------------------------------------------------------------------
declare @ДатаРегистрации datetime2, @ДоступОткрыт bit, @ИДЛС uniqueidentifier -- reg.date, is access permitted, account ID
select @ДатаРегистрации = [Дата регистрации], @ДоступОткрыт = [Доступ открыт], @ИДЛС = [ИД ЛС]
from [Персональный доступ]
where [Код ЛС] = @КодЛС and [Код доступа] = @КодДоступа
if @@ROWCOUNT = 0
begin
   select @Статус=$(Status_AuthorizationNotPassed), @Сообщение=dbo.[AUX:LocalizedText](
      'Incorrect login data for account '+CONVERT($(dt_IntStr_AUX),@КодЛС)+'. (Authorization has not passed).',
      N'Неправильные данные для входа в Л/С '+CONVERT($(dt_IntStr_AUX),@КодЛС)+N'. (Авторизация не прошла.)' )
   RETURN 1
end
if @@ROWCOUNT > 1
   exec [AUX:RaiseUnexpectedInternalError] N'$(Procedure)', '6EAD88FA-598F-4C91-AB88-C88F6555266F'
if @ДоступОткрыт = 0
begin
   select @Статус=$(Status_AccessNotOpen), @Сообщение=dbo.[AUX:LocalizedText](
      'Your personal cabinet is inaccessible. (Access is blocked.)',
      N'Ваш кабинет квартиросъёмщика недоступен. (Доступ заблокирован.)' )
   RETURN 1
end

declare @ИДЛСвБД uniqueidentifier -- account ID in DB
select @ИДЛСвБД = [ИД] from [Лицевые счета] with (index=[Код ЛС]) where [Код ЛС] = @КодЛС
if @@ROWCOUNT = 0 goto ЛС_НЕ_ОБНАРУЖЕН
if @@ROWCOUNT > 1
   exec [AUX:RaiseUnexpectedInternalError] N'$(Procedure)', '0517C549-6D11-4893-8DED-8B57C5BBE2C3'

if @ИДЛСвБД is null or @ИДЛС is null
   exec [AUX:RaiseUnexpectedInternalError] N'$(Procedure)', 'A0213AE5-C542-4EC9-9CBB-1842890A4B50'

if @ИДЛСвБД <> @ИДЛС -- If account ID n DB <> account ID:
begin
   select @Статус=$(Status_NewRegistrationRequired), @Сообщение=dbo.[AUX:LocalizedText](
      'You have to pass repeated registration for access to you account: '+CONVERT($(dt_IntStr_AUX),@КодЛС)+'.',
      N'Вам необходимо пройти повторную регистрацию для доступа к Л/С: '+CONVERT($(dt_IntStr_AUX),@КодЛС)+N'.' )
   RETURN 1
end

----------------------------------------------------------------------------------------------------
-- Result-set #1:
select
   @ИДЛС [ИД ЛС], -- account ID
   @КодЛС [Код ЛС], -- account code (human readable/writable as decimal number)
   @ДатаРегистрации [Дата регистрации] -- registration date (with time)
----------------------------------------------------------------------------------------------------
-- Result-set #2:
declare @КодОтвета int -- response code
exec @КодОтвета = [ЛК:ИнформацияЛС] @ИДЛС -- account info proc. (arg: account ID)
if @КодОтвета<>0 goto ЛС_НЕ_ОБНАРУЖЕН -- if account not found (ret.code<>0)
----------------------------------------------------------------------------------------------------
RETURN -- SUCCESS
----------------------------------------------------------------------------------------------------
ЛС_НЕ_ОБНАРУЖЕН: -- account not found
select @Статус=$(Status_AccountNotFound), @Сообщение=dbo.[AUX:LocalizedText](
   'Account code is not found: '+CONVERT($(dt_IntStr_AUX),@КодЛС)+'.',
   N'Лицевой счёт не обнаружен: '+CONVERT($(dt_IntStr_AUX),@КодЛС)+N'.' )
RETURN 1 -- GENERAL FAILURE
----------------------------------------------------------------------------------------------------
$(END_AUX)
/*================================================================================================*/
GO
/*
declare @Возврат int, @Статус uniqueidentifier, @Сообщение nvarchar(max)
exec @Возврат = [ЛК::Авторизация]
   @КодЛС = 1000000021, -- 1000000000 (account ID),
-- @КодЛС = 1000000022, -- account ID
-- @КодЛС = 1000000000, -- account ID
   @КодДоступа = '12345', -- user access code
   @Статус = @Статус out, -- status GUID
   @Сообщение = @Сообщение out -- error message
if @Возврат <> 0 -- If return code not equal zero:
   if @RetValue<>0 select @RetValue 'RetValue', @Status 'Status', @Message 'Message'
*/
/*
declare @Возврат int, @Статус uniqueidentifier, @Сообщение nvarchar(max)
exec @Возврат = [ЛК::Авторизация]
-- @КодЛС = 1000000021, -- 1000000000 (account ID),
   @КодЛС = 1000000022, -- account ID
-- @КодЛС = 1000000000, -- account ID
   @КодДоступа = '67890', -- user access code
   @Статус = @Статус out, -- status GUID
   @Сообщение = @Сообщение out -- error message
if @Возврат <> 0 -- If return code not equal zero:
   if @RetValue<>0 select @RetValue 'RetValue', @Status 'Status', @Message 'Message'
*/
