BEGIN TRANSACTION;
DROP FUNCTION IF EXISTS fsfn_AddressObjects_TreeActualName(a_AOGUID VARCHAR(36),a_MaskArray VARCHAR(2)[10]) 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_TreeActualName('bfc1236d-b5d2-4734-a238-3b1e4830e963');)*/
/*--------------------------------------------------------------------------------------------------------------*/
/*		"Красноярский край, р-н Балахтинский, п Могучий, ул Новая"					*/
/****************************************************************************************************************/	
CREATE OR REPLACE FUNCTION fsfn_AddressObjects_TreeActualName(
	    a_AOGUID		VARCHAR(36) DEFAULT NULL, 		/* Идентификтор адресного объекта */
	    a_MaskArray		VARCHAR(2)[10] default '{TP,LM,LP,ST}'	/* Массив масок, управляющий содержанием строки с адресом дома*/
)
RETURNS VARCHAR(1000) AS
$BODY$
DECLARE
	c_CountryGroupValue		CONSTANT VARCHAR(50):='Country';/* Признак группы - Страна*/	
	c_RegionGroupValue		CONSTANT VARCHAR(50):='Region';	/* Признак группы - Регион*/	
	c_CityGroupValue		CONSTANT VARCHAR(50):='City';	/* Признак группы - Основной населенный пункт*/	
	c_TerritoryGroupValue		CONSTANT VARCHAR(50):='Territory';/* Признак группы - район */	
	c_LocalityGroupValue		CONSTANT VARCHAR(50):='Locality';/* Признак группы - населенный пункт подчиненный основному */	
	c_MotorRoadValue		CONSTANT VARCHAR(50):='MotorRoad';/* Признак группы - автомобильная дорога */	
	c_RailWayObjectValue		CONSTANT VARCHAR(50):='RailWayObject';/* Признак группы - железная дорога */	
	c_VillageCouncilValue		CONSTANT VARCHAR(50):='VillageCouncil';/* Признак группы - сельсовет */	
	c_StreetGroupValue		CONSTANT VARCHAR(50):='Street';/* Признак группы - улица в населенном пункте */	
	c_AddlTerritoryValue		CONSTANT VARCHAR(50):='AddlTerritory';/* Признак группы - дополнительная территория*/	
	c_PartAddlTerritoryValue	CONSTANT VARCHAR(50):='PartAddlTerritory';/* Признак группы - часть дополнительной территории*/	
	c_StreetMask	 	CONSTANT  VARCHAR(2)[1] :='{ST}';/* Маска улица */
	c_PostIndexMask		CONSTANT  VARCHAR(2)[1] :='{ZC}';/* Маска почтовый индекс */
	c_DistrictMask		CONSTANT  VARCHAR(2)[1] :='{DT}';/* Маска городской район*/
	c_PartLocalityMask	CONSTANT  VARCHAR(2)[1] :='{LP}';/* Маска подчиненный населенный пункт*/
	c_MainLocalityMask	CONSTANT  VARCHAR(2)[1] :='{LM}';/* Маска основной населенный пункт*/
	c_PartTerritoryMask	CONSTANT  VARCHAR(2)[1] :='{TP}';/* Маска района субъекта федерации*/
	c_MainTerritoryMask	CONSTANT  VARCHAR(2)[1] :='{TM}';/* Маска субъект федерации (регион)*/
	c_CountryMask		CONSTANT  VARCHAR(2)[1] :='{CY}';/* Маска страна*/
	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;	/* Код возврата */
--******************************************************************************************************       
--******************************************************************************************************
 BEGIN
	SELECT INTO v_MinCurrStatus	MIN(addrobj.currstatus) FROM fias_AddressObjects addrobj     WHERE aoguid=a_AOGUID;
	OPEN cursor_AddressObjectTree FOR SELECT rtf_ShortTypeName,REPLACE(rtf_AddressObjectName,'  ',' '),rtf_AOLevel,fsfn_AddressObjects_ObjectGroup(rtf_AOGUID )
						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,UPPER(v_ShortTypeName) LIKE UPPER('%Респ%');

		IF v_ObjectGroup=c_CountryGroupValue AND c_CountryMask <@ a_MaskArray AND v_AOLevel =0 THEN
			v_TreeAddressObjectName:=v_TreeAddressObjectName||CASE WHEN v_TreeAddressObjectName='' THEN '' ELSE ', ' END ||
								v_AddressObjectName||' '||v_ShortTypeName;
		ELSIF v_ObjectGroup=c_RegionGroupValue AND c_MainTerritoryMask <@ a_MaskArray  AND v_AOLevel <=2 THEN
			v_TreeAddressObjectName:=v_TreeAddressObjectName||CASE WHEN v_TreeAddressObjectName='' THEN '' ELSE ', ' END ||
								CASE WHEN UPPER(v_ShortTypeName) LIKE UPPER('%Респ%') THEN 'Республика '||v_AddressObjectName
									ELSE v_AddressObjectName||' '||v_ShortTypeName END;
		ELSIF v_ObjectGroup=c_TerritoryGroupValue AND c_PartTerritoryMask <@ a_MaskArray AND v_AOLevel =3 THEN
			v_TreeAddressObjectName:=v_TreeAddressObjectName||CASE WHEN v_TreeAddressObjectName='' THEN '' ELSE ', ' END ||
										v_AddressObjectName||' '||v_ShortTypeName;
		ELSIF v_ObjectGroup=c_CityGroupValue AND c_MainLocalityMask <@ a_MaskArray AND v_AOLevel =4 THEN
			v_TreeAddressObjectName:=v_TreeAddressObjectName||CASE WHEN v_TreeAddressObjectName='' THEN '' ELSE ', ' END ||
										CASE WHEN UPPER(LEFT(v_AddressObjectName,6+LENGTH(v_ShortTypeName)))='ЗАТО '||UPPER(TRIM(v_ShortTypeName))||'.' 
												THEN v_AddressObjectName
												ELSE v_ShortTypeName ||' '|| v_AddressObjectName END;
		ELSIF v_ObjectGroup=c_LocalityGroupValue AND c_DistrictMask <@ a_MaskArray AND v_AOLevel =5 THEN
			v_TreeAddressObjectName:=v_TreeAddressObjectName||CASE WHEN v_TreeAddressObjectName='' THEN '' ELSE ', ' END ||
										v_AddressObjectName||' '||v_ShortTypeName ;
		ELSIF v_ObjectGroup=c_LocalityGroupValue AND c_PartLocalityMask <@ a_MaskArray AND v_AOLevel =6 THEN
			v_TreeAddressObjectName:=v_TreeAddressObjectName||CASE WHEN v_TreeAddressObjectName='' THEN '' ELSE ', ' END ||
										v_ShortTypeName ||' '|| v_AddressObjectName;
		ELSIF v_ObjectGroup=c_StreetGroupValue AND c_StreetMask <@ a_MaskArray AND v_AOLevel =7  THEN
			v_TreeAddressObjectName:=v_TreeAddressObjectName||CASE WHEN v_TreeAddressObjectName='' THEN '' ELSE ', ' END ||
										CASE WHEN TRIM(LOWER(v_ShortTypeName)) IN ('км','кв-л','мкр') THEN v_AddressObjectName||' '||v_ShortTypeName
											ELSE v_ShortTypeName ||' '|| v_AddressObjectName
										END;
		END IF;
		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_TreeActualName(a_AOGUID VARCHAR(36),a_MaskArray VARCHAR(2)[10])
					IS 'Возвращает  строку с полным названием адресного объекта';


--ROLLBACK TRANSACTION;
COMMIT TRANSACTION;
SELECT fsfn_AddressObjects_TreeActualName('0a129804-4fd3-44ff-8b23-3f757c466b6c');
SELECT fsfn_AddressObjects_TreeActualName('0a129804-4fd3-44ff-8b23-3f757c466b6c','{TM,TP,LM,LP,ST}');

--SELECt * FROM fias_AOLevels;