BEGIN TRANSACTION;
DROP FUNCTION IF EXISTS fsfn_AddressObjects_ObjectGroup(a_AOGUID VARCHAR(36),a_CurrStatus INTEGER);
/************************************************************************************************************************/
/* Возвращает  признак группы адресного объекта по его идентификатору  fias_AddressObjects					*/
/************************************************************************************************************************/
CREATE OR REPLACE FUNCTION fsfn_AddressObjects_ObjectGroup(
		a_AOGUID	VARCHAR(36),			/* Глобальный уникальный идентификатор адресного объекта*/
		a_CurrStatus	INTEGER default NULL		/* Статус актуальности КЛАДР 4:			*/
								/*	0 - актуальный, 			*/
								/*	1-50 - исторический, т.е. объект был переименован, в данной записи приведено одно из прежних его наименований, 	*/
								/*	51 - переподчиненный 			 */
)
RETURNS VARCHAR(50)	/* Группа адресного объекта	*/
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';/* Признак группы - часть дополнительной территории*/	
	
	v_ShortTypeName		VARCHAR(10);		/* Тип адресного объекта */ 
	v_AddressObjectName	VARCHAR(100);		/* Название адресного объекта */ 
	v_AOLevel		INTEGER;		/* Уровень адресного объекта*/	
	v_CurrStatus		INTEGER;		/* Текущий статус адресного объекта*/	
	v_ObjectGroup		VARCHAR(50);/* Группа адресного объекта	*/						
 	v_Return_Error		Integer :=0;	/* Код возврата */
--******************************************************************************************************       
--******************************************************************************************************
 BEGIN
 	SELECT INTO v_CurrStatus COALESCE(a_CurrStatus,MIN(addrobj.currstatus)) FROM fias_AddressObjects addrobj WHERE addrobj.AOGUID=a_AOGUID;
	SELECT INTO v_ShortTypeName,v_AddressObjectName,v_AOLevel ShortName,FormalName,AOLevel FROM fias_AddressObjects addrobj   
						WHERE addrobj.AOGUID=a_AOGUID AND addrobj.currstatus = v_CurrStatus 
						ORDER BY addrobj.actstatus
						LIMIT 1;
	v_ShortTypeName=REPLACE(v_ShortTypeName,'.','');					
	IF v_AOLevel = 1 AND UPPER(v_ShortTypeName) <> 'Г' THEN /*  уровень региона */ 
		v_ObjectGroup:=c_RegionGroupValue;
	ELSIF v_AOLevel = 1 AND UPPER(v_ShortTypeName) =  'Г' THEN /*  уровень города как региона  */ 
		v_ObjectGroup:=c_CityGroupValue;
	ELSIF v_AOLevel = 3 THEN /* уровень района */
		v_ObjectGroup:=c_TerritoryGroupValue;
	ELSIF (v_AOLevel = 4 AND UPPER(v_ShortTypeName) NOT IN ('С/С','С/А','С/О','С/МО'))  OR (v_AOLevel = 1 AND UPPER(v_ShortTypeName) <> 'Г') THEN /* уровень города */ 
		v_ObjectGroup:=c_CityGroupValue;
	ELSIF v_AOLevel IN (4,6)  AND UPPER(v_ShortTypeName) IN ('С/С','С/А','С/О','С/МО') AND UPPER(v_ShortTypeName) NOT LIKE ('Ж/Д%') THEN  /* уровень сельсовета */ 
		v_ObjectGroup:=c_VillageCouncilValue;	
	ELSIF v_AOLevel = 6 AND UPPER(v_ShortTypeName) NOT IN ('С/С','С/А','С/О','С/МО','САД','СНТ','ТЕР','АВТОДОРОГА','ПРОМЗОНА','ДП','МКР')
				AND UPPER(v_ShortTypeName) NOT LIKE ('Ж/Д%') THEN /* уровень населенного пункта */ 
		v_ObjectGroup:=c_LocalityGroupValue;
	ELSIF  UPPER(v_ShortTypeName) IN ('АВТОДОРОГА') THEN /* уровень автомобильной дороги */ 
		v_ObjectGroup:=c_MotorRoadValue;
	ELSIF  v_AOLevel IN (6,7) AND UPPER(v_ShortTypeName) LIKE ('Ж/Д%') THEN /* уровень объект на железной дороге */ 
		v_ObjectGroup:=c_RailWayObjectValue;	
	ELSIF v_AOLevel = 7 AND UPPER(v_ShortTypeName) NOT LIKE ('Ж/Д%') AND UPPER(v_ShortTypeName) NOT IN ('УЧ-К','ГСК','ПЛ-КА','СНТ','ТЕР')
			OR (v_AOLevel IN (7,65) AND UPPER(v_ShortTypeName) IN ('ТЕР') AND UPPER(v_AddressObjectName) LIKE ('%ПРОМЗОН%') )
			OR (v_AOLevel = 6 AND UPPER(v_ShortTypeName) IN ('МКР') )  THEN /* уровень улицы */
		v_ObjectGroup:=c_StreetGroupValue;
	ELSIF v_AOLevel IN (65,90) OR v_AOLevel = 6 AND UPPER(v_ShortTypeName) IN ('САД','СНТ','ТЕР','ПРОМЗОНА','ДП')
		OR v_AOLevel = 7 AND UPPER(v_ShortTypeName) IN ('УЧ-К','ГСК','ПЛ-КА','СНТ','ТЕР')  THEN /*  уровень дополнительных территорий */
		v_ObjectGroup:=c_AddlTerritoryValue;
	ELSIF v_AOLevel = 91 THEN  /* уровень подчиненных дополнительным территориям объектов */ 
		v_ObjectGroup:=c_PartAddlTerritoryValue;
	END IF;	

	RETURN v_ObjectGroup;
  END;
  $BODY$
 LANGUAGE plpgsql;
COMMENT ON FUNCTION fsfn_AddressObjects_ObjectGroup(a_AOGUID VARCHAR(36),a_CurrStatus INTEGER)
					IS 'Возвращает  признак группы адресного объекта по его идентификатору в таблице fias_AddressObjects';


--ROLLBACK TRANSACTION;
COMMIT TRANSACTION;

SELECT fsfn_AddressObjects_ObjectGroup('719b789d-2476-430a-89cd-3fedc643d821',51);
SELECT fsfn_AddressObjects_ObjectGroup('db9c4f8b-b706-40e2-b2b4-d31b98dcd3d1');
SELECT fsfn_AddressObjects_ObjectGroup('625497d3-22de-4390-b4b4-2febfbfc15ce');
SELECT fsfn_AddressObjects_ObjectGroup('39da6405-b3e6-4baf-b332-d47b73b4d5fb');
SELECT fsfn_AddressObjects_ObjectGroup('bfc1236d-b5d2-4734-a238-3b1e4830e963');
						