-- 3.5.29 Power 
-- 1.0.28 Power.TechnologicalConnection
-- Добавляем объект Building, переносим туда строительную часть из Строительное_сооружение
declare @table_name nvarchar(50)
declare @strSQL nvarchar(1024)

set @table_name=N'Дверь_строения'
set @strSQL=''
select @strSQL = @strSQL + ' ALTER TABLE ' + @table_name + ' DROP CONSTRAINT '+ object_name(FK_Tab.id) 
from sysobjects FK_Tab 
where (xtype = 'F') AND object_id(@table_name)=parent_obj 
if @strSQL<>''  exec (@strSQL)

set @table_name=N'Строительное_сооружение'
set @strSQL=''
select @strSQL = @strSQL + ' ALTER TABLE ' + @table_name + ' DROP CONSTRAINT '+ object_name(FK_Tab.id) 
from sysobjects FK_Tab 
where (xtype = 'F') AND object_id(@table_name)=parent_obj 
if @strSQL<>''  exec (@strSQL)

GO
CREATE TABLE BuildingTypes
(
	TypeID 		int identity(1,1),
        Description	nvarchar(100) NOT NULL,
	Hidden		bit,
	PRIMARY KEY (TypeID)
)
GO
CREATE TABLE Buildings (
        BuildingID	       int identity(1,1), 
	TypeID			int,
        Код_типа_кровли		int,
        Код_материала_стен   	int,
        Код_типа_фундамента  	int,
	Код_типа_перекрытия  	int,
        Код_типа_окон        	int,
        Этажность            	int NOT NULL,
        Высота               	float,
        Длина                	float,
        Ширина               	float,
        Высотная_отметка     	float,
	Примечание	     	nvarchar(1000) NULL,			
        PRIMARY KEY (BuildingID)
 )
GO
set identity_insert Buildings on
insert into Buildings
  (BuildingID,     
   Код_типа_кровли,    
   Код_материала_стен, 
   Код_типа_фундамента,
   Код_типа_перекрытия,
   Код_типа_окон,      
   Этажность,          
   Высота,             
   Длина,             
   Ширина,             
   Высотная_отметка)
  select 
   Код_сооружения,     
   Код_типа_кровли,    
   Код_материала_стен, 
   Код_типа_фундамента,
   Код_типа_перекрытия,
   Код_типа_окон,      
   Этажность,          
   Высота,             
   Длина,             
   Ширина,             
   Высотная_отметка
 from Строительное_сооружение
set identity_insert Buildings off
GO
alter table Строительное_сооружение add BuildingID int
GO
update Строительное_сооружение set BuildingID = Код_сооружения
GO
alter table Строительное_сооружение alter column BuildingID int NOT NULL
GO
exec sp_rename 'Дверь_строения.Код_строения', 'BuildingID', 'COLUMN'
GO
-- удаляем лишние поля в Строительное_сооружение
alter table Строительное_сооружение drop column Код_типа_кровли
alter table Строительное_сооружение drop column Код_материала_стен
alter table Строительное_сооружение drop column Код_типа_фундамента
alter table Строительное_сооружение drop column Код_типа_перекрытия
alter table Строительное_сооружение drop column Код_типа_окон
alter table Строительное_сооружение drop column Этажность
alter table Строительное_сооружение drop column Высота
alter table Строительное_сооружение drop column Длина
alter table Строительное_сооружение drop column Ширина
alter table Строительное_сооружение drop column Высотная_отметка 
GO
-- делае Здания для Объектов электроснабжения
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[AfterConsumingObjectsUpdate]') and xtype = N'TR')
drop trigger [dbo].[AfterConsumingObjectsUpdate]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[OnAddressesDelete]') and xtype = N'TR')
drop trigger [dbo].[OnAddressesDelete]
GO
declare @table_name nvarchar(50)
declare @strSQL nvarchar(1024)

set @table_name=N'ConsumingObjects'
set @strSQL=''
select @strSQL = @strSQL + ' ALTER TABLE ' + @table_name + ' DROP CONSTRAINT '+ object_name(FK_Tab.id) 
from sysobjects FK_Tab 
where (xtype = 'F') AND object_id(@table_name)=parent_obj
if @strSQL<>''  exec (@strSQL)
GO
UPDATE ConsumingObjects SET ParentID = NULL
GO
EXEC sp_rename 'ConsumingObjects.ParentID', 'HousingID'
GO
-- Добавляем Housing как подобъект к Building
CREATE TABLE Housings
(
	HousingID	int NOT NULL,
	AddressID       int NOT NULL
	PRIMARY KEY(HousingID) 
)
GO
ALTER TABLE Housings 
	ADD FOREIGN KEY(HousingID)
	REFERENCES Buildings
	ON DELETE CASCADE

ALTER TABLE Housings
	ADD FOREIGN KEY(AddressID)
	REFERENCES AddressBaseParts(AddressID)
GO
-- добавляем ConsumingObjectTypes в BuildingTypes
alter table BuildingTypes add COTypeID int
GO
insert into BuildingTypes(COTypeID, Description)
  select TypeID, Description
  from ConsumingObjectTypes
GO
-- переносим данные из ConsumingObjects в Здание
ALTER TABLE Buildings ADD ObjID int
GO
INSERT INTO Buildings(ObjID, Примечание, TypeID, Этажность)
  SELECT ID, Name, BT.TypeID, 0
  FROM ConsumingObjects CO
  inner join ConsumingObjectTypes COT on COT.TypeID = CO.TypeID
  inner join BuildingTypes BT on COTypeID = COT.TypeID 
GO
UPDATE ConsumingObjects SET HousingID = Buildings.BuildingID
  FROM Buildings
  WHERE ObjID = ID
GO
ALTER TABLE Buildings DROP COLUMN ObjID
alter table BuildingTypes DROP COLUMN COTypeID
GO
INSERT INTO Housings(HousingID, AddressID)
  SELECT HousingID, AddressID
  FROM ConsumingObjects
GO
UPDATE ConsumingObjects SET AddressID = ExtraPartID 
  FROM Addresses
  WHERE Addresses.AddressID = ConsumingObjects.AddressID
GO
DELETE FROM Addresses WHERE AddressID in (SELECT AddressID FROM Housings)
GO
alter table ConsumingObjects 
	add foreign key (HousingID)
	references Housings

alter table ConsumingObjects 
	add foreign key (TypeID)
	references ConsumingObjectTypes(TypeID)

alter table ConsumingObjects add foreign key (AddressID) references AddressExtraParts

alter table ConsumingObjects 
	add foreign key (DelineationID)
	references Delineations(DelineationID)

ALTER TABLE ConsumingObjects 
	ADD FOREIGN KEY (SupplyContractID)
				REFERENCES SupplyContracts
GO
CREATE TRIGGER OnAddressesDelete ON [dbo].[Addresses] 
FOR DELETE 
AS
  if (SELECT Count(*) FROM DELETED) > 0 
    DELETE FROM AddressExtraParts WHERE ExtraPartID IN (SELECT ExtraPartID FROM DELETED)
GO
CREATE TRIGGER AfterConsumingObjectsUpdate ON [dbo].[ConsumingObjects] 
AFTER UPDATE, DELETE
AS
  if (SELECT Count(AddressID) FROM DELETED) > 0
    DELETE FROM AddressExtraParts WHERE 
      ExtraPartID in (select AddressID from DELETED)
      AND ((select count(AddressID) from inserted) = 0 OR   
      ExtraPartID not in (select AddressID from INSERTED))  
GO
CREATE TRIGGER AfterHousingsUpdate ON [dbo].[Housings] 
AFTER UPDATE,DELETE
AS
  if (SELECT Count(AddressID) FROM DELETED) > 0
    DELETE FROM AddressBaseParts WHERE 
      AddressID in (select AddressID from DELETED)
      AND ((select count(AddressID) from inserted) = 0 OR   
      AddressID not in (select AddressID from INSERTED))  
GO
ALTER TABLE Дверь_строения
        ADD FOREIGN KEY (BuildingID)
                              REFERENCES Buildings
                              ON DELETE CASCADE
GO
ALTER TABLE Buildings
        ADD FOREIGN KEY (Код_типа_окон)
                              REFERENCES Справочник_типов_окон

ALTER TABLE Buildings
        ADD FOREIGN KEY (TypeID)
                              REFERENCES BuildingTypes

ALTER TABLE Buildings
        ADD FOREIGN KEY (Код_типа_кровли)
                              REFERENCES Справочник_типов_кровель

ALTER TABLE Buildings
        ADD FOREIGN KEY (Код_материала_стен)
                              REFERENCES Справочник_стройматериалов

ALTER TABLE Buildings
        ADD FOREIGN KEY (Код_типа_фундамента)
                              REFERENCES Справочник_типов_фундаментов

ALTER TABLE Buildings
        ADD FOREIGN KEY (Код_типа_перекрытия)
                              REFERENCES Справочник_типов_перекрытий
GO
ALTER TABLE Строительное_сооружение WITH NOCHECK
        ADD FOREIGN KEY (Код_сооружения)
                              REFERENCES Объект ON DELETE CASCADE

ALTER TABLE Строительное_сооружение
        ADD FOREIGN KEY (BuildingID)
                              REFERENCES Buildings

ALTER TABLE Строительное_сооружение
        ADD FOREIGN KEY (Код_типа_сооружения)
                              REFERENCES Справочник_типов_сооружений
GO
---- Строительное_сооружение - AFTER UPDATE,DELETE ----
-- удаляем строительную часть строительного сооружения
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[AfterСтроительное_сооружениеUpdate]') and xtype = N'TR')
drop trigger [dbo].[AfterСтроительное_сооружениеUpdate]
GO
CREATE TRIGGER AfterСтроительное_сооружениеUpdate ON [dbo].[Строительное_сооружение] 
AFTER UPDATE,DELETE
AS
  if (SELECT Count(BuildingID) FROM DELETED) > 0
    DELETE FROM Buildings WHERE 
      BuildingID in (select BuildingID from DELETED)
      AND ((select count(BuildingID) from inserted) = 0 OR   
      BuildingID not in (select BuildingID from INSERTED))  
GO
-- исправлю правописание, ошибка в Горсетевой базе
update Справочник_типов_объектов
  set Класс_объекта = 'Энергопринимающее устройство',
  Описание = 'Энергопринимающие устройства'
where Код_типа_объекта = 1001
GO
create function GetExtraAddressShortView(@AddressID integer)
returns nvarchar(4000)
as
begin
  declare @res nvarchar(4000)
  set @res = ''
  declare @FFlat nvarchar(50)
  declare @FEntrance nvarchar(50) 
  select 
    @FFlat = Flat,
    @FEntrance = Entrance
    from AddressExtraParts
    where ExtraPartID = @AddressID

  if @FFlat <> ''
    set @res = @res + ' кв. ' + @FFlat
  if @FEntrance <> ''
    set @res = @res + ' п. ' + @FEntrance

  return @res
end
GO
update Характеристики_полей set ReadOnly = 1 where Имя_поля = 'Тип_файла_чертежа'
GO
-- Добавляем исполнителя Акта разграничения.
alter table Delineations add ExecutorID int
GO
alter table Delineations 
	add foreign key(ExecutorID) 
		references Персонал(Код_работника)
GO
-- Делаем иерархию CO с точки зрения истории.
alter table ConsumingObjects add OldVersionID int
alter table ConsumingObjects add IsOldVersion bit
GO
alter table ConsumingObjects 
	add foreign key (OldVersionID)
		references ConsumingObjects(ID)
GO
-- Изменения по проектным работам
alter table TCActs add ProjectNeed		bit
alter table TCActs add ProjectName		nvarchar(250)
alter table TCActs add ProjectGiveTask	datetime
alter table TCActs add ProjectPlanDate	datetime
alter table TCActs add ProjectCost		decimal(18,2)
alter table TCActs add ProjectSMRCost	decimal(18,2)
alter table TCActs add ProjectTechWatchNeed		bit
alter table TCActs add ProjectTechWatchGive		datetime
alter table TCActs drop column ProjectTechWatchActNumber
-- Изменения по проекту заявителя.
alter table TCActs add ProjectApplicantNeed		bit
GO
EXEC sp_rename 'TCActs.ProjectLegalEntityID', 'ProjectApplicantOrganizationID', 'COLUMN'
GO
Update TCActs set ProjectNeed = 1, ProjectTechWatchNeed = 1
Update TCActs set ProjectGiveTask = ProjectDate
where ProjectDate is not null