CREATE OR REPLACE PACKAGE BODY PKG_LEAVE AS
/*新
-- Add/modify columns
alter table HR_EMPLOYEE_ENJOY_LEAVE add PK_ORG char(20);
update HR_EMPLOYEE_ENJOY_LEAVE h set h.PK_ORG=(select chg.pk_hrorg from bd_psndoc psn inner join hi_psnorg chg on psn.pk_psndoc=chg.pk_psndoc and chg.lastflag='Y' where psn.pk_psndoc=h.pk_psndoc)
ERP数据库连接:
-- Drop existing database link
drop public database link ERP_DBL;
-- Create database link
create public database link ERP_DBL connect to CCIS0601 identified by TEST using '10.200.135.13:1521/orc9';
delete from HR_ELEAVE_MAPPING;
delete from HR_EMPLOYEE_ENJOY_LEAVE;
select * from tbm_timeitem;
生产系统:
1002Z710000000021ZLJ 年假
10018G1000000000BM37 上年年假
10018G1000000000BM2T 调整年假
10018G1000000000BM2P 年假延期
10018G1000000000BM2N 司龄假
10018G1000000000BM39 上年司龄假
10018G1000000000BM2R 司龄假延期
10018G1000000000BM2V 调整司龄假
10018G1000000000BM2L 补休
10018G1000000000BM33 调整补休
10018G1000000000BM35 补休延期
*/
/*********************************************************************************************************************
NAME: Auto_Gen_Employee_Leave
Declare
i Integer;
Begin
dbms_job.submit(i,'PKG_LEAVE.Auto_Gen_Employee_Leave;',Sysdate,'TRUNC(LAST_DAY(SYSDATE))+1+1/24');
end;
---查看定时任务
select * from user_jobs;
HISOTORY:
DATE NAME DESCRIPTION
2016-03-25 River PROCEDURE CREATED
***********************************************************************************************************************/
/*********************************************************************************************************************
NAME: pro_Supplement_Leave_Mapping
Declare
i Integer;
Begin
dbms_job.submit(i,'pkg_leave.pro_supplement_leave_mapping(presult => :presult);',Sysdate,'TRUNC(LAST_DAY(SYSDATE))+1+1/24');
end;
---查看定时任务
select * from user_jobs;
HISOTORY:
DATE NAME DESCRIPTION
2017-10-12 Waite PROCEDURE CREATED
***********************************************************************************************************************/
PROCEDURE Auto_Gen_Employee_Leave AS
vResult varchar(20);
begin
--当月1日生成员工假期后入职的同事,在下月生成假期时补生成上月1号后入职同事的假期
--公司所有部门使用后,开启此检测功能
--PKG_LEAVE.Gen_Employee_Leave(to_char(add_months(sysdate,-1),'YYYY'),to_char(add_months(sysdate,-1),'MM'),vResult);
PKG_LEAVE.Gen_Employee_Leave(to_char(sysdate,'YYYY'),to_char(add_months(sysdate,0),'MM'),vResult);--当前月份减一
pkg_leave.pro_supplement_leave_mapping(vResult);
end Auto_Gen_Employee_Leave;
/*********************************************************************************************************************
NAME: Auto_Gen_Try_Employee_Leave 追回试用期员工假期
Declare
i Integer;
Begin
dbms_job.submit(i,'PKG_LEAVE.Auto_Gen_Employee_Leave;',Sysdate,'TRUNC(LAST_DAY(SYSDATE))+1+1/24');
end;
---查看定时任务
select * from user_jobs;
HISOTORY:
DATE NAME DESCRIPTION
2016-03-25 River PROCEDURE CREATED
***********************************************************************************************************************/
PROCEDURE Auto_Gen_Try_Employee_Leave AS
vResult varchar(20);
begin
--当月1日生成员工假期后入职的同事,在下月生成假期时补生成上月1号后入职同事的假期
--公司所有部门使用后,开启此检测功能
--PKG_LEAVE.Gen_Employee_Leave(to_char(add_months(sysdate,-6),'YYYY'),to_char(add_months(sysdate,-6),'MM'),vResult);
--PKG_LEAVE.Gen_Employee_Leave(to_char(add_months(sysdate,-5),'YYYY'),to_char(add_months(sysdate,-5),'MM'),vResult);
--PKG_LEAVE.Gen_Employee_Leave(to_char(add_months(sysdate,-4),'YYYY'),to_char(add_months(sysdate,-4),'MM'),vResult);
--PKG_LEAVE.Gen_Employee_Leave(to_char(add_months(sysdate,-3),'YYYY'),to_char(add_months(sysdate,-3),'MM'),vResult);
--PKG_LEAVE.Gen_Employee_Leave(to_char(add_months(sysdate,-2),'YYYY'),to_char(add_months(sysdate,-2),'MM'),vResult);
--PKG_LEAVE.Gen_Employee_Leave(to_char(add_months(sysdate,-1),'YYYY'),to_char(add_months(sysdate,-1),'MM'),vResult);
PKG_LEAVE.Gen_Employee_Leave(to_char(sysdate,'YYYY'),to_char(sysdate,'MM'),vResult);
end Auto_Gen_Try_Employee_Leave;
/*********************************************************************************************************************
NAME: Auto_Gen_Employee_Leave
DESCRIPTION: Auto Gen Employee Leave /每月1日执行一次
DATE NAME DESCRIPTION
2015-12-28 River PROCEDURE CREATED
------------
--员工编号
--员工转正日期
--员工Hire_Date
--员工所在地:中、港、台
--员工职级
--员工年资
--员工每月应有年假
--员工每月应有司龄假
------------
***********************************************************************************************************************/
PROCEDURE Gen_Employee_Leave(pLEAVE_YEAR number ,pLEAVE_MONTH number,presult out varchar2) IS
CURSOR TEMP_CUR IS
select
psn.PK_PSNDOC,--员工 ID
psn.code psn_Code,--员工编号
psn.name psn_name,--员工名称
job.pk_org PK_HRORG, --使用最新的工作记录的组织
org.name org_name,--组织
org.code org_code,
to_date(chg.begindate,'YYYY-MM-DD') Working_age,--工龄Hire_Date---计算享有假期福利
to_date(job.begindate,'YYYY-MM-DD') Hire_Date, --当前岗位入职日期
to_date(job.jobglbdef29,'YYYY-MM-DD') Positive_Date, ---计算享有假期福利
--早期数据尚好转正日期,系统默认为入职日期+3个月
--to_date(nvl(job.jobglbdef29,to_char(add_months(to_date(chg.begindate,'YYYY-MM-DD'),3),'YYYY-MM-DD')),'YYYY-MM-DD') Positive_Date,
bd_defdoc1.name Grade ,---当前岗位职级 计算享有假期福利
(case when psn.code='0013' then 20 when psn.code='0151' then 17 else he.annual_day end) annual_day , --年假 ---香港特殊人员休假不按规则表 -- 鄧麗貞
he.working_age_day, --司龄假
he.extended_day,--可延假 (适用HK)
he.region,he.grade as rank,
-- job1.recordnum ,--记录序号
-- job1.endflag ,--是否结束
-- job1.lastflag ,--是否最新工作记录
-- bd_defdoc2.name ,--该记录岗位职级
to_date(job.begindate ,'YYYY-MM-DD') Adjustment_Date --变动日期
from bd_psndoc psn
inner join hi_psnorg chg on psn.pk_psndoc=chg.pk_psndoc and chg.lastflag='Y'
inner join hi_psnjob job on psn.pk_psndoc=job.pk_psndoc and job.lastflag='Y' and job.ismainjob='Y'--主职
inner join bd_defdoc bd_defdoc1 on job.jobglbdef28 = bd_defdoc1.pk_defdoc
inner join org_orgs org on job.pk_org = org.pk_org
inner join HR_EMPLOYEE_LEAVE_BENEFITS he on he.status=1
and he.grade=decode(upper(substr(bd_defdoc1.name,1,1)),'A',1,'B',2,'C',3,'D',4,'E',5,'F',6,'G',7)
and he.region =decode(substr(org.code,1,2),'HK',decode(job.pk_dept,'10016H100000000006XZ',4,2),'TA',3,1)
and decode(floor((to_date((to_char(pLEAVE_YEAR) || substr('0' || to_char(pLEAVE_MONTH),-2) || '01'),'YYYY-MM-DD')-to_date(chg.begindate,'YYYY-MM-DD'))/365+1),0,1,floor((to_date((to_char(pLEAVE_YEAR) || substr('0' || to_char(pLEAVE_MONTH),-2) || '01'),'YYYY-MM-DD')-to_date(chg.begindate,'YYYY-MM-DD'))/365+1)) between he.work_year_from and he.work_year_to
--UW floor((to_date((to_char(pLEAVE_YEAR) || substr('0' || to_char(pLEAVE_MONTH),-2) || '01'),'YYYY-MM-DD')-to_date(chg.begindate,'YYYY-MM-DD'))/365+1) between he.work_year_from and he.work_year_to
where to_char(to_date(chg.begindate,'YYYY-MM-DD'),'YYYYMMDD')<=to_char(add_months(to_date((to_char(pLEAVE_YEAR) || substr('0' || to_char(pLEAVE_MONTH),-2) || '01'),'YYYY-MM-DD'),1)-1, 'YYYYMMDD') and
--job.PK_DEPT IN ('10016H1000000000045F','10016H1000000000045T','10016H100000000002ZA','10016H100000000002ZO','10016H100000000005G2','10016H100000000007Z6','10016H100000000007ZK','10016H10000000000684','10016H100000000006TI','10016H100000000005GG') and -- OR code like '%CCIB%'
job.trnsevent<>4 and --非离职人员
--psn.glbdef30='10018G1000000000I4OV' and --DYX 10018G1000000000I4OV CCIB 10018G1000000000I4OW
to_char(add_months(to_date((to_char(pLEAVE_YEAR) || substr('0' || to_char(pLEAVE_MONTH),-2) || '01'),'YYYY-MM-DD'),1)-1, 'YYYYMMDD')
between replace(job.begindate,'-','') and
decode(job.enddate,null,to_char(add_months(to_date((to_char(pLEAVE_YEAR) || substr('0' || to_char(pLEAVE_MONTH),-2) || '01'),'YYYY-MM-DD'),1)-1, 'YYYYMMDD'),replace(job.enddate,'-','')) and
job.begindate is not null and --当前岗位Hire_Date
job.jobglbdef29 is not null and --入职转正日期不为空
--to_date(job.jobglbdef29,'YYYY-MM-DD')>to_date('2017-06-01','YYYY-MM-DD') and ---计算享有假期福利
--添加转正日期大于于6月1日的
bd_defdoc1.name is not null and --内部级别不为空
--台湾人员2018年1月前不需每月分配,兼职人员不需分配假期
substr(org.code,1,2) not in('TA') --and psn.pk_psndoc=(select pk_psndoc from bd_psndoc where code='0151')--betty
order by psn.PK_PSNDOC;
/*
1、员工享有假期基础数据表 HR_Employee_leave_benefits
drop table HR_EMPLOYEE_LEAVE_BENEFITS;
-- Create table
create table HR_EMPLOYEE_LEAVE_BENEFITS
(
ID NUMBER not null,
REGION NUMBER not null, -- 1、PRC 2、HK 3、TW
GRADE NUMBER not null, ---1、A 2、B 3、C 4、D 5、E 6、F 7、G
WORK_YEAR_FROM NUMBER not null, --工作年限 最小 1,6,11,16,21,22,23,24,25,26,27
WORK_YEAR_TO NUMBER not null, --工作年限 最大 5,10,15,20,21,22,23,24,25,26,27
annual_day NUMBER not null, --年假
Working_age_day NUMBER not null, --司龄假
extended_day NUMBER not null, --可延假
STATUS NUMBER default 1 not null, --null 无效 --1、有效
CREATE_DATE DATE default sysdate not null
);
-- Create sequence
create sequence HR_EMPLOYEE_LEAVE_BENEFITS_SEQ
minvalue 1
maxvalue 999999999999
start with 1
increment by 1
cache 30;
-- Create/Recreate primary, unique and foreign key constraints
alter table HR_EMPLOYEE_LEAVE_BENEFITS add constraint HR_EMPLOYEE_LEAVE_BENEFITS_PK primary key (ID);
alter table HR_EMPLOYEE_LEAVE_BENEFITS add constraint HR_EMPLOYEE_LEAVE_BENEFITS_UK unique (GRADE, REGION, WORK_YEAR_FROM, WORK_YEAR_TO, STATUS);
2、员工享有假期数据表 HR_EMPLOYEE_ENJOY_LEAVE
-- Create table
drop table HR_EMPLOYEE_ENJOY_LEAVE;
create table HR_EMPLOYEE_ENJOY_LEAVE
(
ID NUMBER not null,
PK_PSNDOC CHAR(20) not null, --员工 ID
PK_TIMEITEM CHAR(20) not null,--1、年假 2、司龄假 3、上年年假 4、上年司龄假 5、调整年假 6、调整司龄假 7、年假延期 8、司龄假延期 (在tbm_timeitem建立假期类型,再改ID)
LEAVE_YYYY NUMBER(4) not null, --YYYY
LEAVE_MM NUMBER(2) not null, --MM
LEAVE_QTY NUMBER(5,3) not null, --年假(天)、司龄假(天)、补休(小时)
LEAVE_UNIT NUMBER(1) default 1, --1、天 2、小时
START_DATE DATE not null,
END_DATE DATE not null,
FIRST_AUDIOR varchar(20), --主管审批sm_user
FIRST_AUDIT_DATE DATE,
FIRST_AUDIT_REMARK varchar(200),
SECOND_AUDIOR varchar(20), --HR审批sm_user
SECOND_AUDIT_DATE DATE,
SECOND_AUDIT_REMARK varchar(200),
THIRD_AUDIOR varchar(20), --sm_user
THIRD_AUDIT_DATE DATE,
THIRD_AUDIT_REMARK varchar(200),
FOURTH_AUDIOR varchar(20), --sm_user
FOURTH_AUDIT_DATE DATE,
FOURTH_AUDIT_REMARK varchar(200),
CREATE_DATE DATE default sysdate not null,
CREATOR varchar(20), --sm_user)
TS CHAR(19) default to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')
);
-- Create sequence
drop sequence HR_EMPLOYEE_ENJOY_LEAVE_SEQ;
create sequence HR_EMPLOYEE_ENJOY_LEAVE_SEQ
minvalue 1
maxvalue 999999999999
start with 1
increment by 1
cache 30;
-- Create/Recreate primary, unique and foreign key constraints
alter table HR_EMPLOYEE_ENJOY_LEAVE add constraint HR_EMPLOYEE_ENJOY_LEAVE_PK primary key (ID);
alter table HR_EMPLOYEE_ENJOY_LEAVE add constraint HR_EMPLOYEE_ENJOY_LEAVE_UK unique (PK_PSNDOC, PK_TIMEITEM, LEAVE_YYYY,LEAVE_MM);
*/
vResult varchar(20);
vRegion varchar(3);
vWorking_Year_Percent number; --本年可工作时间比例
vAverage_monthly_holidays number; --每月平均可有假期
vAnnual_day_addyear number; --年资加一年年假
vAnnual_day number; --年假
vWorking_age_day number; --司龄假
vPre_Extended_day number; --上年可延假
vPre_Working_Year_Percent number; --上年可工作时间比例
vTotal_Annual_day number; --已享有年假
vTotal_Working_age_day number; --已享有司龄假
vRecord_QTY number;
vCur_date date; --当前计假日期
vCur_End_date date; --当前年最后一天
vHire_Date_FirstMon_T_Day number; --试用期当月总天数
vCur_Date_YM number; --当前计假时间 YYYYMM
vCur_Month_Total_Day number; --当前计假月总天数
vEmp_Date_YM number; --员工入职时间 YYYYMM
vEmp_Date_Year number; --员工入职时间 YYYY
vEmp_Date_Month number; --员工入职时间 MM
vEmp_Date_Day number; --员工入职时间 DD
vPositive_Year number; --员工转正时间 YYYY
vPK_TIMEITEM CHAR(20) ; --当前假期类型 1、年假 2、司龄假 3、上年年假 4、上年司龄假 5、调整年假 6、调整司龄假 7、年假延期 8、司龄假延期 9、补休 10、调整补休 11、补休延期
vLEAVE_QTY number; --享有假期天数
vSTART_DATE date; --开始日期
vEND_DATE date; --结束日期
vTW_END_DATE date; --TW 结束日期
begin
presult:='Failed';
if pLEAVE_YEAR>2016 and pLEAVE_MONTH>0 and pLEAVE_MONTH <13 then
vCur_date:=to_date(to_char(pLEAVE_YEAR) || '-' || substr('00' || to_char(pLEAVE_MONTH),-2) || '-01','YYYY-MM-DD');--//当前计假日期
vCur_Date_YM:=to_number(to_char(vCur_date,'YYYYMM'));--//当前计假时间 YYYYMM
vCur_Month_Total_Day:=to_number(to_char(last_day(vCur_date),'DD'));--//当前计假月总天数
vCur_End_date:=to_date(to_char(vCur_date,'YYYY') || '-12-31','YYYY-MM-DD');--//当前年最后一天
vTW_END_DATE:=to_date(to_char(pLEAVE_YEAR+1) || '-03-31','YYYY-MM-DD');--//TW 结束日期
/*
1、区分1、PRC 2、HK 3、TW
2、是否当年1月,计算剩余假和延期数
3、根据员工职级、年资、计算假期、是否转正
11、PRC、HK、TW假期计算统一为:
a)每月1号,系统自动计算分给员工当月假期; 若员工A在3月10日由E职级升到D级,即其在3月1日用E级假期福利计算3月份的假,4月1日用D级假期福利计算4月份的假;
b)员工试用期间的假期在试用期过后才能申请使用;若PRC或HK员工A在9月1日入职(享D级5天年假,7天司龄假),第二年1月1日转正,在1月其可用年假为4天;
c)员工入职第一个月的应有假期,按当月工作天数比例计算;若员工A在1月10日由入职(享D级5天年假,7天司龄假),即1月应有假期为(31-10+1)/31 * (5+7)/12=0.704天年假
d) 若员工A有3天假期[年假/司龄假/补休]在2015年12月31日到期,系统允许在12月31日~1月5日(1、2、3日为公众假期)申请休这3天年假;
e)假期工龄计算:[1到5年]入职~未满5年 [6到10年]满5年~未满10年 [11到15年]满10年~未满15年 ,如此类推..;
员工A 入职日期:2015/9/10 转正日期:2015/12/9 1~5年工龄 6~10年工龄 …
PRC 2015/9/10~2020/9/9 2020/9/10~2025/9/9 …
HK 2015/9/10~2020/9/9 2020/9/10~2025/9/9 …
TW 2015/9/10~2020/9/9 2020/9/10~2025/9/9 …
f)年假/司龄假/补休假期保留3位小数;
g)增加假期延期申请功能、假期调整功能,具体权限分配由HR决定;
12、1月1日~6月30日PRC员工年资变动导致假期变化的,系统按员工最新假期福利先分摊年假,再分摊司龄假。7月1日~12月31日发生变化的全以司龄假分摊;
13、TW可预支不超过当年剩余的总年假,HK、PRC不能预支假期;
14、PRC、HK、TW员工在年底申请中的年假和司龄假,若没审批完,系统在1月1日将自动审批通过,否则影响延假计算。(此问题待HR提供解决办法)
--当前假期类型 1、年假 2、司龄假 3、上年年假 4、上年司龄假 5、调整年假 6、调整司龄假 7、年假延期 8、司龄假延期 9、补休 10、调整补休 11、补休延期
1002Z710000000021ZLJ 年假
10018G1000000000BM37 上年年假
10018G1000000000BM2T 调整年假
10018G1000000000BM2P 年假延期
10018G1000000000BM2N 司龄假
10018G1000000000BM39 上年司龄假
10018G1000000000BM2R 调整司龄假
10018G1000000000BM2V 司龄假延期
10018G1000000000BM2L 补休
10018G1000000000BM33 调整补休
10018G1000000000BM35 补休延期
*/
For TEMP_CUR_RECORD in TEMP_CUR loop
---员工所在地区
if substr(TEMP_CUR_RECORD.org_code,1,2)='HK' then
vRegion:= 'HK';
elsif substr(TEMP_CUR_RECORD.org_code,1,3)='TAI' then
vRegion:= 'TW';
else
vRegion:= 'PRC';
end if ;
--员工入职时间年月日
vEmp_Date_Year:=to_number(to_char(TEMP_CUR_RECORD.Working_age,'YYYY')); --员工入职时间 YYYY-mm-dd --//由Hire_Date改为Working_age
vEmp_Date_Month:=to_number(to_char(TEMP_CUR_RECORD.Working_age,'MM')); --员工入职时间 MM --//由Hire_Date改为Working_age
vEmp_Date_Day:=to_number(to_char(TEMP_CUR_RECORD.Working_age,'DD'));--员工入职时间 DD --//由Hire_Date改为Working_age
vEmp_Date_YM:=to_number(to_char(TEMP_CUR_RECORD.Working_age,'YYYYMM')); --员工入职时间 YYYYMM --//由Hire_Date改为Working_age
--计算假期的开始日期 & 结束日期
if TEMP_CUR_RECORD.Positive_Date>vCur_date then --转正日期>当前日期,员工还没转正,假期生效时间为转正日期
vSTART_DATE:=TEMP_CUR_RECORD.Positive_Date;--TEMP_CUR_RECORD.Positive_Date;--UW
--TW有效期15个月 ,PRC、HK当年有效
if vRegion= 'TW' then
vEND_DATE:=vTW_END_DATE;
else --
vPositive_Year:=to_number(to_char(TEMP_CUR_RECORD.Positive_Date,'YYYY')); ----员工转正时间 YYYY
if vPositive_Year>pLEAVE_YEAR then --跨年转正
vEND_DATE:=to_date(to_char(vPositive_Year) || '-12-31','YYYY-MM-DD');
else
vEND_DATE:=vCur_End_date;
end if;
end if;
else ---已经转正
vSTART_DATE:=vCur_date;
vEND_DATE:=vCur_End_date;
end if;
-------------跨年假期结转-------------------------------------
if pLEAVE_MONTH=1 then ---计算可延假 ,可延假>0 and 月份=1
--计算当年假期
if vEmp_Date_Year<(pLEAVE_YEAR-1) then --当前年大天其入职年
vPre_Working_Year_Percent:=1; --本年可工作时间比例
else--本年入职
vHire_Date_FirstMon_T_Day:=to_number(to_char(last_day(TEMP_CUR_RECORD.Working_age),'DD')); --试用期当月总天数 --//由Hire_Date改为Working_age
vPre_Working_Year_Percent:=(12-vEmp_Date_Month+(vHire_Date_FirstMon_T_Day-vEmp_Date_Day+1)/vHire_Date_FirstMon_T_Day)/12; --上年可工作时间比例
end if;
--he.annual_day, --年假
--he.working_age_day, --司龄假
--vPre_Extended_day:=TEMP_CUR_RECORD.extended_day*vPre_Working_Year_Percent; --上年可延假
--vPre_Extended_day:=TEMP_CUR_RECORD.working_age_day*vPre_Working_Year_Percent; --上年可延假
--if vPre_Extended_day>0 then ---计算可延假 ,可延假>0 and 月份=1
if vRegion= 'PRC' then
vPre_Extended_day:=TEMP_CUR_RECORD.working_age_day*vPre_Working_Year_Percent; --上年可延司龄假
vPK_TIMEITEM :='10018G1000000000BM39'; --当前假期类型 1、年假 2、司龄假 3、上年年假 4、上年司龄假 5、调整年假 6、调整司龄假 7、年假延期 8、司龄假延期
---检查数据是否已存在
select count(1) into vRecord_QTY from HR_EMPLOYEE_ENJOY_LEAVE h inner join HR_ELEAVE_MAPPING m on m.hr_employee_enjoy_leave_id=h.id where PK_PSNDOC=TEMP_CUR_RECORD.PK_PSNDOC and PK_ORG=TEMP_CUR_RECORD.PK_HRORG and LEAVE_YYYY=pLEAVE_YEAR and PK_TIMEITEM=vPK_TIMEITEM;
if vRecord_QTY=0 then--假期记录不存在 可以新增
delete from HR_EMPLOYEE_ENJOY_LEAVE where PK_PSNDOC=TEMP_CUR_RECORD.PK_PSNDOC and PK_ORG=TEMP_CUR_RECORD.PK_HRORG and LEAVE_YYYY=pLEAVE_YEAR and PK_TIMEITEM=vPK_TIMEITEM;
--计算剩余假期
select nvl(sum(lastdayorhour+realdayorhour -yidayorhour-freezedayorhour), 0) into vLEAVE_QTY from tbm_leavebalance where pk_psndoc=TEMP_CUR_RECORD.PK_PSNDOC and PK_ORG=TEMP_CUR_RECORD.PK_HRORG and curyear=to_char(pLEAVE_YEAR-1) and pk_timeitem='10018G1000000000BM2N';
if vLEAVE_QTY>vPre_Extended_day then -- 剩余假期 vLEAVE_QTY 若大于可延假 ,即只可带可延假数
vLEAVE_QTY:=vPre_Extended_day;
end if;
--新增加 可延司龄假
insert into HR_EMPLOYEE_ENJOY_LEAVE( ID, PK_PSNDOC,PK_ORG,LEAVE_YYYY,LEAVE_MM,PK_TIMEITEM,LEAVE_QTY,START_DATE,END_DATE) values(HR_EMPLOYEE_ENJOY_LEAVE_SEQ.NEXTVAL,TEMP_CUR_RECORD.
/*新
-- Add/modify columns
alter table HR_EMPLOYEE_ENJOY_LEAVE add PK_ORG char(20);
update HR_EMPLOYEE_ENJOY_LEAVE h set h.PK_ORG=(select chg.pk_hrorg from bd_psndoc psn inner join hi_psnorg chg on psn.pk_psndoc=chg.pk_psndoc and chg.lastflag='Y' where psn.pk_psndoc=h.pk_psndoc)
ERP数据库连接:
-- Drop existing database link
drop public database link ERP_DBL;
-- Create database link
create public database link ERP_DBL connect to CCIS0601 identified by TEST using '10.200.135.13:1521/orc9';
delete from HR_ELEAVE_MAPPING;
delete from HR_EMPLOYEE_ENJOY_LEAVE;
select * from tbm_timeitem;
生产系统:
1002Z710000000021ZLJ 年假
10018G1000000000BM37 上年年假
10018G1000000000BM2T 调整年假
10018G1000000000BM2P 年假延期
10018G1000000000BM2N 司龄假
10018G1000000000BM39 上年司龄假
10018G1000000000BM2R 司龄假延期
10018G1000000000BM2V 调整司龄假
10018G1000000000BM2L 补休
10018G1000000000BM33 调整补休
10018G1000000000BM35 补休延期
*/
/*********************************************************************************************************************
NAME: Auto_Gen_Employee_Leave
Declare
i Integer;
Begin
dbms_job.submit(i,'PKG_LEAVE.Auto_Gen_Employee_Leave;',Sysdate,'TRUNC(LAST_DAY(SYSDATE))+1+1/24');
end;
---查看定时任务
select * from user_jobs;
HISOTORY:
DATE NAME DESCRIPTION
2016-03-25 River PROCEDURE CREATED
***********************************************************************************************************************/
/*********************************************************************************************************************
NAME: pro_Supplement_Leave_Mapping
Declare
i Integer;
Begin
dbms_job.submit(i,'pkg_leave.pro_supplement_leave_mapping(presult => :presult);',Sysdate,'TRUNC(LAST_DAY(SYSDATE))+1+1/24');
end;
---查看定时任务
select * from user_jobs;
HISOTORY:
DATE NAME DESCRIPTION
2017-10-12 Waite PROCEDURE CREATED
***********************************************************************************************************************/
PROCEDURE Auto_Gen_Employee_Leave AS
vResult varchar(20);
begin
--当月1日生成员工假期后入职的同事,在下月生成假期时补生成上月1号后入职同事的假期
--公司所有部门使用后,开启此检测功能
--PKG_LEAVE.Gen_Employee_Leave(to_char(add_months(sysdate,-1),'YYYY'),to_char(add_months(sysdate,-1),'MM'),vResult);
PKG_LEAVE.Gen_Employee_Leave(to_char(sysdate,'YYYY'),to_char(add_months(sysdate,0),'MM'),vResult);--当前月份减一
pkg_leave.pro_supplement_leave_mapping(vResult);
end Auto_Gen_Employee_Leave;
/*********************************************************************************************************************
NAME: Auto_Gen_Try_Employee_Leave 追回试用期员工假期
Declare
i Integer;
Begin
dbms_job.submit(i,'PKG_LEAVE.Auto_Gen_Employee_Leave;',Sysdate,'TRUNC(LAST_DAY(SYSDATE))+1+1/24');
end;
---查看定时任务
select * from user_jobs;
HISOTORY:
DATE NAME DESCRIPTION
2016-03-25 River PROCEDURE CREATED
***********************************************************************************************************************/
PROCEDURE Auto_Gen_Try_Employee_Leave AS
vResult varchar(20);
begin
--当月1日生成员工假期后入职的同事,在下月生成假期时补生成上月1号后入职同事的假期
--公司所有部门使用后,开启此检测功能
--PKG_LEAVE.Gen_Employee_Leave(to_char(add_months(sysdate,-6),'YYYY'),to_char(add_months(sysdate,-6),'MM'),vResult);
--PKG_LEAVE.Gen_Employee_Leave(to_char(add_months(sysdate,-5),'YYYY'),to_char(add_months(sysdate,-5),'MM'),vResult);
--PKG_LEAVE.Gen_Employee_Leave(to_char(add_months(sysdate,-4),'YYYY'),to_char(add_months(sysdate,-4),'MM'),vResult);
--PKG_LEAVE.Gen_Employee_Leave(to_char(add_months(sysdate,-3),'YYYY'),to_char(add_months(sysdate,-3),'MM'),vResult);
--PKG_LEAVE.Gen_Employee_Leave(to_char(add_months(sysdate,-2),'YYYY'),to_char(add_months(sysdate,-2),'MM'),vResult);
--PKG_LEAVE.Gen_Employee_Leave(to_char(add_months(sysdate,-1),'YYYY'),to_char(add_months(sysdate,-1),'MM'),vResult);
PKG_LEAVE.Gen_Employee_Leave(to_char(sysdate,'YYYY'),to_char(sysdate,'MM'),vResult);
end Auto_Gen_Try_Employee_Leave;
/*********************************************************************************************************************
NAME: Auto_Gen_Employee_Leave
DESCRIPTION: Auto Gen Employee Leave /每月1日执行一次
DATE NAME DESCRIPTION
2015-12-28 River PROCEDURE CREATED
------------
--员工编号
--员工转正日期
--员工Hire_Date
--员工所在地:中、港、台
--员工职级
--员工年资
--员工每月应有年假
--员工每月应有司龄假
------------
***********************************************************************************************************************/
PROCEDURE Gen_Employee_Leave(pLEAVE_YEAR number ,pLEAVE_MONTH number,presult out varchar2) IS
CURSOR TEMP_CUR IS
select
psn.PK_PSNDOC,--员工 ID
psn.code psn_Code,--员工编号
psn.name psn_name,--员工名称
job.pk_org PK_HRORG, --使用最新的工作记录的组织
org.name org_name,--组织
org.code org_code,
to_date(chg.begindate,'YYYY-MM-DD') Working_age,--工龄Hire_Date---计算享有假期福利
to_date(job.begindate,'YYYY-MM-DD') Hire_Date, --当前岗位入职日期
to_date(job.jobglbdef29,'YYYY-MM-DD') Positive_Date, ---计算享有假期福利
--早期数据尚好转正日期,系统默认为入职日期+3个月
--to_date(nvl(job.jobglbdef29,to_char(add_months(to_date(chg.begindate,'YYYY-MM-DD'),3),'YYYY-MM-DD')),'YYYY-MM-DD') Positive_Date,
bd_defdoc1.name Grade ,---当前岗位职级 计算享有假期福利
(case when psn.code='0013' then 20 when psn.code='0151' then 17 else he.annual_day end) annual_day , --年假 ---香港特殊人员休假不按规则表 -- 鄧麗貞
he.working_age_day, --司龄假
he.extended_day,--可延假 (适用HK)
he.region,he.grade as rank,
-- job1.recordnum ,--记录序号
-- job1.endflag ,--是否结束
-- job1.lastflag ,--是否最新工作记录
-- bd_defdoc2.name ,--该记录岗位职级
to_date(job.begindate ,'YYYY-MM-DD') Adjustment_Date --变动日期
from bd_psndoc psn
inner join hi_psnorg chg on psn.pk_psndoc=chg.pk_psndoc and chg.lastflag='Y'
inner join hi_psnjob job on psn.pk_psndoc=job.pk_psndoc and job.lastflag='Y' and job.ismainjob='Y'--主职
inner join bd_defdoc bd_defdoc1 on job.jobglbdef28 = bd_defdoc1.pk_defdoc
inner join org_orgs org on job.pk_org = org.pk_org
inner join HR_EMPLOYEE_LEAVE_BENEFITS he on he.status=1
and he.grade=decode(upper(substr(bd_defdoc1.name,1,1)),'A',1,'B',2,'C',3,'D',4,'E',5,'F',6,'G',7)
and he.region =decode(substr(org.code,1,2),'HK',decode(job.pk_dept,'10016H100000000006XZ',4,2),'TA',3,1)
and decode(floor((to_date((to_char(pLEAVE_YEAR) || substr('0' || to_char(pLEAVE_MONTH),-2) || '01'),'YYYY-MM-DD')-to_date(chg.begindate,'YYYY-MM-DD'))/365+1),0,1,floor((to_date((to_char(pLEAVE_YEAR) || substr('0' || to_char(pLEAVE_MONTH),-2) || '01'),'YYYY-MM-DD')-to_date(chg.begindate,'YYYY-MM-DD'))/365+1)) between he.work_year_from and he.work_year_to
--UW floor((to_date((to_char(pLEAVE_YEAR) || substr('0' || to_char(pLEAVE_MONTH),-2) || '01'),'YYYY-MM-DD')-to_date(chg.begindate,'YYYY-MM-DD'))/365+1) between he.work_year_from and he.work_year_to
where to_char(to_date(chg.begindate,'YYYY-MM-DD'),'YYYYMMDD')<=to_char(add_months(to_date((to_char(pLEAVE_YEAR) || substr('0' || to_char(pLEAVE_MONTH),-2) || '01'),'YYYY-MM-DD'),1)-1, 'YYYYMMDD') and
--job.PK_DEPT IN ('10016H1000000000045F','10016H1000000000045T','10016H100000000002ZA','10016H100000000002ZO','10016H100000000005G2','10016H100000000007Z6','10016H100000000007ZK','10016H10000000000684','10016H100000000006TI','10016H100000000005GG') and -- OR code like '%CCIB%'
job.trnsevent<>4 and --非离职人员
--psn.glbdef30='10018G1000000000I4OV' and --DYX 10018G1000000000I4OV CCIB 10018G1000000000I4OW
to_char(add_months(to_date((to_char(pLEAVE_YEAR) || substr('0' || to_char(pLEAVE_MONTH),-2) || '01'),'YYYY-MM-DD'),1)-1, 'YYYYMMDD')
between replace(job.begindate,'-','') and
decode(job.enddate,null,to_char(add_months(to_date((to_char(pLEAVE_YEAR) || substr('0' || to_char(pLEAVE_MONTH),-2) || '01'),'YYYY-MM-DD'),1)-1, 'YYYYMMDD'),replace(job.enddate,'-','')) and
job.begindate is not null and --当前岗位Hire_Date
job.jobglbdef29 is not null and --入职转正日期不为空
--to_date(job.jobglbdef29,'YYYY-MM-DD')>to_date('2017-06-01','YYYY-MM-DD') and ---计算享有假期福利
--添加转正日期大于于6月1日的
bd_defdoc1.name is not null and --内部级别不为空
--台湾人员2018年1月前不需每月分配,兼职人员不需分配假期
substr(org.code,1,2) not in('TA') --and psn.pk_psndoc=(select pk_psndoc from bd_psndoc where code='0151')--betty
order by psn.PK_PSNDOC;
/*
1、员工享有假期基础数据表 HR_Employee_leave_benefits
drop table HR_EMPLOYEE_LEAVE_BENEFITS;
-- Create table
create table HR_EMPLOYEE_LEAVE_BENEFITS
(
ID NUMBER not null,
REGION NUMBER not null, -- 1、PRC 2、HK 3、TW
GRADE NUMBER not null, ---1、A 2、B 3、C 4、D 5、E 6、F 7、G
WORK_YEAR_FROM NUMBER not null, --工作年限 最小 1,6,11,16,21,22,23,24,25,26,27
WORK_YEAR_TO NUMBER not null, --工作年限 最大 5,10,15,20,21,22,23,24,25,26,27
annual_day NUMBER not null, --年假
Working_age_day NUMBER not null, --司龄假
extended_day NUMBER not null, --可延假
STATUS NUMBER default 1 not null, --null 无效 --1、有效
CREATE_DATE DATE default sysdate not null
);
-- Create sequence
create sequence HR_EMPLOYEE_LEAVE_BENEFITS_SEQ
minvalue 1
maxvalue 999999999999
start with 1
increment by 1
cache 30;
-- Create/Recreate primary, unique and foreign key constraints
alter table HR_EMPLOYEE_LEAVE_BENEFITS add constraint HR_EMPLOYEE_LEAVE_BENEFITS_PK primary key (ID);
alter table HR_EMPLOYEE_LEAVE_BENEFITS add constraint HR_EMPLOYEE_LEAVE_BENEFITS_UK unique (GRADE, REGION, WORK_YEAR_FROM, WORK_YEAR_TO, STATUS);
2、员工享有假期数据表 HR_EMPLOYEE_ENJOY_LEAVE
-- Create table
drop table HR_EMPLOYEE_ENJOY_LEAVE;
create table HR_EMPLOYEE_ENJOY_LEAVE
(
ID NUMBER not null,
PK_PSNDOC CHAR(20) not null, --员工 ID
PK_TIMEITEM CHAR(20) not null,--1、年假 2、司龄假 3、上年年假 4、上年司龄假 5、调整年假 6、调整司龄假 7、年假延期 8、司龄假延期 (在tbm_timeitem建立假期类型,再改ID)
LEAVE_YYYY NUMBER(4) not null, --YYYY
LEAVE_MM NUMBER(2) not null, --MM
LEAVE_QTY NUMBER(5,3) not null, --年假(天)、司龄假(天)、补休(小时)
LEAVE_UNIT NUMBER(1) default 1, --1、天 2、小时
START_DATE DATE not null,
END_DATE DATE not null,
FIRST_AUDIOR varchar(20), --主管审批sm_user
FIRST_AUDIT_DATE DATE,
FIRST_AUDIT_REMARK varchar(200),
SECOND_AUDIOR varchar(20), --HR审批sm_user
SECOND_AUDIT_DATE DATE,
SECOND_AUDIT_REMARK varchar(200),
THIRD_AUDIOR varchar(20), --sm_user
THIRD_AUDIT_DATE DATE,
THIRD_AUDIT_REMARK varchar(200),
FOURTH_AUDIOR varchar(20), --sm_user
FOURTH_AUDIT_DATE DATE,
FOURTH_AUDIT_REMARK varchar(200),
CREATE_DATE DATE default sysdate not null,
CREATOR varchar(20), --sm_user)
TS CHAR(19) default to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')
);
-- Create sequence
drop sequence HR_EMPLOYEE_ENJOY_LEAVE_SEQ;
create sequence HR_EMPLOYEE_ENJOY_LEAVE_SEQ
minvalue 1
maxvalue 999999999999
start with 1
increment by 1
cache 30;
-- Create/Recreate primary, unique and foreign key constraints
alter table HR_EMPLOYEE_ENJOY_LEAVE add constraint HR_EMPLOYEE_ENJOY_LEAVE_PK primary key (ID);
alter table HR_EMPLOYEE_ENJOY_LEAVE add constraint HR_EMPLOYEE_ENJOY_LEAVE_UK unique (PK_PSNDOC, PK_TIMEITEM, LEAVE_YYYY,LEAVE_MM);
*/
vResult varchar(20);
vRegion varchar(3);
vWorking_Year_Percent number; --本年可工作时间比例
vAverage_monthly_holidays number; --每月平均可有假期
vAnnual_day_addyear number; --年资加一年年假
vAnnual_day number; --年假
vWorking_age_day number; --司龄假
vPre_Extended_day number; --上年可延假
vPre_Working_Year_Percent number; --上年可工作时间比例
vTotal_Annual_day number; --已享有年假
vTotal_Working_age_day number; --已享有司龄假
vRecord_QTY number;
vCur_date date; --当前计假日期
vCur_End_date date; --当前年最后一天
vHire_Date_FirstMon_T_Day number; --试用期当月总天数
vCur_Date_YM number; --当前计假时间 YYYYMM
vCur_Month_Total_Day number; --当前计假月总天数
vEmp_Date_YM number; --员工入职时间 YYYYMM
vEmp_Date_Year number; --员工入职时间 YYYY
vEmp_Date_Month number; --员工入职时间 MM
vEmp_Date_Day number; --员工入职时间 DD
vPositive_Year number; --员工转正时间 YYYY
vPK_TIMEITEM CHAR(20) ; --当前假期类型 1、年假 2、司龄假 3、上年年假 4、上年司龄假 5、调整年假 6、调整司龄假 7、年假延期 8、司龄假延期 9、补休 10、调整补休 11、补休延期
vLEAVE_QTY number; --享有假期天数
vSTART_DATE date; --开始日期
vEND_DATE date; --结束日期
vTW_END_DATE date; --TW 结束日期
begin
presult:='Failed';
if pLEAVE_YEAR>2016 and pLEAVE_MONTH>0 and pLEAVE_MONTH <13 then
vCur_date:=to_date(to_char(pLEAVE_YEAR) || '-' || substr('00' || to_char(pLEAVE_MONTH),-2) || '-01','YYYY-MM-DD');--//当前计假日期
vCur_Date_YM:=to_number(to_char(vCur_date,'YYYYMM'));--//当前计假时间 YYYYMM
vCur_Month_Total_Day:=to_number(to_char(last_day(vCur_date),'DD'));--//当前计假月总天数
vCur_End_date:=to_date(to_char(vCur_date,'YYYY') || '-12-31','YYYY-MM-DD');--//当前年最后一天
vTW_END_DATE:=to_date(to_char(pLEAVE_YEAR+1) || '-03-31','YYYY-MM-DD');--//TW 结束日期
/*
1、区分1、PRC 2、HK 3、TW
2、是否当年1月,计算剩余假和延期数
3、根据员工职级、年资、计算假期、是否转正
11、PRC、HK、TW假期计算统一为:
a)每月1号,系统自动计算分给员工当月假期; 若员工A在3月10日由E职级升到D级,即其在3月1日用E级假期福利计算3月份的假,4月1日用D级假期福利计算4月份的假;
b)员工试用期间的假期在试用期过后才能申请使用;若PRC或HK员工A在9月1日入职(享D级5天年假,7天司龄假),第二年1月1日转正,在1月其可用年假为4天;
c)员工入职第一个月的应有假期,按当月工作天数比例计算;若员工A在1月10日由入职(享D级5天年假,7天司龄假),即1月应有假期为(31-10+1)/31 * (5+7)/12=0.704天年假
d) 若员工A有3天假期[年假/司龄假/补休]在2015年12月31日到期,系统允许在12月31日~1月5日(1、2、3日为公众假期)申请休这3天年假;
e)假期工龄计算:[1到5年]入职~未满5年 [6到10年]满5年~未满10年 [11到15年]满10年~未满15年 ,如此类推..;
员工A 入职日期:2015/9/10 转正日期:2015/12/9 1~5年工龄 6~10年工龄 …
PRC 2015/9/10~2020/9/9 2020/9/10~2025/9/9 …
HK 2015/9/10~2020/9/9 2020/9/10~2025/9/9 …
TW 2015/9/10~2020/9/9 2020/9/10~2025/9/9 …
f)年假/司龄假/补休假期保留3位小数;
g)增加假期延期申请功能、假期调整功能,具体权限分配由HR决定;
12、1月1日~6月30日PRC员工年资变动导致假期变化的,系统按员工最新假期福利先分摊年假,再分摊司龄假。7月1日~12月31日发生变化的全以司龄假分摊;
13、TW可预支不超过当年剩余的总年假,HK、PRC不能预支假期;
14、PRC、HK、TW员工在年底申请中的年假和司龄假,若没审批完,系统在1月1日将自动审批通过,否则影响延假计算。(此问题待HR提供解决办法)
--当前假期类型 1、年假 2、司龄假 3、上年年假 4、上年司龄假 5、调整年假 6、调整司龄假 7、年假延期 8、司龄假延期 9、补休 10、调整补休 11、补休延期
1002Z710000000021ZLJ 年假
10018G1000000000BM37 上年年假
10018G1000000000BM2T 调整年假
10018G1000000000BM2P 年假延期
10018G1000000000BM2N 司龄假
10018G1000000000BM39 上年司龄假
10018G1000000000BM2R 调整司龄假
10018G1000000000BM2V 司龄假延期
10018G1000000000BM2L 补休
10018G1000000000BM33 调整补休
10018G1000000000BM35 补休延期
*/
For TEMP_CUR_RECORD in TEMP_CUR loop
---员工所在地区
if substr(TEMP_CUR_RECORD.org_code,1,2)='HK' then
vRegion:= 'HK';
elsif substr(TEMP_CUR_RECORD.org_code,1,3)='TAI' then
vRegion:= 'TW';
else
vRegion:= 'PRC';
end if ;
--员工入职时间年月日
vEmp_Date_Year:=to_number(to_char(TEMP_CUR_RECORD.Working_age,'YYYY')); --员工入职时间 YYYY-mm-dd --//由Hire_Date改为Working_age
vEmp_Date_Month:=to_number(to_char(TEMP_CUR_RECORD.Working_age,'MM')); --员工入职时间 MM --//由Hire_Date改为Working_age
vEmp_Date_Day:=to_number(to_char(TEMP_CUR_RECORD.Working_age,'DD'));--员工入职时间 DD --//由Hire_Date改为Working_age
vEmp_Date_YM:=to_number(to_char(TEMP_CUR_RECORD.Working_age,'YYYYMM')); --员工入职时间 YYYYMM --//由Hire_Date改为Working_age
--计算假期的开始日期 & 结束日期
if TEMP_CUR_RECORD.Positive_Date>vCur_date then --转正日期>当前日期,员工还没转正,假期生效时间为转正日期
vSTART_DATE:=TEMP_CUR_RECORD.Positive_Date;--TEMP_CUR_RECORD.Positive_Date;--UW
--TW有效期15个月 ,PRC、HK当年有效
if vRegion= 'TW' then
vEND_DATE:=vTW_END_DATE;
else --
vPositive_Year:=to_number(to_char(TEMP_CUR_RECORD.Positive_Date,'YYYY')); ----员工转正时间 YYYY
if vPositive_Year>pLEAVE_YEAR then --跨年转正
vEND_DATE:=to_date(to_char(vPositive_Year) || '-12-31','YYYY-MM-DD');
else
vEND_DATE:=vCur_End_date;
end if;
end if;
else ---已经转正
vSTART_DATE:=vCur_date;
vEND_DATE:=vCur_End_date;
end if;
-------------跨年假期结转-------------------------------------
if pLEAVE_MONTH=1 then ---计算可延假 ,可延假>0 and 月份=1
--计算当年假期
if vEmp_Date_Year<(pLEAVE_YEAR-1) then --当前年大天其入职年
vPre_Working_Year_Percent:=1; --本年可工作时间比例
else--本年入职
vHire_Date_FirstMon_T_Day:=to_number(to_char(last_day(TEMP_CUR_RECORD.Working_age),'DD')); --试用期当月总天数 --//由Hire_Date改为Working_age
vPre_Working_Year_Percent:=(12-vEmp_Date_Month+(vHire_Date_FirstMon_T_Day-vEmp_Date_Day+1)/vHire_Date_FirstMon_T_Day)/12; --上年可工作时间比例
end if;
--he.annual_day, --年假
--he.working_age_day, --司龄假
--vPre_Extended_day:=TEMP_CUR_RECORD.extended_day*vPre_Working_Year_Percent; --上年可延假
--vPre_Extended_day:=TEMP_CUR_RECORD.working_age_day*vPre_Working_Year_Percent; --上年可延假
--if vPre_Extended_day>0 then ---计算可延假 ,可延假>0 and 月份=1
if vRegion= 'PRC' then
vPre_Extended_day:=TEMP_CUR_RECORD.working_age_day*vPre_Working_Year_Percent; --上年可延司龄假
vPK_TIMEITEM :='10018G1000000000BM39'; --当前假期类型 1、年假 2、司龄假 3、上年年假 4、上年司龄假 5、调整年假 6、调整司龄假 7、年假延期 8、司龄假延期
---检查数据是否已存在
select count(1) into vRecord_QTY from HR_EMPLOYEE_ENJOY_LEAVE h inner join HR_ELEAVE_MAPPING m on m.hr_employee_enjoy_leave_id=h.id where PK_PSNDOC=TEMP_CUR_RECORD.PK_PSNDOC and PK_ORG=TEMP_CUR_RECORD.PK_HRORG and LEAVE_YYYY=pLEAVE_YEAR and PK_TIMEITEM=vPK_TIMEITEM;
if vRecord_QTY=0 then--假期记录不存在 可以新增
delete from HR_EMPLOYEE_ENJOY_LEAVE where PK_PSNDOC=TEMP_CUR_RECORD.PK_PSNDOC and PK_ORG=TEMP_CUR_RECORD.PK_HRORG and LEAVE_YYYY=pLEAVE_YEAR and PK_TIMEITEM=vPK_TIMEITEM;
--计算剩余假期
select nvl(sum(lastdayorhour+realdayorhour -yidayorhour-freezedayorhour), 0) into vLEAVE_QTY from tbm_leavebalance where pk_psndoc=TEMP_CUR_RECORD.PK_PSNDOC and PK_ORG=TEMP_CUR_RECORD.PK_HRORG and curyear=to_char(pLEAVE_YEAR-1) and pk_timeitem='10018G1000000000BM2N';
if vLEAVE_QTY>vPre_Extended_day then -- 剩余假期 vLEAVE_QTY 若大于可延假 ,即只可带可延假数
vLEAVE_QTY:=vPre_Extended_day;
end if;
--新增加 可延司龄假
insert into HR_EMPLOYEE_ENJOY_LEAVE( ID, PK_PSNDOC,PK_ORG,LEAVE_YYYY,LEAVE_MM,PK_TIMEITEM,LEAVE_QTY,START_DATE,END_DATE) values(HR_EMPLOYEE_ENJOY_LEAVE_SEQ.NEXTVAL,TEMP_CUR_RECORD.