215 lines
7.2 KiB
Plaintext
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 |