BEGIN TRANSACTION;
--DROP FUNCTION IF EXISTS fsfn_AddressObjects_TreeActualFullName(a_AOGUID VARCHAR(36)) CASCADE;
/*****************************************************************************************************************/
/* Возвращает строку с полным названием адресного объекта					  		*/
/*--------------------------------------------------------------------------------------------------------------*/
/* Например:													*/
/* 	Поля AddressObjects 	AOGUID					FormalName,	ShortName,	AOLevel	*/
/*--------------------------------------------------------------------------------------------------------------*/
/*				bfc1236d-b5d2-4734-a238-3b1e4830e963	Красноярский	край		1	*/
/*				bfc1236d-b5d2-4734-a238-3b1e4830e963	Балахтинский	р-н		3	*/
/*				bfc1236d-b5d2-4734-a238-3b1e4830e963	Могучий		п		6	*/
/*				bfc1236d-b5d2-4734-a238-3b1e4830e963	Новая		ул		7	*/
/*--------------------------------------------------------------------------------------------------------------*/
/* Результат вызова функции (SELECT fsfn_AddressObjects_TreeActualFullName('bfc1236d-b5d2-4734-a238-3b1e4830e963');)*/
/*--------------------------------------------------------------------------------------------------------------*/
/*		"Красноярский край, р-н Балахтинский, п Могучий, ул Новая"					*/
/****************************************************************************************************************/	
CREATE OR REPLACE FUNCTION fsfn_AddressObjects_TreeActualFullName(
	    a_AOGUID		VARCHAR(36) DEFAULT NULL 		/* Идентификтор адресного объекта */

)
RETURNS VARCHAR(1000) AS
$BODY$
DECLARE
	v_ShortTypeName		VARCHAR(10);		/* Тип адресного объекта */ 
	v_AddressObjectName	VARCHAR(100);		/* Название адресного объекта */ 
	v_AOLevel		INTEGER;		/* Уровень адресного объекта*/	
	v_MinCurrStatus		INTEGER;		/* Минимальное значение текущего статуса адресного объекта*/	
	v_TreeAddressObjectName	VARCHAR(1000);		/* Полное в иерархии название объекта*/ 
	v_ObjectGroup		VARCHAR(50);		/* Группа адресного объекта	*/						
	v_TreeLeverCount	INTEGER;		/* Счетчик цикла*/
	v_Return_Error_i 	Integer := 0;
	cursor_AddressObjectTree RefCURSOR; 
	v_Return_Error		Integer :=0;	/* Код возврата */
	v_SQLSTATE		varchar(255);	/* Код системной ошибки*/
	v_SQLERRM		varchar(255);	/* Описание системной ошибки*/
	v_Error_MessageText    	varchar(255);	/* Текст сообщения об ошибочном завершении процедуры          */
	v_Error_TemplateText    varchar(255);	/* Шаблон сообщения об ошибочном завершении процедуры     */
	v_OK_MessageText    	varchar(255);	/* Текст сообщения о нормальном завершении процедуры           **********/
	v_CUStepMessage    	varchar(255);	/*  Название шага изменения значений основных характеристик состояния    */
--******************************************************************************************************       
--******************************************************************************************************
 BEGIN
	OPEN cursor_AddressObjectTree FOR SELECT rtf_ShortTypeName,REPLACE(rtf_AddressObjectName,'  ',' '),rtf_AOLevel 
						FROM fstf_AddressObjects_AddressObjectTree(a_AOGUID) ORDER BY rtf_AOLevel;
	v_TreeLeverCount:=0;
	v_TreeAddressObjectName:='';
	FETCH FIRST FROM cursor_AddressObjectTree INTO v_ShortTypeName,v_AddressObjectName,v_AOLevel,v_ObjectGroup;
	WHILE FOUND
	LOOP
		v_TreeLeverCount:=v_TreeLeverCount+1;	
RAISE INFO 'v_ShortTypeName=%,v_AddressObjectName=%,v_AOLevel=%,v_ObjectGroup=%',v_ShortTypeName,v_AddressObjectName,v_AOLevel,v_ObjectGroup;
		v_TreeAddressObjectName:=v_TreeAddressObjectName||CASE WHEN v_TreeAddressObjectName='' THEN '' ELSE ', ' END ||
								CASE WHEN v_AOLevel <3 THEN CASE WHEN UPPER(v_ShortTypeName) LIKE UPPER('%Респ%') THEN 'Республика '||v_AddressObjectName
												ELSE v_AddressObjectName||' '||v_ShortTypeName END
									WHEN v_AOLevel IN (3,4) THEN 
													CASE WHEN UPPER(LEFT(v_AddressObjectName,6+LENGTH(v_ShortTypeName)))='ЗАТО '||UPPER(TRIM(v_ShortTypeName))||'.' 
															THEN v_AddressObjectName
															ELSE v_ShortTypeName ||' '|| v_AddressObjectName END
									WHEN v_AOLevel = 5 THEN v_AddressObjectName||' '||v_ShortTypeName
									WHEN v_AOLevel IN (6,7) THEN CASE WHEN TRIM(LOWER(v_ShortTypeName)) IN ('км','кв-л','мкр') THEN v_AddressObjectName||' '||v_ShortTypeName
														ELSE v_ShortTypeName ||' '|| v_AddressObjectName
													END
									ELSE v_AddressObjectName||' '||v_ShortTypeName END;
		FETCH NEXT  FROM cursor_AddressObjectTree INTO v_ShortTypeName,v_AddressObjectName,v_AOLevel,v_ObjectGroup;
	END LOOP;
	CLOSE cursor_AddressObjectTree;
 	RETURN 	v_TreeAddressObjectName;
  END;
  $BODY$
LANGUAGE plpgsql ;
COMMENT ON FUNCTION fsfn_AddressObjects_TreeActualFullName(a_AOGUID VARCHAR(36))
					IS 'Возвращает  строку с полным названием адресного объекта';


--ROLLBACK TRANSACTION;
COMMIT TRANSACTION;
SELECT fsfn_AddressObjects_TreeActualFullName('719b789d-2476-430a-89cd-3fedc643d821');
--SELECt * FROM fias_AOLevels;