---------------------------------------------------
-- 자재관리코드
---------------------------------------------------

-- 자재 분류 코드
-- MakiFirst, MakiSecond, MakiThird를 통합
CREATE TABLE FmsMaterialCodeClass
(
	SiteId					int					NOT NULL ,		-- 현장 고유번호
	MaterialClassId			int  identity(1,1)	NOT NULL ,		-- 자재분류 고유번호
	ParentMaterialClassId	int					NULL ,			-- 부모 자재분류 고유번호
	Depth					int					NOT NULL ,		-- 트리 깊이 
	Name					nvarchar(32)		NOT NULL ,		-- 분류명
	Abbreviation			nvarchar(16)		NULL ,			-- 분류명 약어

	IsUse					bit					NULL ,			-- 사용 유무
	
	PRIMARY KEY (SiteId ASC , MaterialClassId ASC)
);


/* 자재구분코드 */
CREATE TABLE FmsMaterialCodeType
(
	SiteId				int						NOT NULL,	-- 현장 고유번호
	MaterialTypeId		smallint identity(1,1)	NOT NULL,	-- 자재구분 고유번호

	Name				nvarchar(24)			NOT NULL,	-- 자재구분 명칭
	Nickname			nvarchar(24)			NOT NULL,	-- 자재구분 별칭
	IsUse				bit						NOT NULL,	-- 사용여부

	PRIMARY KEY (SiteId ASC , MaterialTypeId ASC)
);
--INSERT INTO FmsMaterialCodeType VALUES (1, 1, '일반자재', '일', 1);
--INSERT INTO FmsMaterialCodeType VALUES (2, '소모품', '소', 1);
--INSERT INTO FmsMaterialCodeType VALUES (3, '공기구', '공', 1);
--INSERT INTO FmsMaterialCodeType VALUES (4, '기타', '기', 1);


/* 구매구분코드 */
CREATE TABLE FmsMaterialCodePurchaseType
(
	SiteId				int						NOT NULL,	-- 현장 고유번호
	PurchaseTypeId		smallint identity(1,1)	NOT NULL,	-- 구매구분 고유번호

	Name				nvarchar(24)			NOT NULL,	-- 자재구분 명칭

	IsUse				bit						NOT NULL,	-- 사용여부

	PRIMARY KEY (SiteId ASC , PurchaseTypeId ASC)
);


/* 출고구분코드 */ -- 내부 로직으로 사용하므로 수정 할 수 없다.
CREATE TABLE FmsMaterialCodeReleaseType
(
	ReleaseTypeId		smallint		NOT NULL,	-- 출고구분 고유번호
	
	Name				nvarchar(24)	NOT NULL,	-- 자재구분 명칭

	[Description]		nvarchar(100)	NULL,	-- 설명 

	PRIMARY KEY (ReleaseTypeId ASC)
);

INSERT INTO FmsMaterialCodeReleaseType VALUES (1, '작업출고', '작업에 사용한 자재의 출고');
INSERT INTO FmsMaterialCodeReleaseType VALUES (2, '조정출고', '재고 정산에 의한 출고');


/* 거래처정보 */
CREATE TABLE FmsMaterialTradeCompany
(
	SiteId				int					NOT NULL,	-- 현장 고유번호
	TradeCompanyId		int identity(1,1)	NOT NULL,	-- 거래처 고유번호

	Name				nvarchar(48)		NOT NULL,	-- 거래처 명칭
	RegistrationNo		nvarchar(24)		NOT NULL,	-- 사업자등록번호

	RepresentativeName	nvarchar(24)		null,		-- 대표자명

	PhoneNo				nvarchar(20)		null,		-- 대표번호
	FaxNo				nvarchar(20)		null,		-- 팩스번호

	SalseName			nvarchar(20)		null,		-- 담당자
	SalsePhoneNo		nvarchar(20)		null,		-- 담당자 연락처

	AddressZip1         nchar(3)  NULL ,				-- 현장 주소 우편번호 1
	AddressZip2         nchar(3)  NULL ,				-- 현장 주소 우편번호 2

	Address1			nvarchar(100)  NULL ,			-- 거래처 주소 1			
	Adderss2			nvarchar(100)  NULL ,			-- 거래처 주소 2

	HomepageUri			nvarchar(200)  NULL ,			-- 거래처 홈페이지 URI

	Note				nvarchar(1024)  NULL ,			-- 비고

	IsUse				bit				NOT NULL,		-- 사용여부

	PRIMARY KEY (SiteId ASC, TradeCompanyId ASC)
);


/* 진행상태코드 */
CREATE TABLE FmsMaterialCodeProgress
(
	ProgressId		smallint		NOT NULL,	-- 상태 고유번호
	Name			nvarchar(24)	NOT NULL,	-- 상태명칭
	[Description]	nvarchar(100)	null,		-- 상태설명

	PRIMARY KEY (ProgressId ASC)
);

INSERT INTO FmsMaterialCodeProgress VALUES (1, '자재신청', '');
INSERT INTO FmsMaterialCodeProgress VALUES (2, '신청승인', '');
INSERT INTO FmsMaterialCodeProgress VALUES (3, '발주요청', '');
INSERT INTO FmsMaterialCodeProgress VALUES (4, '자재입고', '');
INSERT INTO FmsMaterialCodeProgress VALUES (5, '입고승인', '');



/* 위치코드 */
CREATE TABLE FmsMaterialCodeLocation
(
	SiteId				int					NOT NULL,	-- 현장 고유번호
	LocationId			int identity(1,1)	NOT NULL,	-- 자재위치 고유번호
	BusinessFieldId		int					NOT NULL,	-- 업무분야 고유번호
	Name				nvarchar(48)		NOT NULL,	-- 위치 명칭

	IsUse				bit					NOT NULL,	-- 사용여부

	PRIMARY KEY (SiteId ASC, LocationId ASC)
);

/* 창고코드 */
CREATE TABLE FmsMaterialWarehouse
(
	SiteId				int					NOT NULL,	-- 현장 고유번호
	BusinessFieldId		int					NOT NULL,	-- 업무분야 고유번호
	WarehouseId			int identity(1,1)	NOT NULL,	-- 창고 고유번호
	Name				nvarchar(48)		NOT NULL,	-- 창고 명칭

	IsUse				bit					NOT NULL,	-- 사용여부

	PRIMARY KEY (SiteId ASC, BusinessFieldId ASC, WarehouseId ASC)
);



/* 자재정보 */
CREATE TABLE FmsMaterial
(
	SiteId				int					NOT NULL,	-- 현장 고유번호
	BusinessFieldId		int					NOT NULL,	-- 업무분야 고유번호
	MaterialId			int identity(1,1)	NOT NULL,	-- 자재 고유번호
	MaterialCode		nvarchar(48)		NOT NULL,	-- 자재 코드
	Name				nvarchar(48)		NOT NULL,	-- 자재 명칭
	
	FirstClassId		int					null,		-- 자재 대분류
	SecondClassId		int					null,		-- 자재 중분류
	ThirdClassId		int					null,		-- 자재 소분류

	LocationId			int					null,		-- 자재위치 고유번호

	MaterialTypeId		smallint			null,		-- 자재 구분

	TradeCompanyId		int					NULL,		-- 거래처 고유번호 
	WarehouseId			int					NULL,		-- 보관창고 고유번호 

	Rfid				nvarchar(52)		null,		-- RFID
	Unit				nvarchar(12)		null,		-- 자재단위
	DurableYears		smallint			null,		-- 내용연수

	ReasonableStockCount smallint			null,		-- 적정재고 (물량)

	Manufacturer		nvarchar(40)		null,		-- 제조사 명칭
	[Standard]			nvarchar(20)		null,		-- 자재규격
	
	FinalPrice			int					null,		-- 최종가격

	ImageFileId			int					null,		-- 자재사진
	Note				nvarchar(512)		null,		-- 비고				

	IsDiscontinued		bit					null,		-- 단종여부
	IsUse				bit					NOT NULL,	-- 사용여부

	PRIMARY KEY (SiteId ASC, BusinessFieldId ASC, MaterialId ASC)
);

-- FK
ALTER TABLE FmsMaterialCodeClass
	ADD CONSTRAINT FK__FmsMaterialCodeClass__CmSite 
		FOREIGN KEY (SiteId) REFERENCES CmSite(SiteId)
;


ALTER TABLE FmsMaterialCodeClass
	ADD CONSTRAINT FK__FmsMaterialCodeClass__FmsMaterialCodeClass 
		FOREIGN KEY (SiteId , ParentMaterialClassId) REFERENCES FmsMaterialCodeClass(SiteId , MaterialClassId)
;


ALTER TABLE FmsMaterialTradeCompany
	ADD CONSTRAINT FK__FmsMaterialTradeCompany__CmSite 
		FOREIGN KEY (SiteId) REFERENCES CmSite(SiteId)
;

ALTER TABLE FmsMaterialCodeType
	ADD CONSTRAINT FK__FmsMaterialCodeType__CmSite 
		FOREIGN KEY (SiteId) REFERENCES CmSite(SiteId)
;

ALTER TABLE FmsMaterialCodePurchaseType
	ADD CONSTRAINT FK__FmsMaterialCodePurchaseType__CmSite 
		FOREIGN KEY (SiteId) REFERENCES CmSite(SiteId)
;


-- 위치
ALTER TABLE FmsMaterialCodeLocation
	ADD CONSTRAINT FK__FmsMaterialCodeLocation__CmSite 
		FOREIGN KEY (SiteId) REFERENCES CmSite(SiteId)
;

ALTER TABLE FmsMaterialCodeLocation
	ADD CONSTRAINT FK__FmsMaterialCodeLocation__CmBusinessField 
		FOREIGN KEY (SiteId, BusinessFieldId) REFERENCES CmBusinessField(SiteId, BusinessFieldId)
;

-- 창고
ALTER TABLE FmsMaterialWarehouse
	ADD CONSTRAINT FK__FmsMaterialWarehouse__CmSite 
		FOREIGN KEY (SiteId) REFERENCES CmSite(SiteId)
;
ALTER TABLE FmsMaterialWarehouse
	ADD CONSTRAINT FK__FmsMaterialWarehouse__CmBusinessField 
		FOREIGN KEY (SiteId, BusinessFieldId) REFERENCES CmBusinessField(SiteId, BusinessFieldId)
;


-- 자재
ALTER TABLE FmsMaterial
	ADD CONSTRAINT FK__FmsMaterial__CmSite 
		FOREIGN KEY (SiteId) REFERENCES CmSite(SiteId)
;

ALTER TABLE FmsMaterial
	ADD CONSTRAINT FK__FmsMaterial__CmBusinessField 
		FOREIGN KEY (SiteId, BusinessFieldId) REFERENCES CmBusinessField(SiteId, BusinessFieldId)
;

ALTER TABLE FmsMaterial
	ADD CONSTRAINT FK__FmsMaterial__FmsMaterialCodeClass_AsFirstClassId 
		FOREIGN KEY (SiteId, FirstClassId) REFERENCES FmsMaterialCodeClass(SiteId, MaterialClassId)
;

ALTER TABLE FmsMaterial
	ADD CONSTRAINT FK__FmsMaterial__FmsMaterialCodeClass_AsSecondClassId 
		FOREIGN KEY (SiteId, SecondClassId) REFERENCES FmsMaterialCodeClass(SiteId, MaterialClassId)
;

ALTER TABLE FmsMaterial
	ADD CONSTRAINT FK__FmsMaterial__FmsMaterialCodeClass_AsThirdClassId 
		FOREIGN KEY (SiteId, ThirdClassId) REFERENCES FmsMaterialCodeClass(SiteId, MaterialClassId)
;

ALTER TABLE FmsMaterial
	ADD CONSTRAINT FK__FmsMaterial__FmsMaterialWarehouse
		FOREIGN KEY (SiteId, BusinessFieldId, WarehouseId) REFERENCES FmsMaterialWarehouse(SiteId, BusinessFieldId, WarehouseId)
;

ALTER TABLE FmsMaterial
	ADD CONSTRAINT FK__FmsMaterial__FmsMaterialTradeCompany
		FOREIGN KEY (SiteId, TradeCompanyId) REFERENCES FmsMaterialTradeCompany(SiteId, TradeCompanyId)
;


ALTER TABLE FmsMaterial
	ADD CONSTRAINT FK__FmsMaterial__FmsMaterialCodeLocation
		FOREIGN KEY (SiteId, LocationId) REFERENCES FmsMaterialCodeLocation(SiteId, LocationId)
;

ALTER TABLE FmsMaterial
	ADD CONSTRAINT FK__FmsMaterial__FmsMaterialCodeType
		FOREIGN KEY (SiteId, MaterialTypeId) REFERENCES FmsMaterialCodeType(SiteId, MaterialTypeId)
;


ALTER TABLE FmsMaterial
	ADD CONSTRAINT FK__FmsMaterial__CmFile
		FOREIGN KEY (SiteId, ImageFileId) REFERENCES CmFile(SiteId, FileId)
;