Files
e-Book/3.玩轉SQL/參考資料/erp/Day7/參考文檔/薪資-sp/GEX_SALFORMULA_V3.txt
T

215 lines
7.2 KiB
Plaintext

CREATE PROC [dbo].[GEX_SALFORMULA_V3]
(
@BILLDATE1 VARCHAR(10),
@BILLDATE2 VARCHAR(10),
@PERSONID1 NVARCHAR(20),
@PERSONID2 NVARCHAR(20),
@DEPARTMENTID1 NVARCHAR(10),
@DEPARTMENTID2 NVARCHAR(10),
@FACDISTRICT1 VARCHAR(10),
@FACDISTRICT2 VARCHAR(10),
@COUNTRYID1 VARCHAR(10),
@COUNTRYID2 VARCHAR(10),
@SALTERM NVARCHAR(10),
@LOGINID NVARCHAR(30),
@FUNCTAG NVARCHAR(30)
)
/*
Function : 計算人員薪資公式內容
Description: 本 SP 是配合薪資計算使用, 傳入的參數較多
Build Date : 2011/07/13
Modify History
Item Who Date Modify Docs
==== ========== ========== ================================================
1 Michael 2011/07/13 加入註解, 本功能不支援多選
2 Michael 2011/08/15 新增莎美娜的部門代替群組的需求
依參數來判斷
3 Michael 2011/09/05 新增留職停薪不納入計算的判斷
4 Michael 2011/09/14 新增廠區條件 sql
5 Michael 2011/09/26 新增國別
6 Michael 2011/11/10 修正產品引數傳入星號(zz)的 SQL 問題
7 Michael 2013/06/03 當 @FUNCTAG 為 ESSR2D 時, 資料寫到暫存檔
*/
AS
IF @DEPARTMENTID1 = '' OR @DEPARTMENTID1 = '*' BEGIN SET @DEPARTMENTID1 = '' END
IF @DEPARTMENTID2 = '' OR @DEPARTMENTID2 = '*' BEGIN SET @DEPARTMENTID2 = 'zz' END
IF @FACDISTRICT1 = '*' BEGIN SET @FACDISTRICT1 = '' END
IF @FACDISTRICT2 = '*' BEGIN SET @FACDISTRICT2 = 'zz' END
IF @COUNTRYID1 = '*' BEGIN SET @COUNTRYID1 = '' END
IF @COUNTRYID2 = '*' BEGIN SET @COUNTRYID2 = 'zz' END
--防錯
UPDATE BASPERSON SET FACDISTRICT = '' WHERE FACDISTRICT IS NULL
UPDATE BASPERSON SET COUNTRYID = '' WHERE COUNTRYID IS NULL
DECLARE @IS_SAB VARCHAR(10)
SELECT @IS_SAB=PARAVALUE FROM PARAMETER WHERE PARATYPE = 'ESS' AND PARAFIELD = 'IS_SAB'
IF @IS_SAB = '' OR @IS_SAB IS NULL BEGIN SET @IS_SAB = 'N' END
--依參數決定群組的取法
DECLARE @SAL_TMP TABLE (
USERID VARCHAR(20),
GROUPID VARCHAR(50)
)
IF @IS_SAB = 'Y' BEGIN
INSERT INTO @SAL_TMP
SELECT USERID,GROUPID
FROM
(
SELECT
PERSONID USERID,
CASE WHEN DATAEXTEND5 IS NULL OR DATAEXTEND5 = '' THEN DEPARTMENTID ELSE DATAEXTEND5 END GROUPID
FROM BASPERSON
WHERE
CASE WHEN @PERSONID1 = '*' THEN @PERSONID1 ELSE PERSONID END >= @PERSONID1
AND CASE WHEN @PERSONID2 = '*' THEN @PERSONID2 ELSE PERSONID END <= @PERSONID2
) Z
WHERE Z.GROUPID IN (SELECT GROUPID FROM ESSGROUP)
END
ELSE BEGIN
INSERT INTO @SAL_TMP
SELECT USERID,GROUPID FROM USERGROUPS
WHERE GROUPID IN (SELECT GROUPID FROM ESSGROUP)
AND CASE WHEN @PERSONID1 = '*' THEN @PERSONID1 ELSE USERID END >= @PERSONID1
AND CASE WHEN @PERSONID2 = '*' THEN @PERSONID2 ELSE USERID END <= @PERSONID2
END
--清除薪資公式科目為NULL
DELETE FROM ESSEMPSALSETUP WHERE ESS_SUBJECTID = '';
WITH NO_EMP
AS
(
--排除本月不需計薪人員 FIRSTWORKDATE,BYEDATE
SELECT PERSONID FROM BASPERSON
WHERE DEPARTMENTID >= @DEPARTMENTID1 AND DEPARTMENTID <= @DEPARTMENTID2
AND CASE WHEN @PERSONID1 = '*' THEN @PERSONID1 ELSE PERSONID END >= @PERSONID1
AND CASE WHEN @PERSONID2 = '*' THEN @PERSONID2 ELSE PERSONID END <= @PERSONID2
AND (FIRSTWORKDATE > @BILLDATE2 OR BYEDATE < @BILLDATE1)
UNION ALL
--留職停薪
SELECT A.PERSONID FROM ESSKEEPWORK A
LEFT JOIN ESSRETURNWORK B ON A.PERSONID = B.PERSONID AND A.ENDDATE = B.ENDDATE
WHERE A.STARTDATE <= @BILLDATE1 AND A.ENDDATE >= @BILLDATE2 AND ((B.STARTDATE > @BILLDATE2) OR (B.STARTDATE IS NULL))
AND CASE WHEN @PERSONID1 = '*' THEN @PERSONID1 ELSE A.PERSONID END >= @PERSONID1
AND CASE WHEN @PERSONID2 = '*' THEN @PERSONID2 ELSE A.PERSONID END <= @PERSONID2
), EMP
AS
(
SELECT PERSONID FROM BASPERSON
WHERE DEPARTMENTID >= @DEPARTMENTID1 AND DEPARTMENTID <= @DEPARTMENTID2
AND CASE WHEN @PERSONID1 = '*' THEN @PERSONID1 ELSE PERSONID END >= @PERSONID1
AND CASE WHEN @PERSONID2 = '*' THEN @PERSONID2 ELSE PERSONID END <= @PERSONID2
AND FACDISTRICT >= @FACDISTRICT1 AND FACDISTRICT <= @FACDISTRICT2
AND COUNTRYID >= @COUNTRYID1 AND COUNTRYID <= @COUNTRYID2
AND NOT EXISTS
(
SELECT * FROM NO_EMP WHERE NO_EMP.PERSONID = BASPERSON.PERSONID
)
), ESS_GROUP
AS
(
--取得人員所屬的薪資群組
SELECT USERID,GROUPID
FROM @SAL_TMP Z
WHERE --USERID >= @PERSONID1 AND USERID <= @PERSONID2
CASE WHEN @PERSONID1 = '*' THEN @PERSONID1 ELSE USERID END >= @PERSONID1
AND CASE WHEN @PERSONID2 = '*' THEN @PERSONID2 ELSE USERID END <= @PERSONID2
AND EXISTS
(
SELECT * FROM EMP WHERE Z.USERID = EMP.PERSONID
)
), ESS_SUBJECT1
AS
(
--先取得人員的所有計薪科目(個人+群組)
SELECT DISTINCT PERSONID,ESS_SUBJECTID,SALTERM,SALARY
FROM ESSEMPSALSETUP
WHERE SALTERM = @SALTERM AND FLAG = 1
AND EXISTS
(
SELECT * FROM EMP WHERE PERSONID = ESSEMPSALSETUP.PERSONID
)
), ESS_SUBJECT2
AS
(
--人員所屬群組公式
SELECT DISTINCT X.PERSONID,A.ESS_SUBJECTID,A.SALTERM,A.SALARY
FROM EMP X
LEFT JOIN ESS_GROUP B ON X.PERSONID = B.USERID
LEFT JOIN ESSEMPSALSETUP A ON A.PERSONID = B.GROUPID AND A.FLAG = 2
WHERE A.SALTERM = @SALTERM
AND NOT EXISTS
(
SELECT * FROM ESS_SUBJECT1 WHERE PERSONID = X.PERSONID AND ESS_SUBJECTID = A.ESS_SUBJECTID AND SALTERM = A.SALTERM
)
), ESS_SUBJECT
AS
(
SELECT * FROM ESS_SUBJECT1
UNION ALL
SELECT * FROM ESS_SUBJECT2
), SAL_EMP
AS
(
--先取得人員科目公式
SELECT
PERSONID,ESS_SUBJECTID,SALTERM,SEQNO,DCTYPE,CALCMETHOD,TRUETO,FALSETO
FROM ESSCALCFORMULA WHERE FLAG = 1 AND SALTERM = @SALTERM
AND EXISTS
(
SELECT * FROM EMP WHERE ESSCALCFORMULA.PERSONID = EMP.PERSONID
)
), SAL_GROUP1
AS
(
--想辦法取得人員科目沒有設公式的資料
SELECT PERSONID,ESS_SUBJECTID FROM ESS_SUBJECT
WHERE SALTERM = @SALTERM
AND NOT EXISTS
(
SELECT * FROM SAL_EMP WHERE PERSONID = ESS_SUBJECT.PERSONID AND ESS_SUBJECTID= ESS_SUBJECT.ESS_SUBJECTID
)
), SAL_GROUP2
AS
(
--然後當然是依人員取得群組公式, union 就 ok 了
SELECT
A.PERSONID,A.ESS_SUBJECTID,B.SALTERM,B.SEQNO,B.DCTYPE,B.CALCMETHOD,B.TRUETO,B.FALSETO
FROM SAL_GROUP1 A
LEFT JOIN ESS_GROUP X ON A.PERSONID = X.USERID
LEFT JOIN ESSCALCFORMULA B ON B.PERSONID = X.GROUPID AND A.ESS_SUBJECTID = B.ESS_SUBJECTID AND B.FLAG = 2
)
SELECT A.PERSONID,A.ESS_SUBJECTID,ISNULL(A.SALTERM,@SALTERM) SALTERM,B.SALARY,A.SEQNO,A.DCTYPE,A.CALCMETHOD,A.TRUETO,A.FALSETO INTO #ESS_TMP9 FROM SAL_EMP A
LEFT JOIN ESS_SUBJECT B ON A.PERSONID = B.PERSONID AND A.ESS_SUBJECTID = B.ESS_SUBJECTID
UNION ALL
SELECT A.PERSONID,A.ESS_SUBJECTID,ISNULL(A.SALTERM,@SALTERM) SALTERM,B.SALARY,A.SEQNO,A.DCTYPE,A.CALCMETHOD,A.TRUETO,A.FALSETO FROM SAL_GROUP2 A
LEFT JOIN ESS_SUBJECT B ON A.PERSONID = B.PERSONID AND A.ESS_SUBJECTID = B.ESS_SUBJECTID
ORDER BY 1,2,3,5
IF @FUNCTAG = 'ESSR2D'
BEGIN
IF NOT EXISTS (SELECT NAME FROM SYSOBJECTS WHERE NAME = 'ESSRPT_TMP7')
CREATE TABLE dbo.ESSRPT_TMP7 (
LOGINID varchar(30),
PERSONID VARCHAR(20),
ESS_SUBJECTID VARCHAR(20),
SALTERM VARCHAR(10),
SALARY DECIMAL(12,2)
)
DELETE FROM ESSRPT_TMP7 WHERE LOGINID = @LOGINID
INSERT INTO ESSRPT_TMP7
SELECT DISTINCT @LOGINID,PERSONID,ESS_SUBJECTID,SALTERM,SALARY FROM #ESS_TMP9
WHERE SUBSTRING(ESS_SUBJECTID,1,1) = '1' AND SALARY > 0
END
ELSE
SELECT * FROM #ESS_TMP9
DROP TABLE #ESS_TMP9