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.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,pLEAVE_YEAR,pLEAVE_MONTH,vPK_TIMEITEM, Ceil(vLEAVE_QTY * 1000)/1000,vCur_date,vCur_End_date);
----当前假期类型 2、司龄假 4、可延司龄假 (注意假期有效期)
update tbm_leavebalance set lastdayorhour=vLEAVE_QTY
where pk_psndoc=TEMP_CUR_RECORD.PK_PSNDOC and PK_ORG=TEMP_CUR_RECORD.PK_HRORG and curyear=to_char(pLEAVE_YEAR) and pk_timeitem='10018G1000000000BM2N';
end if;
vPre_Extended_day:=TEMP_CUR_RECORD.annual_day*vPre_Working_Year_Percent; --上年可延年假
vPK_TIMEITEM :='10018G1000000000BM37'; --当前假期类型 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='1002Z710000000021ZLJ';
if vLEAVE_QTY>0 then -- 剩余假期 vLEAVE_QTY 若大于可延假 ,即只可带可延假数
if vLEAVE_QTY>vPre_Extended_day then
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.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,pLEAVE_YEAR,pLEAVE_MONTH,vPK_TIMEITEM,Ceil(vLEAVE_QTY * 1000)/1000,vCur_date,vCur_End_date);
update tbm_leavebalance set lastdayorhour=vLEAVE_QTY
where pk_psndoc=TEMP_CUR_RECORD.PK_PSNDOC and PK_ORG=TEMP_CUR_RECORD.PK_HRORG and curyear=to_char(pLEAVE_YEAR) and pk_timeitem='1002Z710000000021ZLJ';
end if;
end if;
elsif vRegion= 'HK' then --vRegion= 'HK'
vPre_Extended_day:=TEMP_CUR_RECORD.extended_day*vPre_Working_Year_Percent; --上年可延假
vPK_TIMEITEM :='10018G1000000000BM37'; --当前假期类型 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='1002Z710000000021ZLJ';
if vLEAVE_QTY>0 then -- 剩余假期 vLEAVE_QTY 若大于可延假 ,即只可带可延假数
if vLEAVE_QTY>vPre_Extended_day then
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.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,pLEAVE_YEAR,pLEAVE_MONTH,vPK_TIMEITEM,Ceil(vLEAVE_QTY * 1000)/1000,vCur_date,vCur_End_date);
update tbm_leavebalance set lastdayorhour=round(vLEAVE_QTY*2,0)/2
where pk_psndoc=TEMP_CUR_RECORD.PK_PSNDOC and PK_ORG=TEMP_CUR_RECORD.PK_HRORG and curyear=to_char(pLEAVE_YEAR) and pk_timeitem='1002Z710000000021ZLJ';
end if;
end if;
elsif vRegion= 'TW' then --台湾假期,有效期15个月
--vPre_Extended_day:=TEMP_CUR_RECORD.extended_day*vPre_Working_Year_Percent; --上年可延假(新增)
vPK_TIMEITEM :='10018G1000000000BM37'; --当前假期类型 1、年假 2、司龄假 3、上年年假 4、上年司龄假 5、调整年假 6、调整司龄假 7、年假延期 8、司龄假延期
---检查数据是否已存在
select count(1) into vRecord_QTY from HR_EMPLOYEE_ENJOY_LEAVE where PK_PSNDOC=TEMP_CUR_RECORD.PK_PSNDOC and LEAVE_YYYY=pLEAVE_YEAR and PK_TIMEITEM=vPK_TIMEITEM;
if vRecord_QTY=0 then--假期记录不存在 可以新增
--计算剩余假期
--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='1002Z710000000021ZLJ';
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='1002Z710000000021ZLJ';
--if vLEAVE_QTY>vPre_Extended_day then -- 剩余假期 vLEAVE_QTY 若大于可延假 ,即只可带可延假数
-- vLEAVE_QTY:=vPre_Extended_day;
--end if;
--新增加 可延年假 --TW 上年年假可延到下一年3月31日
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.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,pLEAVE_YEAR,pLEAVE_MONTH,vPK_TIMEITEM,Ceil(vLEAVE_QTY * 1000)/1000,vCur_date,to_date(to_char(pLEAVE_YEAR) || '-03-31','YYYY-MM-DD'));
update tbm_leavebalance set lastdayorhour=vLEAVE_QTY
where pk_psndoc=TEMP_CUR_RECORD.PK_PSNDOC and PK_ORG=TEMP_CUR_RECORD.PK_HRORG and curyear=to_char(pLEAVE_YEAR) and pk_timeitem='1002Z710000000021ZLJ';
end if;
end if;
--end if;
end if;
--------------------------------------------------
--计算上年可延假
if vEmp_Date_Year
vPre_Working_Year_Percent:=1; --上年可工作时间比例
--else--上年入职
-- vHire_Date_FirstMon_T_Day:=to_number(to_char(last_day(TEMP_CUR_RECORD.Hire_Date),'DD')); --试用期当月总天数
-- vPre_Working_Year_Percent:=(vHire_Date_FirstMon_T_Day-vEmp_Date_Day+1)/vHire_Date_FirstMon_T_Day+(12-vEmp_Date_Month)/12; --本年可工作时间比例
end if;
--计算当年假期
--判断是否大陆,大陆有司龄假
if vEmp_Date_Year if vRegion= 'PRC' then
vWorking_Year_Percent:=1; --本年可工作时间比例
elsif vRegion= 'TW' then
vWorking_Year_Percent:=(12-vEmp_Date_Month+1)/12;--本年未分配应享有年假比例,当年年资增加前比例
--比例需要分开,入职月份作为区分 vEmp_Date_Month
else
vWorking_Year_Percent:=1;--本年未分配应享有年假比例
--比例需要分开,入职月份作为区分 vEmp_Date_Month
end if;
else--本年入职
vHire_Date_FirstMon_T_Day:=to_number(to_char(last_day(TEMP_CUR_RECORD.Working_age),'DD')); --试用期当月总天数--//由Hire_Date改为Working_age
vWorking_Year_Percent:=(12-vEmp_Date_Month+(vHire_Date_FirstMon_T_Day-vEmp_Date_Day+1)/vHire_Date_FirstMon_T_Day)/12; --本年可工作时间比例
end if;
if vRegion= 'PRC' then
vAnnual_day:=TEMP_CUR_RECORD.annual_day*vWorking_Year_Percent; --本年应有年假
vWorking_age_day:=TEMP_CUR_RECORD.working_age_day*vWorking_Year_Percent; --本年应有司龄假
---====add by waite
elsif vRegion= 'TW' then
--计算本年 已分配的年假
select nvl(sum(LEAVE_QTY),0) into vTotal_Annual_day from HR_EMPLOYEE_ENJOY_LEAVE where PK_PSNDOC=TEMP_CUR_RECORD.PK_PSNDOC and PK_ORG=TEMP_CUR_RECORD.PK_HRORG and PK_TIMEITEM='1002Z710000000021ZLJ' and LEAVE_YYYY=pLEAVE_YEAR;
--入职月份小于当前月份
if vEmp_Date_Month vAnnual_day:=TEMP_CUR_RECORD.annual_day*((12-pLEAVE_MONTH+1)/12)+vTotal_Annual_day; --本年应有年假,已分配加上未分配
else
select annual_day into vAnnual_day_addyear from HR_EMPLOYEE_LEAVE_BENEFITS where region=TEMP_CUR_RECORD.region and grade=TEMP_CUR_RECORD.rank and floor((to_date((to_char(pLEAVE_YEAR) || substr('0' || to_char(pLEAVE_MONTH),-2) || '01'),'YYYY-MM-DD')-TEMP_CUR_RECORD.Working_age)/365+2) between work_year_from and work_year_to;
vAnnual_day:=TEMP_CUR_RECORD.annual_day*((vEmp_Date_Month-pLEAVE_MONTH+1)/12)+vTotal_Annual_day+vAnnual_day_addyear*((12-vEmp_Date_Month)/12); --本年应有年假 加年资加一未分配
end if;
else--HK
--计算本年 已分配的年假
--select nvl(sum(LEAVE_QTY),0) into vTotal_Annual_day from HR_EMPLOYEE_ENJOY_LEAVE where PK_PSNDOC=TEMP_CUR_RECORD.PK_PSNDOC and PK_ORG=TEMP_CUR_RECORD.PK_HRORG and PK_TIMEITEM='1002Z710000000021ZLJ' and LEAVE_YYYY=pLEAVE_YEAR;
vAnnual_day:=TEMP_CUR_RECORD.annual_day*vWorking_Year_Percent;--本年应有年假
end if;
--计算本月工作天数,可享的假期
if vCur_Date_YM>vEmp_Date_YM then --计假年月 大于 入职年月,即员工全月工作,享当月假
vAverage_monthly_holidays:=(TEMP_CUR_RECORD.working_age_day+TEMP_CUR_RECORD.annual_day)/12; --每月平均可有假期
elsif vCur_Date_YM=vEmp_Date_YM then --计假年月 等于 入职年月,即员工可能不是全月工作,享当月比例的假
vAverage_monthly_holidays:=((vCur_Month_Total_Day-vEmp_Date_Day+1)/vCur_Month_Total_Day) * (TEMP_CUR_RECORD.working_age_day+TEMP_CUR_RECORD.annual_day)/12;
end if;
--计算本年 已分配的年假
select nvl(sum(LEAVE_QTY),0) into vTotal_Annual_day from HR_EMPLOYEE_ENJOY_LEAVE where PK_PSNDOC=TEMP_CUR_RECORD.PK_PSNDOC and PK_ORG=TEMP_CUR_RECORD.PK_HRORG and PK_TIMEITEM='1002Z710000000021ZLJ' and LEAVE_YYYY=pLEAVE_YEAR;
--计算本年 已分配的司龄假
select nvl(sum(LEAVE_QTY),0) into vTotal_Working_age_day from HR_EMPLOYEE_ENJOY_LEAVE where PK_PSNDOC=TEMP_CUR_RECORD.PK_PSNDOC and PK_ORG=TEMP_CUR_RECORD.PK_HRORG and PK_TIMEITEM='10018G1000000000BM2N' and LEAVE_YYYY=pLEAVE_YEAR;
---检查数据是否已存在
select count(1) into vRecord_QTY from HR_EMPLOYEE_ENJOY_LEAVE where PK_PSNDOC=TEMP_CUR_RECORD.PK_PSNDOC and PK_ORG=TEMP_CUR_RECORD.PK_HRORG and PK_TIMEITEM in ('1002Z710000000021ZLJ','10018G1000000000BM2N') and LEAVE_YYYY=pLEAVE_YEAR and LEAVE_MM=pLEAVE_MONTH;
if vRecord_QTY=0 then--假期记录不存在 可以新增
/*
vAnnual_day --本年应有年假
vWorking_age_day --本年应有司龄假
vAverage_monthly_holidays --每月平均可有假期
vTotal_Annual_day--已分配的年假
vTotal_Working_age_day--已分配的司龄假
1月1日~6月30日PRC员工年资变动导致假期变化的,系统按员工最新假期福利先分摊年假,再分摊司龄假。7月1日~12月31日发生变化的全以司龄假分摊;
*/
if to_number(to_char(TEMP_CUR_RECORD.Working_age,'YYYY'))>=pLEAVE_YEAR then --入职日期大于等于计算假歁的年度,应享假期按比例计算
--2016-08上线 PRC地区分配司龄假
if (vRegion='PRC' and pLEAVE_YEAR>2016 and pLEAVE_MONTH>6)
or (TEMP_CUR_RECORD.Adjustment_Date>TEMP_CUR_RECORD.Positive_Date and vRegion='PRC' and to_number(to_char(TEMP_CUR_RECORD.Adjustment_Date,'YYYY'))=pLEAVE_YEAR and to_number(to_char(TEMP_CUR_RECORD.Adjustment_Date,'MM'))>6 and pLEAVE_MONTH>6)
then
vPK_TIMEITEM :='10018G1000000000BM2N'; --当前假期类型 1、年假 2、司龄假 3、上年年假 4、上年司龄假 5、调整年假 6、调整司龄假 7、年假延期 8、司龄假延期
vLEAVE_QTY:=vAverage_monthly_holidays;
--新增加司龄假
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.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,pLEAVE_YEAR,pLEAVE_MONTH,vPK_TIMEITEM,Ceil(vLEAVE_QTY * 1000)/1000,vSTART_DATE,vEND_DATE);
--判断是否转正
-- if TEMP_CUR_RECORD.Positive_Date PKG_LEAVE.Update_Leave_By_PK_PSNDOC(TEMP_CUR_RECORD.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,vPK_TIMEITEM,pLEAVE_YEAR,vAnnual_day+vWorking_age_day,vResult);
-- end if;
else
if vAnnual_day>=(vTotal_Annual_day+vAverage_monthly_holidays) then --本年应有年假>=每月平均可有假期+已分配的年假
vPK_TIMEITEM :='1002Z710000000021ZLJ'; --当前假期类型 1、年假 2、司龄假 3、上年年假 4、上年司龄假 5、调整年假 6、调整司龄假 7、年假延期 8、司龄假延期
vLEAVE_QTY:=vAverage_monthly_holidays;
--新增加年假
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.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,pLEAVE_YEAR,pLEAVE_MONTH,vPK_TIMEITEM,Ceil(vLEAVE_QTY * 1000)/1000,vSTART_DATE,vEND_DATE);
--判断是否转正
-- if TEMP_CUR_RECORD.Positive_Date PKG_LEAVE.Update_Leave_By_PK_PSNDOC(TEMP_CUR_RECORD.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,vPK_TIMEITEM,pLEAVE_YEAR,vAnnual_day,vResult);
-- end if;
else
if vAnnual_day>vTotal_Annual_day then --当月出现部分看年假,部分司龄假
--新增加年假
vPK_TIMEITEM :='1002Z710000000021ZLJ'; --当前假期类型 1、年假 2、司龄假 3、上年年假 4、上年司龄假 5、调整年假 6、调整司龄假 7、年假延期 8、司龄假延期
vLEAVE_QTY:=vAnnual_day-vTotal_Annual_day;
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.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,pLEAVE_YEAR,pLEAVE_MONTH,vPK_TIMEITEM,Ceil(vLEAVE_QTY * 1000)/1000,vSTART_DATE,vEND_DATE);
--判断是否转正
-- if TEMP_CUR_RECORD.Positive_Date PKG_LEAVE.Update_Leave_By_PK_PSNDOC(TEMP_CUR_RECORD.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,vPK_TIMEITEM,pLEAVE_YEAR,vAnnual_day,vResult);
-- end if;
--新增加司龄假
vPK_TIMEITEM :='10018G1000000000BM2N'; --当前假期类型 1、年假 2、司龄假 3、上年年假 4、上年司龄假 5、调整年假 6、调整司龄假 7、年假延期 8、司龄假延期
vLEAVE_QTY:=vAverage_monthly_holidays-(vAnnual_day-vTotal_Annual_day);
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.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,pLEAVE_YEAR,pLEAVE_MONTH,vPK_TIMEITEM,Ceil(vLEAVE_QTY * 1000)/1000,vSTART_DATE,vEND_DATE);
-- if TEMP_CUR_RECORD.Positive_Date PKG_LEAVE.Update_Leave_By_PK_PSNDOC(TEMP_CUR_RECORD.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,vPK_TIMEITEM,pLEAVE_YEAR,vWorking_age_day,vResult);
-- end if;
else --年假已分派完,紧剩司龄假
vPK_TIMEITEM :='10018G1000000000BM2N'; --当前假期类型 1、年假 2、司龄假 3、上年年假 4、上年司龄假 5、调整年假 6、调整司龄假 7、年假延期 8、司龄假延期
vLEAVE_QTY:=vAverage_monthly_holidays;
--新增加司龄假
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.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,pLEAVE_YEAR,pLEAVE_MONTH,vPK_TIMEITEM,Ceil(vLEAVE_QTY * 1000)/1000,vSTART_DATE,vEND_DATE);
--判断是否转正
--if TEMP_CUR_RECORD.Positive_Date PKG_LEAVE.Update_Leave_By_PK_PSNDOC(TEMP_CUR_RECORD.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,vPK_TIMEITEM,pLEAVE_YEAR,vWorking_age_day,vResult);
-- end if;
end if;
end if;
end if;
else --入职日期早于计算假歁的年度,应享假期按比例计算
-- if TEMP_CUR_RECORD.Adjustment_Date>TEMP_CUR_RECORD.Positive_Date and vRegion='PRC' and to_number(to_char(TEMP_CUR_RECORD.Adjustment_Date,'YYYY'))=pLEAVE_YEAR and to_number(to_char(TEMP_CUR_RECORD.Adjustment_Date,'MM'))>6 and pLEAVE_MONTH>6 then
if (vRegion='PRC' and pLEAVE_YEAR>2016 and pLEAVE_MONTH>6)
or TEMP_CUR_RECORD.Adjustment_Date>TEMP_CUR_RECORD.Positive_Date and vRegion='PRC' and to_number(to_char(TEMP_CUR_RECORD.Adjustment_Date,'YYYY'))=pLEAVE_YEAR and to_number(to_char(TEMP_CUR_RECORD.Adjustment_Date,'MM'))>6 and pLEAVE_MONTH>6 then
--Adjustment_Date
vPK_TIMEITEM :='10018G1000000000BM2N'; --当前假期类型 1、年假 2、司龄假 3、上年年假 4、上年司龄假 5、调整年假 6、调整司龄假 7、年假延期 8、司龄假延期
vLEAVE_QTY:=vAverage_monthly_holidays;
--新增加司龄假
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.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,pLEAVE_YEAR,pLEAVE_MONTH,vPK_TIMEITEM,Ceil(vLEAVE_QTY * 1000)/1000,vSTART_DATE,vEND_DATE);
PKG_LEAVE.Update_Leave_By_PK_PSNDOC(TEMP_CUR_RECORD.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,vPK_TIMEITEM,pLEAVE_YEAR,TEMP_CUR_RECORD.working_age_day,vResult);
else
--判断是否是香港地区 add by waite 2018年1月取消
if substr(TEMP_CUR_RECORD.org_code,1,2)='HK' then
--if pPK_ORG in('00018G1000000000I1A7','00016H10000000000BIO','00016H10000000000BI8','00016H10000000000BI5','00016H10000000000BIC','00016H10000000000BIF','00016H10000000000BII','00016H10000000000BIL') then
vPK_TIMEITEM :='1002Z710000000021ZLJ'; --当前假期类型 1、年假 2、司龄假 3、上年年假 4、上年司龄假 5、调整年假 6、调整司龄假 7、年假延期 8、司龄假延期
vLEAVE_QTY:=vAverage_monthly_holidays;
--新增加年假
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.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,pLEAVE_YEAR,pLEAVE_MONTH,vPK_TIMEITEM,Ceil(vLEAVE_QTY * 1000)/1000,vSTART_DATE,vEND_DATE);
PKG_LEAVE.Update_Leave_By_PK_PSNDOC(TEMP_CUR_RECORD.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,vPK_TIMEITEM,pLEAVE_YEAR,vAnnual_day,vResult);
else
------------=========
if vAnnual_day>=(vTotal_Annual_day+vAverage_monthly_holidays) then --本年应有年假>=每月平均可有假期+已分配的年假
vPK_TIMEITEM :='1002Z710000000021ZLJ'; --当前假期类型 1、年假 2、司龄假 3、上年年假 4、上年司龄假 5、调整年假 6、调整司龄假 7、年假延期 8、司龄假延期
vLEAVE_QTY:=vAverage_monthly_holidays;
--新增加年假
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.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,pLEAVE_YEAR,pLEAVE_MONTH,vPK_TIMEITEM,Ceil(vLEAVE_QTY * 1000)/1000,vSTART_DATE,vEND_DATE);
PKG_LEAVE.Update_Leave_By_PK_PSNDOC(TEMP_CUR_RECORD.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,vPK_TIMEITEM,pLEAVE_YEAR,vAnnual_day,vResult);
else
if vAnnual_day>vTotal_Annual_day then --当月出现部分看年假,部分司龄假
--新增加年假
vPK_TIMEITEM :='1002Z710000000021ZLJ'; --当前假期类型 1、年假 2、司龄假 3、上年年假 4、上年司龄假 5、调整年假 6、调整司龄假 7、年假延期 8、司龄假延期
vLEAVE_QTY:=vAnnual_day-vTotal_Annual_day;
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.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,pLEAVE_YEAR,pLEAVE_MONTH,vPK_TIMEITEM,Ceil(vLEAVE_QTY * 1000)/1000,vSTART_DATE,vEND_DATE);
PKG_LEAVE.Update_Leave_By_PK_PSNDOC(TEMP_CUR_RECORD.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,vPK_TIMEITEM,pLEAVE_YEAR,vAnnual_day,vResult);
--新增加司龄假
vPK_TIMEITEM :='10018G1000000000BM2N'; --当前假期类型 1、年假 2、司龄假 3、上年年假 4、上年司龄假 5、调整年假 6、调整司龄假 7、年假延期 8、司龄假延期
vLEAVE_QTY:=vAverage_monthly_holidays-(vAnnual_day-vTotal_Annual_day);
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.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,pLEAVE_YEAR,pLEAVE_MONTH,vPK_TIMEITEM,Ceil(vLEAVE_QTY * 1000)/1000,vSTART_DATE,vEND_DATE);
PKG_LEAVE.Update_Leave_By_PK_PSNDOC(TEMP_CUR_RECORD.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,vPK_TIMEITEM,pLEAVE_YEAR,TEMP_CUR_RECORD.working_age_day,vResult);
else --年假已分派完,紧剩司龄假
vPK_TIMEITEM :='10018G1000000000BM2N'; --当前假期类型 1、年假 2、司龄假 3、上年年假 4、上年司龄假 5、调整年假 6、调整司龄假 7、年假延期 8、司龄假延期
vLEAVE_QTY:=vAverage_monthly_holidays;
--新增加司龄假
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.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,pLEAVE_YEAR,pLEAVE_MONTH,vPK_TIMEITEM,Ceil(vLEAVE_QTY * 1000)/1000,vSTART_DATE,vEND_DATE);
PKG_LEAVE.Update_Leave_By_PK_PSNDOC(TEMP_CUR_RECORD.PK_PSNDOC,TEMP_CUR_RECORD.PK_HRORG,vPK_TIMEITEM,pLEAVE_YEAR,TEMP_CUR_RECORD.working_age_day,vResult);
end if;
end if;
end if;
end if;
end if;
----当前假期类型 1、年假 2、司龄假 3、上年年假 4、上年司龄假 5、调整年假 6、调整司龄假 7、年假延期 8、司龄假延期 (注意假期有效期)
/*select pk_psndoc 人员基本信息,
pk_psnorg 人员基本信息,
ce.pk_org 人员组织关系,
org.name 组织,
item.timeitemname 休假类别,
settlementdate 结算日期,
curyear 年度,
curmonth 期间,
lastdayorhour 上期结余,
curdayorhour 享有,
realdayorhour 当前享有, 10天
yidayorhour 已休, 3
freezedayorhour 冻结 3
restdayorhour 剩余
from tbm_leavebalance ce --(假期计算)
inner join tbm_timeitem item
on item.pk_timeitem = ce.pk_timeitem
inner join org_orgs org
on org.pk_org = ce.pk_org */
end if;
end loop;
presult:='Success';
end if;
commit;
end Gen_Employee_Leave;
/*********************************************************************************************************************
NAME: Update_Employee_Leave
DESCRIPTION: 每日定时更新员工 年假 司龄假
PARAMETERS: 计算假期年份 pLEAVE_MONTH 计算假期月份
Return: Success/Failed
USAGE: PKG_LEAVE.Update_Employee_Leave();
HISOTORY:
DATE NAME DESCRIPTION
2016-1-15 River PROCEDURE CREATED
***********************************************************************************************************************/
PROCEDURE Update_All_Employee_Leave(presult out varchar2) IS
begin
/*
1002Z710000000021ZLJ 年假
10018G1000000000BM37 上年年假
10018G1000000000BM2T 调整年假
10018G1000000000BM2P 年假延期
10018G1000000000BM2N 司龄假
10018G1000000000BM39 上年司龄假
10018G1000000000BM2R 调整司龄假
10018G1000000000BM2V 司龄假延期
10018G1000000000BM2L 补休
10018G1000000000BM33 调整补休
10018G1000000000BM35 补休延期
*/
--年假
--非香港地区
update tbm_leavebalance t set
t.realdayorhour=nvl((select nvl(sum(e.LEAVE_QTY),0)
from HR_EMPLOYEE_ENJOY_LEAVE e
where e.pk_psndoc=t.pk_psndoc
and e.pk_org=t.pk_org and e.start_date and e.PK_TIMEITEM in ('1002Z710000000021ZLJ','10018G1000000000BM2T','10018G1000000000BM2P')
and t.curyear = to_char(e.START_DATE,'YYYY')) ,0)
,
t.restdayorhour=nvl((select nvl(sum(e.LEAVE_QTY),0)
from HR_EMPLOYEE_ENJOY_LEAVE e
where e.pk_psndoc=t.pk_psndoc and e.pk_org=t.pk_org and e.start_date +t.lastdayorhour-t.yidayorhour
where t.pk_psndoc in (select psn.PK_PSNDOC from bd_psndoc psn inner join hi_psnjob job on psn.pk_psndoc=job.pk_psndoc and job.lastflag='Y'and job.ismainjob='Y' where job.begindate is not null) and
t.curyear=to_char(sysdate,'YYYY') and
t.pk_timeitem='1002Z710000000021ZLJ' and t.pk_org not in('00018G1000000000I1A7','00016H10000000000BIO','00016H10000000000BI8','00016H10000000000BI5','00016H10000000000BIC','00016H10000000000BIF','00016H10000000000BII','00016H10000000000BIL');
--香港地区,以0.5为单位显示
update tbm_leavebalance t set
t.realdayorhour=round(nvl((select nvl(sum(e.LEAVE_QTY),0)
from HR_EMPLOYEE_ENJOY_LEAVE e
where e.pk_psndoc=t.pk_psndoc
and e.pk_org=t.pk_org and e.start_date and e.PK_TIMEITEM in ('1002Z710000000021ZLJ','10018G1000000000BM2T','10018G1000000000BM2P')
and t.curyear = to_char(e.START_DATE,'YYYY')) ,0)*2,0)/2
,
t.restdayorhour=round(nvl((select nvl(sum(e.LEAVE_QTY),0)
from HR_EMPLOYEE_ENJOY_LEAVE e
where e.pk_psndoc=t.pk_psndoc and e.pk_org=t.pk_org and e.start_date +t.lastdayorhour-t.yidayorhour
where t.pk_psndoc in (select psn.PK_PSNDOC from bd_psndoc psn inner join hi_psnjob job on psn.pk_psndoc=job.pk_psndoc and job.lastflag='Y'and job.ismainjob='Y' where job.begindate is not null ) and
t.curyear=to_char(sysdate,'YYYY') and
t.pk_timeitem='1002Z710000000021ZLJ' and
t.pk_org in('00018G1000000000I1A7','00016H10000000000BIO','00016H10000000000BI8','00016H10000000000BI5','00016H10000000000BIC','00016H10000000000BIF','00016H10000000000BII','00016H10000000000BIL');
--司龄假
update tbm_leavebalance t set
t.realdayorhour=nvl((select nvl(sum(e.LEAVE_QTY),0)
from HR_EMPLOYEE_ENJOY_LEAVE e
where e.pk_psndoc=t.pk_psndoc and e.pk_org=t.pk_org and e.start_date ,
t.restdayorhour=nvl((select nvl(sum(e.LEAVE_QTY),0)
from HR_EMPLOYEE_ENJOY_LEAVE e
where e.pk_psndoc=t.pk_psndoc and e.pk_org=t.pk_org and e.start_date +t.lastdayorhour-t.yidayorhour
where t.pk_psndoc in (select psn.PK_PSNDOC from bd_psndoc psn inner join hi_psnjob job on psn.pk_psndoc=job.pk_psndoc and job.lastflag='Y'and job.ismainjob='Y' where job.begindate is not null) and
t.curyear=to_char(sysdate,'YYYY') and
t.pk_timeitem='10018G1000000000BM2N';
--补休
/* update tbm_leavebalance t set
t.realdayorhour=(select nvl(sum(e.LEAVE_QTY),0)
from HR_EMPLOYEE_ENJOY_LEAVE e
where e.pk_psndoc=t.pk_psndoc
and e.pk_org=t.pk_org
and e.PK_TIMEITEM in ('10018G1000000000BM2L','10018G1000000000BM33','10018G1000000000BM35')
and t.curyear = to_char(e.START_DATE,'YYYY'))
,
t.restdayorhour=(select nvl(sum(e.LEAVE_QTY),0)
from HR_EMPLOYEE_ENJOY_LEAVE e
where e.pk_psndoc=t.pk_psndoc
and e.pk_org=t.pk_org
and e.PK_TIMEITEM in ('10018G1000000000BM2L','10018G1000000000BM33','10018G1000000000BM35')
and t.curyear = to_char(e.START_DATE,'YYYY'))
+t.lastdayorhour-t.yidayorhour
where t.pk_psndoc in (select psn.PK_PSNDOC from bd_psndoc psn inner join hi_psnjob job on psn.pk_psndoc=job.pk_psndoc and job.lastflag='Y' where job.begindate is not null) and
t.curyear=to_char(sysdate,'YYYY') and
t.pk_timeitem='10018G1000000000BM2L';
/* lastdayorhour 上期结余,
curdayorhour 享有,
realdayorhour 当前享有, 10天
yidayorhour 已休, 3
freezedayorhour 冻结 3
restdayorhour 结余 7-3
restdayorhour 剩余 4
*/
update tbm_leavebalance t set t.lastdayorhour=0,
t.curdayorhour=0,
t.realdayorhour=nvl(( select
sum(h.leave_qty-nvl((select sum(m.COMPENSATION_QTY) from HR_ELEAVE_MAPPING m where m.hr_employee_enjoy_leave_id = h.id),0))
from HR_EMPLOYEE_ENJOY_LEAVE h
where h.pk_psndoc=t.pk_psndoc and h.end_date>sysdate and h.pk_timeitem in ('10018G1000000000BM2L','10018G1000000000BM33','10018G1000000000BM35')
),0)+t.freezedayorhour+t.yidayorhour,
t.restdayorhour=nvl(( select
sum(h.leave_qty-nvl((select sum(m.COMPENSATION_QTY) from HR_ELEAVE_MAPPING m where m.hr_employee_enjoy_leave_id = h.id),0))
from HR_EMPLOYEE_ENJOY_LEAVE h
where h.pk_psndoc=t.pk_psndoc and h.end_date>sysdate and h.pk_timeitem in ('10018G1000000000BM2L','10018G1000000000BM33','10018G1000000000BM35')
),0)+t.freezedayorhour
where t.pk_psndoc in (select psn.PK_PSNDOC from bd_psndoc psn inner join hi_psnjob job on psn.pk_psndoc=job.pk_psndoc and job.lastflag='Y'and job.ismainjob='Y' where job.begindate is not null) and
t.curyear=to_char(sysdate,'YYYY') and
t.pk_timeitem='10018G1000000000BM2L';
commit;
presult:='Success';
end Update_All_Employee_Leave;
/*********************************************************************************************************************
NAME: Update_Leave_By_PK_PSNDOC
DESCRIPTION: 每日员工 年假 司龄假 补休
PARAMETERS: 计算假期年份 pLEAVE_MONTH 计算假期月份
Return: Success/Failed
USAGE: PKG_LEAVE.Update_Leave_By_PK_PSNDOC();
HISOTORY:
DATE NAME DESCRIPTION
2016-1-19 River PROCEDURE CREATED
***********************************************************************************************************************/
PROCEDURE Update_Leave_By_PK_PSNDOC(pPK_PSNDOC CHAR,pPK_ORG char,pPK_Timeitem char,pCuryear char,pCurdayorhour number,presult out varchar2) IS
begin
/*
select pk_psndoc 人员基本信息,
pk_psnorg 人员基本信息,
ce.pk_org 人员组织关系,
org.name 组织,
item.timeitemname 休假类别,
settlementdate 结算日期,
curyear 年度,
curmonth 期间,
lastdayorhour 上期结余,
curdayorhour 享有,
realdayorhour 当前享有, 10天
yidayorhour 已休, 3
freezedayorhour 冻结 3
restdayorhour 剩余
from tbm_leavebalance ce --(假期计算)
inner join tbm_timeitem item
on item.pk_timeitem = ce.pk_timeitem
inner join org_orgs org
on org.pk_org = ce.pk_org
--tbm_leavebalance
select lh.pk_psndoc 员工,
item.timeitemname 假期类型,
lh.approve_state 审批状态,-- 0 审批未通过 -1 自由态 1 审批通过 2 审批进行中 3 提交 ps:除审批通过的单据都为冻结状态
lb.pk_leaveb,
lb.leavebegintime 休假开始时间,
lb.leaveendtime 休假结束时间,
lb.leavehour 休假时长
from tbm_leaveb lb
left join tbm_leaveh lh on lb.pk_leaveh = lh.pk_leaveh
left join tbm_timeitem item on lh.pk_leavetype = item.pk_timeitem
where item.timeitemname in ('事假', '司龄假', '补休')
结余=冻结+可用
上期结余+当前享有=已休+结余
lastdayorhour 上期结余,
realdayorhour 当前享有, 10天
yidayorhour 已休, 3
freezedayorhour 冻结 3
restdayorhour 结余
当前享有=已休+结余-上期结余 *- 冻结
结余=当前享有+上期结余-已休
t.realdayorhour=t.yidayorhour+(select nvl(sum(e.LEAVE_QTY-nvl((select sum(m.compensation_qty) from HR_ELEAVE_MAPPING m where m.hr_employee_enjoy_leave_id=e.id),0)),0)
from HR_EMPLOYEE_ENJOY_LEAVE e
where e.pk_psndoc=t.pk_psndoc and e.PK_TIMEITEM in ('1002Z710000000021ZLJ','10018G1000000000BM2T','10018G1000000000BM2P') and t.curyear = to_char(e.START_DATE,'YYYY')) --若假期跨年会前后2年重复计假t.curyear between to_char(e.START_DATE,'YYYY') and to_char(e.END_DATE,'YYYY'))
-t.lastdayorhour,
t.restdayorhour=(select nvl(sum(e.LEAVE_QTY-nvl((select sum(m.compensation_qty) from HR_ELEAVE_MAPPING m where m.hr_employee_enjoy_leave_id=e.id),0)),0)
from HR_EMPLOYEE_ENJOY_LEAVE e
where e.pk_psndoc=t.pk_psndoc and e.PK_TIMEITEM in ('1002Z710000000021ZLJ','10018G1000000000BM37','10018G1000000000BM2T','10018G1000000000BM2P') and t.curyear = to_char(e.START_DATE,'YYYY')) --若假期跨年会前后2年重复计假t.curyear between to_char(e.START_DATE,'YYYY') and to_char(e.END_DATE,'YYYY'))
*/
presult:='Failed';
if pPK_Timeitem='1002Z710000000021ZLJ' or pPK_Timeitem='10018G1000000000BM37' or pPK_Timeitem='10018G1000000000BM2T' or pPK_Timeitem='10018G1000000000BM2P' then --年假
--判断是否是香港地区
--substr(TEMP_CUR_RECORD.org_code,1,2)='HK'
if pPK_ORG in('00018G1000000000I1A7','00016H10000000000BIO','00016H10000000000BI8','00016H10000000000BI5','00016H10000000000BIC','00016H10000000000BIF','00016H10000000000BII','00016H10000000000BIL') then
--更新香港人员年假,0.5为最小单位
update tbm_leavebalance t set
t.curdayorhour=round(decode(pCurdayorhour,-999,t.curdayorhour,pCurdayorhour)*2,0)/2,
t.realdayorhour=round((select nvl(sum(e.LEAVE_QTY),0)*2
from HR_EMPLOYEE_ENJOY_LEAVE e
where e.pk_psndoc=t.pk_psndoc and e.pk_org=t.pk_org and e.start_date ,
t.restdayorhour=round((select nvl(sum(e.LEAVE_QTY),0)*2
from HR_EMPLOYEE_ENJOY_LEAVE e
where e.pk_psndoc=t.pk_psndoc and e.pk_org=t.pk_org and e.start_date +t.lastdayorhour-t.yidayorhour
where t.pk_psndoc =pPK_PSNDOC and t.pk_org=pPK_ORG and t.curyear=pCuryear and t.pk_timeitem='1002Z710000000021ZLJ';
presult:='Success';
else
--非香港地区年假更新
update tbm_leavebalance t set
t.curdayorhour=decode(pCurdayorhour,-999,t.curdayorhour,pCurdayorhour),
t.realdayorhour=(select nvl(sum(e.LEAVE_QTY),0)
from HR_EMPLOYEE_ENJOY_LEAVE e
where e.pk_psndoc=t.pk_psndoc and e.pk_org=t.pk_org and e.start_date ,
t.restdayorhour=(select nvl(sum(e.LEAVE_QTY),0)
from HR_EMPLOYEE_ENJOY_LEAVE e
where e.pk_psndoc=t.pk_psndoc and e.pk_org=t.pk_org and e.start_date +t.lastdayorhour-t.yidayorhour
where t.pk_psndoc =pPK_PSNDOC and t.pk_org=pPK_ORG and t.curyear=pCuryear and t.pk_timeitem='1002Z710000000021ZLJ';
presult:='Success';
end if;
elsif pPK_Timeitem='10018G1000000000BM2N' or pPK_Timeitem='10018G1000000000BM39' or pPK_Timeitem='10018G1000000000BM2R' or pPK_Timeitem='10018G1000000000BM2V' then --司龄假
update tbm_leavebalance t set
t.curdayorhour=decode(pCurdayorhour,-999,t.curdayorhour,pCurdayorhour),
t.realdayorhour=(select nvl(sum(e.LEAVE_QTY),0)
from HR_EMPLOYEE_ENJOY_LEAVE e
where e.pk_psndoc=t.pk_psndoc and e.pk_org=t.pk_org and e.start_date ,
t.restdayorhour=(select nvl(sum(e.LEAVE_QTY),0)
from HR_EMPLOYEE_ENJOY_LEAVE e
where e.pk_psndoc=t.pk_psndoc and e.pk_org=t.pk_org and e.start_date +t.lastdayorhour-t.yidayorhour
where t.pk_psndoc =pPK_PSNDOC and t.pk_org=pPK_ORG and t.curyear=pCuryear and t.pk_timeitem='10018G1000000000BM2N';
/*update tbm_leavebalance t set
t.curdayorhour=decode(pCurdayorhour,-999,t.curdayorhour,pCurdayorhour),
t.realdayorhour=(select nvl(sum(e.LEAVE_QTY),0)
from HR_EMPLOYEE_ENJOY_LEAVE e
where e.pk_psndoc=t.pk_psndoc and e.pk_org=t.pk_org and e.start_date ,
t.restdayorhour=(select nvl(sum(e.LEAVE_QTY),0)
from HR_EMPLOYEE_ENJOY_LEAVE e
where e.pk_psndoc=t.pk_psndoc and e.pk_org=t.pk_org and e.start_date +t.lastdayorhour-t.yidayorhour
where t.pk_psndoc =pPK_PSNDOC and t.pk_org=pPK_ORG and t.curyear=pCuryear and t.pk_timeitem='1002Z710000000021ZLJ';*/
presult:='Success';
elsif pPK_Timeitem='10018G1000000000BM2L' or pPK_Timeitem='10018G1000000000BM33' or pPK_Timeitem='10018G1000000000BM35' then--补休
/* update tbm_leavebalance t set
t.realdayorhour=(select nvl(sum(e.LEAVE_QTY),0)
from HR_EMPLOYEE_ENJOY_LEAVE e
where e.pk_psndoc=t.pk_psndoc and e.pk_org=t.pk_org and e.PK_TIMEITEM in ('10018G1000000000BM2L','10018G1000000000BM33','10018G1000000000BM35') and t.curyear = to_char(e.START_DATE,'YYYY'))
,
t.restdayorhour=(select nvl(sum(e.LEAVE_QTY),0)
from HR_EMPLOYEE_ENJOY_LEAVE e
where e.pk_psndoc=t.pk_psndoc and e.pk_org=t.pk_org and e.PK_TIMEITEM in ('10018G1000000000BM2L','10018G1000000000BM33','10018G1000000000BM35') and t.curyear = to_char(e.START_DATE,'YYYY'))
+t.lastdayorhour-t.yidayorhour
where t.pk_psndoc =pPK_PSNDOC and t.pk_org=pPK_ORG and t.curyear=pCuryear and t.pk_timeitem='10018G1000000000BM2L';*/
/* lastdayorhour 上期结余,
curdayorhour 享有,
realdayorhour 当前享有, 10天
yidayorhour 已休, 3
freezedayorhour 冻结 3
restdayorhour 剩余 7*/
update tbm_leavebalance t set
t.lastdayorhour=0,
t.curdayorhour=0,
t.realdayorhour=nvl(( select
sum(h.leave_qty-nvl((select sum(m.COMPENSATION_QTY) from HR_ELEAVE_MAPPING m where m.hr_employee_enjoy_leave_id = h.id),0))
from HR_EMPLOYEE_ENJOY_LEAVE h
where h.pk_psndoc=t.pk_psndoc and h.end_date>sysdate and h.pk_timeitem in ('10018G1000000000BM2L','10018G1000000000BM33','10018G1000000000BM35')
),0)+t.freezedayorhour+t.yidayorhour,
t.restdayorhour=nvl(( select
sum(h.leave_qty-nvl((select sum(m.COMPENSATION_QTY) from HR_ELEAVE_MAPPING m where m.hr_employee_enjoy_leave_id = h.id),0))
from HR_EMPLOYEE_ENJOY_LEAVE h
where h.pk_psndoc=t.pk_psndoc and h.end_date>sysdate and h.pk_timeitem in ('10018G1000000000BM2L','10018G1000000000BM33','10018G1000000000BM35')
),0)+t.freezedayorhour
where t.pk_psndoc =pPK_PSNDOC and t.pk_org=pPK_ORG and t.curyear=pCuryear and t.pk_timeitem='10018G1000000000BM2L';
presult:='Success';
end if;
end Update_Leave_By_PK_PSNDOC;
/*********************************************************************************************************************
NAME: Insert_Leave_Mapping
DESCRIPTION: 假期享有与休假抵扣
PARAMETERS: pk_leaveb休假ID
Return: Success/Failed
USAGE: PKG_LEAVE.Insert_Leave_Mapping();
HISOTORY:
DATE NAME DESCRIPTION
2016-1-19 River PROCEDURE CREATED
-------------------------------------------------------------------------------
-- Create table
drop table HR_ELEAVE_MAPPING;
create table HR_ELEAVE_MAPPING
(
ID NUMBER not null,
HR_EMPLOYEE_ENJOY_LEAVE_ID NUMBER, --享有假期ID
pk_leaveb CHAR(20) not null, --休假ID
COMPENSATION_QTY NUMBER, --抵扣享有假期数量,假期单位与对应的享有假期ID一样
CREATE_DATE DATE default sysdate
);
-- Create/Recreate primary, unique and foreign key constraints
alter table HR_ELEAVE_MAPPING add constraint HR_ELEAVE_MAPPING_PK primary key (ID);
alter table HR_ELEAVE_MAPPING add constraint HR_ELEAVE_MAPPING_FK1 foreign key (pk_leaveb) references tbm_leaveb (pk_leaveb);
alter table HR_ELEAVE_MAPPING add constraint HR_ELEAVE_MAPPING_FK2 foreign key (HR_EMPLOYEE_ENJOY_LEAVE_ID) references HR_EMPLOYEE_ENJOY_LEAVE (ID);
drop sequence HR_ELEAVE_MAPPING_SEQ;
create sequence HR_ELEAVE_MAPPING_SEQ
minvalue 1
maxvalue 999999999999
start with 1
increment by 1
cache 30;
-------------------------------------------------------------------------------
--tbm_leavebalance 冻结+可用=结余 ; 当前享有=实际享有 ;上期结余+调整+当前享有=结余
select lh.pk_psndoc 员工,
item.timeitemname 假期类型,
lh.approve_state 审批状态,-- 0 审批未通过 -1 自由态 1 审批通过 2 审批进行中 3 提交 ps:除审批通过的单据都为冻结状态
lb.leavebegintime 休假开始时间,
lb.leaveendtime 休假结束时间,
lb.leavehour 休假时长
from tbm_leaveb lb
left join tbm_leaveh lh on lb.pk_leaveh = lh.pk_leaveh
left join tbm_timeitem item on lh.pk_leavetype = item.pk_timeitem
where item.timeitemname in ('事假', '司龄假', '补休')
1002Z710000000021ZLJ 年假
10018G1000000000BM37 上年年假
10018G1000000000BM2T 调整年假
10018G1000000000BM2P 年假延期
10018G1000000000BM2N 司龄假
10018G1000000000BM39 上年司龄假
10018G1000000000BM2R 调整司龄假
10018G1000000000BM2V 司龄假延期
10018G1000000000BM2L 补休
10018G1000000000BM33 调整补休
10018G1000000000BM35 补休延期
tbm_leavereg
***********************************************************************************************************************/
PROCEDURE Insert_Leave_Mapping_OT(ppk_leaveb CHAR,result out varchar2)
AS
CURSOR TEMP_CUR IS
select
tmp.ENJOY_LEAVE_ID,
tmp.pk_org,
(tmp.leave_qty-tmp.Use_QTY) as leave_balance,
tmp.leave_unit
from (
select
t.id as ENJOY_LEAVE_ID,
t.pk_psndoc,
t.pk_org,
t.end_date,
nvl((select sum(m.COMPENSATION_QTY) from HR_ELEAVE_MAPPING m where m.hr_employee_enjoy_leave_id = t.id and m.pk_leaveb<>ppk_leaveb),0) as Use_QTY,
t.leave_qty,
t.leave_unit
from HR_EMPLOYEE_ENJOY_LEAVE t
inner join tbm_leaveh h on h.pk_psndoc=t.pk_psndoc and h.pk_org=t.pk_org --and h.pk_leavetype=t.pk_timeitem
inner join tbm_leaveb l on l.pk_leaveh = h.pk_leaveh
where
l.pk_leaveb=ppk_leaveb and
t.pk_timeitem in ('10018G1000000000BM2L','10018G1000000000BM33','10018G1000000000BM35') and
h.pk_leavetype in ('10018G1000000000BM2L','10018G1000000000BM33','10018G1000000000BM35') and
to_date(l.leaveenddate,'YYYY-MM-DD') between t.start_date and t.end_date
)tmp where tmp.leave_qty>tmp.Use_QTY
order by tmp.end_date;
vUse_Qty number;
vTotal_Enjoy_Qty number; --可休假
--vUse_Unit number; --1、天 2、小时
vResult varchar2(20);
vPK_PSNDOC CHAR(20);
vpk_org CHAR(20);
vCuryear CHAR(4);
vRecord_QTY number;
begin
result:='Failed';
select count(1) into vRecord_QTY from tbm_leaveb a where a.pk_leaveb=ppk_leaveb;
if vRecord_QTY>0 then--是否存在请假记录
--计算可休假
select
sum(tmp.leave_qty-tmp.Use_QTY) into vTotal_Enjoy_Qty
from (
select
nvl((select sum(m.COMPENSATION_QTY) from HR_ELEAVE_MAPPING m where m.hr_employee_enjoy_leave_id = t.id and m.pk_leaveb<>ppk_leaveb),0) as Use_QTY,
t.leave_qty
from HR_EMPLOYEE_ENJOY_LEAVE t
inner join tbm_leaveh h on h.pk_psndoc=t.pk_psndoc and h.pk_org=t.pk_org --and h.pk_leavetype=t.pk_timeitem
inner join tbm_leaveb l on l.pk_leaveh = h.pk_leaveh
where
l.pk_leaveb=ppk_leaveb and
t.pk_timeitem in ('10018G1000000000BM2L','10018G1000000000BM33','10018G1000000000BM35') and
h.pk_leavetype in ('10018G1000000000BM2L','10018G1000000000BM33','10018G1000000000BM35') and
to_date(l.leaveenddate,'YYYY-MM-DD') between t.start_date and t.end_date
)tmp where tmp.leave_qty>tmp.Use_QTY;
--计算休假
select h.pk_psndoc,h.pk_org,
substr(l.leaveenddate,1,4),
(l.leavehour+
nvl((select sum(o.differencehour)
from tbm_leavereg r
inner join tbm_leaveoff o on o.pk_leavereg=r.pk_leavereg
where r.pk_billsourceb=l.pk_leaveb),0)
)
into vPK_PSNDOC,vpk_org,vCuryear,vUse_Qty
from tbm_leaveb l
inner join tbm_leaveh h on h.pk_leaveh = l.pk_leaveh
where l.pk_leaveb=ppk_leaveb;
if vTotal_Enjoy_Qty>=vUse_Qty then --有足够假期抵扣
delete from HR_ELEAVE_MAPPING t where t.pk_leaveb=ppk_leaveb;
For TEMP_CUR_RECORD in TEMP_CUR loop
if TEMP_CUR_RECORD.leave_unit=1 then --天数作单位
if TEMP_CUR_RECORD.leave_balance>=vUse_Qty then
insert into HR_ELEAVE_MAPPING(ID,HR_EMPLOYEE_ENJOY_LEAVE_ID,pk_leaveb,COMPENSATION_QTY) VALUES(HR_ELEAVE_MAPPING_SEQ.NEXTVAL,TEMP_CUR_RECORD.ENJOY_LEAVE_ID,ppk_leaveb,vUse_Qty);
exit;
else
insert into HR_ELEAVE_MAPPING(ID,HR_EMPLOYEE_ENJOY_LEAVE_ID,pk_leaveb,COMPENSATION_QTY) VALUES(HR_ELEAVE_MAPPING_SEQ.NEXTVAL,TEMP_CUR_RECORD.ENJOY_LEAVE_ID,ppk_leaveb,TEMP_CUR_RECORD.leave_balance);
vUse_Qty:=vUse_Qty-TEMP_CUR_RECORD.leave_balance;
end if;
else --小时作单位
if TEMP_CUR_RECORD.leave_balance>=vUse_Qty then
insert into HR_ELEAVE_MAPPING(ID,HR_EMPLOYEE_ENJOY_LEAVE_ID,pk_leaveb,COMPENSATION_QTY) VALUES(HR_ELEAVE_MAPPING_SEQ.NEXTVAL,TEMP_CUR_RECORD.ENJOY_LEAVE_ID,ppk_leaveb,vUse_Qty);
exit;
else
insert into HR_ELEAVE_MAPPING(ID,HR_EMPLOYEE_ENJOY_LEAVE_ID,pk_leaveb,COMPENSATION_QTY) VALUES(HR_ELEAVE_MAPPING_SEQ.NEXTVAL,TEMP_CUR_RECORD.ENJOY_LEAVE_ID,ppk_leaveb,TEMP_CUR_RECORD.leave_balance);
vUse_Qty:=vUse_Qty-TEMP_CUR_RECORD.leave_balance;
end if;
end if;
end loop;
--更新员工假期
PKG_LEAVE.Update_Leave_By_PK_PSNDOC(vPK_PSNDOC,vpk_org,'10018G1000000000BM2L',vCuryear,-999,vResult);
commit;
result:='Success';
end if;
end if;
end Insert_Leave_Mapping_OT;
/*********************************************************************************************************************
NAME: Insert_Leave_Mapping_AL
alter table HR_EMPLOYEE_ENJOY_LEAVE add constraint HR_EMPLOYEE_ENJOY_LEAVE_UK unique (PK_PSNDOC, PK_TIMEITEM, START_DATE);
DESCRIPTION: 假期享有与年假抵扣 annual leave
PARAMETERS: pk_leaveb年假ID
Return: Success/Failed
USAGE: PKG_LEAVE.Insert_Leave_Mapping_AL();
1002Z710000000021ZLJ 年假
10018G1000000000BM37 上年年假
10018G1000000000BM2T 调整年假
10018G1000000000BM2P 年假延期
10018G1000000000BM2N 司龄假
10018G1000000000BM39 上年司龄假
10018G1000000000BM2R 调整司龄假
10018G1000000000BM2V 司龄假延期
10018G1000000000BM2L 补休
10018G1000000000BM33 调整补休
10018G1000000000BM35 补休延期
HISOTORY:
DATE NAME DESCRIPTION
2016-1-19 River PROCEDURE CREATED
***********************************************************************************************************************/
PROCEDURE Insert_Leave_Mapping_AL(ppk_leaveb CHAR,result out varchar2)
AS
CURSOR TEMP_CUR IS
--1.查询数据 查询未抵扣记录
select
tmp.ENJOY_LEAVE_ID,
tmp.pk_org,
(tmp.leave_qty-tmp.Use_QTY) as leave_balance,--剩余未抵扣的假期
tmp.leave_unit
from (
select
t.id as ENJOY_LEAVE_ID,
t.pk_psndoc,
t.pk_org,
t.end_date,
--排除当前单据的数据,考虑修改的情况
nvl((select sum(m.COMPENSATION_QTY) from HR_ELEAVE_MAPPING m where m.hr_employee_enjoy_leave_id = t.id and m.pk_leaveb<>ppk_leaveb),0) as Use_QTY,
t.leave_qty,
t.leave_unit
from HR_EMPLOYEE_ENJOY_LEAVE t
inner join tbm_leaveh h on h.pk_psndoc=t.pk_psndoc and h.pk_org=t.pk_org --and h.pk_leavetype=t.pk_timeitem
inner join tbm_leaveb l on l.pk_leaveh = h.pk_leaveh
where
l.pk_leaveb=ppk_leaveb and
t.pk_timeitem in ('1002Z710000000021ZLJ','10018G1000000000BM37','10018G1000000000BM2T','10018G1000000000BM2P') and
h.pk_leavetype in ('1002Z710000000021ZLJ','10018G1000000000BM37','10018G1000000000BM2T','10018G1000000000BM2P') and
(to_date(l.leaveenddate,'YYYY-MM-DD') between t.start_date and t.end_date or sysdate between t.start_date and t.end_date)
)tmp where tmp.leave_qty>tmp.Use_QTY
order by tmp.end_date;
vUse_Qty number;
vTotal_Enjoy_Qty number; --可休假
vRestdayorhour number; --TW 可预支假
vHR_EMPLOYEE_ENJOY_LEAVE_ID number; --TW 可预支假ID
--vUse_Unit number; --1、天 2、小时
vPK_PSNDOC CHAR(20);
vorg_code CHAR(20);--isTW?
vpk_org CHAR(20);
vResult varchar2(20);
vCuryear CHAR(4);
vTW_Record_QTY number;
vRecord_QTY number;
begin
result:='Failed';
--是否为TW ,可预支假期 给组织赋值
select substr(org.code,1,2) into vorg_code
from tbm_leaveh h
inner join tbm_leaveb l on l.pk_leaveh = h.pk_leaveh
inner join org_orgs org on h.pk_org = org.pk_org --?waite
where l.pk_leaveb=ppk_leaveb;
if vorg_code='TA'or vorg_code='HK' then --TW 可预支假,
--计算可预支年假 本年应有+上年-已休-冻结+本单据的数据
select t.curdayorhour+t.lastdayorhour-t.yidayorhour-t.freezedayorhour+nvl((select leavehour from tbm_leaveb m where m.pk_leaveb=ppk_leaveb),0)
into vRestdayorhour
from tbm_leaveh h
inner join tbm_leaveb l on l.pk_leaveh = h.pk_leaveh
inner join tbm_leavebalance t on t.pk_psndoc=h.pk_psndoc and t.pk_org=h.pk_org
where l.pk_leaveb=ppk_leaveb and t.pk_timeitem='1002Z710000000021ZLJ' and t.curyear=to_char(sysdate,'YYYY');
--剩余假期抵扣数
select count(1) into vTW_Record_QTY
from (
select
nvl((select sum(m.COMPENSATION_QTY) from HR_ELEAVE_MAPPING m where m.hr_employee_enjoy_leave_id = t.id and m.pk_leaveb<>ppk_leaveb),0) as Use_QTY,
t.leave_qty
from HR_EMPLOYEE_ENJOY_LEAVE t
inner join tbm_leaveh h on h.pk_psndoc=t.pk_psndoc and h.pk_org=t.pk_org --and h.pk_leavetype=t.pk_timeitem
inner join tbm_leaveb l on l.pk_leaveh = h.pk_leaveh
where
l.pk_leaveb=ppk_leaveb and
t.pk_timeitem in ('1002Z710000000021ZLJ','10018G1000000000BM37','10018G1000000000BM2T','10018G1000000000BM2P') and
h.pk_leavetype in ('1002Z710000000021ZLJ','10018G1000000000BM37','10018G1000000000BM2T','10018G1000000000BM2P') and
(to_date(l.leaveenddate,'YYYY-MM-DD') between t.start_date and t.end_date or sysdate between t.start_date and t.end_date)
)tmp where tmp.leave_qty>tmp.Use_QTY;
end if;
select count(1) into vRecord_QTY from tbm_leaveb a where a.pk_leaveb=ppk_leaveb;
if vRecord_QTY>0 then--是否存在请假记录
--计算可休假
select
sum(tmp.leave_qty-tmp.Use_QTY) into vTotal_Enjoy_Qty
from (
select
t.id as ENJOY_LEAVE_ID,
t.pk_psndoc,
t.pk_org,
t.end_date,
nvl((select sum(m.COMPENSATION_QTY) from HR_ELEAVE_MAPPING m where m.hr_employee_enjoy_leave_id = t.id and m.pk_leaveb<>ppk_leaveb),0) as Use_QTY,
t.leave_qty,
t.leave_unit
from HR_EMPLOYEE_ENJOY_LEAVE t
inner join tbm_leaveh h on h.pk_psndoc=t.pk_psndoc and h.pk_org=t.pk_org --and h.pk_leavetype=t.pk_timeitem
inner join tbm_leaveb l on l.pk_leaveh = h.pk_leaveh
where
l.pk_leaveb=ppk_leaveb and
t.pk_timeitem in ('1002Z710000000021ZLJ','10018G1000000000BM37','10018G1000000000BM2T','10018G1000000000BM2P') and
h.pk_leavetype in ('1002Z710000000021ZLJ','10018G1000000000BM37','10018G1000000000BM2T','10018G1000000000BM2P') and
(to_date(l.leaveenddate,'YYYY-MM-DD') between t.start_date and t.end_date or sysdate between t.start_date and t.end_date)
)tmp where tmp.leave_qty>tmp.Use_QTY;
--计算休假
select h.pk_psndoc,h.pk_org,
substr(l.leaveenddate,1,4),
(l.leavehour+
nvl((select sum(o.differencehour) --differencehour 差异时长 负数
from tbm_leavereg r
inner join tbm_leaveoff o on o.pk_leavereg=r.pk_leavereg
where r.pk_billsourceb=l.pk_leaveb),0)
)
into vPK_PSNDOC,vpk_org,vCuryear,vUse_Qty
from tbm_leaveb l
inner join tbm_leaveh h on h.pk_leaveh = l.pk_leaveh
where l.pk_leaveb=ppk_leaveb;
if vTotal_Enjoy_Qty>=vUse_Qty or (vRestdayorhour>=vUse_Qty and vorg_code='TA') OR (vRestdayorhour>=vUse_Qty and vorg_code='HK') then --TW 可预支假,但不能超出, PRC HK 检测是否有足够假期抵扣
delete from HR_ELEAVE_MAPPING t where t.pk_leaveb=ppk_leaveb;
/*if (vTW_Record_QTY=0 and vorg_code='TA') OR (vTW_Record_QTY=0 and vorg_code='HK') then --TW 预支假期,没抵扣 判断无效
select HR_EMPLOYEE_ENJOY_LEAVE_SEQ.NEXTVAL into vHR_EMPLOYEE_ENJOY_LEAVE_ID from dual;
insert into HR_EMPLOYEE_ENJOY_LEAVE( ID, PK_PSNDOC,PK_ORG,LEAVE_YYYY,LEAVE_MM,PK_TIMEITEM,LEAVE_QTY,START_DATE,END_DATE) values(vHR_EMPLOYEE_ENJOY_LEAVE_ID,vPK_PSNDOC,vpk_org,vCuryear,to_char(sysdate,'MM'),'1002Z710000000021ZLJ',0,sysdate,add_months(sysdate,1));
insert into HR_ELEAVE_MAPPING(ID,HR_EMPLOYEE_ENJOY_LEAVE_ID,pk_leaveb,COMPENSATION_QTY) VALUES(HR_ELEAVE_MAPPING_SEQ.NEXTVAL,vHR_EMPLOYEE_ENJOY_LEAVE_ID,ppk_leaveb,vUse_Qty);
else*/
For TEMP_CUR_RECORD in TEMP_CUR loop
--小时作单位
if TEMP_CUR_RECORD.leave_balance>=vUse_Qty then
insert into HR_ELEAVE_MAPPING(ID,HR_EMPLOYEE_ENJOY_LEAVE_ID,pk_leaveb,COMPENSATION_QTY) VALUES(HR_ELEAVE_MAPPING_SEQ.NEXTVAL,TEMP_CUR_RECORD.ENJOY_LEAVE_ID,ppk_leaveb,vUse_Qty);
exit;
else
insert into HR_ELEAVE_MAPPING(ID,HR_EMPLOYEE_ENJOY_LEAVE_ID,pk_leaveb,COMPENSATION_QTY) VALUES(HR_ELEAVE_MAPPING_SEQ.NEXTVAL,TEMP_CUR_RECORD.ENJOY_LEAVE_ID,ppk_leaveb,TEMP_CUR_RECORD.leave_balance);
vUse_Qty:=vUse_Qty-TEMP_CUR_RECORD.leave_balance;
end if;
end loop;
--end if;
--更新员工假期
PKG_LEAVE.Update_Leave_By_PK_PSNDOC(vPK_PSNDOC,vpk_org,'1002Z710000000021ZLJ',vCuryear,-999,vResult);
commit;
result:='Success';
end if;
end if;
end Insert_Leave_Mapping_AL;
/*********************************************************************************************************************
NAME: Insert_Leave_Mapping_WL
DESCRIPTION: 假期享有与司龄假抵扣 annual leave
PARAMETERS: pk_leaveb司龄假ID
Return: Success/Failed
USAGE: PKG_LEAVE.Insert_Leave_Mapping_WL();
1002Z710000000021ZLJ 年假
10018G1000000000BM37 上年年假
10018G1000000000BM2T 调整年假
10018G1000000000BM2P 年假延期
10018G1000000000BM2N 司龄假
10018G1000000000BM39 上年司龄假
10018G1000000000BM2R 调整司龄假
10018G1000000000BM2V 司龄假延期
10018G1000000000BM2L 补休
10018G1000000000BM33 调整补休
10018G1000000000BM35 补休延期
HISOTORY:
DATE NAME DESCRIPTION
2016-1-19 River PROCEDURE CREATED
***********************************************************************************************************************/
PROCEDURE Insert_Leave_Mapping_WL(ppk_leaveb CHAR,result out varchar2)
AS
CURSOR TEMP_CUR IS
select
tmp.ENJOY_LEAVE_ID,
tmp.pk_org,
(tmp.leave_qty-tmp.Use_QTY) as leave_balance,
tmp.leave_unit
from (
select
t.id as ENJOY_LEAVE_ID,
t.pk_psndoc,
t.pk_org,
t.end_date,
nvl((select sum(m.COMPENSATION_QTY) from HR_ELEAVE_MAPPING m where m.hr_employee_enjoy_leave_id = t.id and m.pk_leaveb<>ppk_leaveb),0) as Use_QTY,
t.leave_qty,
t.leave_unit
from HR_EMPLOYEE_ENJOY_LEAVE t
inner join tbm_leaveh h on h.pk_psndoc=t.pk_psndoc and h.pk_org=t.pk_org --and h.pk_leavetype=t.pk_timeitem
inner join tbm_leaveb l on l.pk_leaveh = h.pk_leaveh
where
l.pk_leaveb=ppk_leaveb and
t.pk_timeitem in ('10018G1000000000BM2N','10018G1000000000BM39','10018G1000000000BM2R','10018G1000000000BM2V') and
h.pk_leavetype in ('10018G1000000000BM2N','10018G1000000000BM39','10018G1000000000BM2R','10018G1000000000BM2V') and
(to_date(l.leaveenddate,'YYYY-MM-DD') between t.start_date and t.end_date or sysdate between t.start_date and t.end_date)
)tmp where tmp.leave_qty>tmp.Use_QTY
order by tmp.end_date;
vUse_Qty number;
vTotal_Enjoy_Qty number; --可休假
--vUse_Unit number; --1、天 2、小时
vPK_PSNDOC CHAR(20);
vpk_org CHAR(20);
vResult varchar2(20);
vCuryear CHAR(4);
vRecord_QTY number;
begin
result:='Failed';
select count(1) into vRecord_QTY from tbm_leaveb a where a.pk_leaveb=ppk_leaveb;
if vRecord_QTY>0 then --是否存在请假记录
--计算可休假
select
sum(tmp.leave_qty-tmp.Use_QTY) into vTotal_Enjoy_Qty
from (
select
nvl((select sum(m.COMPENSATION_QTY) from HR_ELEAVE_MAPPING m where m.hr_employee_enjoy_leave_id = t.id and m.pk_leaveb<>ppk_leaveb),0) as Use_QTY,
t.leave_qty
from HR_EMPLOYEE_ENJOY_LEAVE t
inner join tbm_leaveh h on h.pk_psndoc=t.pk_psndoc and h.pk_org=t.pk_org --and h.pk_leavetype=t.pk_timeitem
inner join tbm_leaveb l on l.pk_leaveh = h.pk_leaveh
where
l.pk_leaveb=ppk_leaveb and
t.pk_timeitem in ('10018G1000000000BM2N','10018G1000000000BM39','10018G1000000000BM2R','10018G1000000000BM2V') and
h.pk_leavetype in ('10018G1000000000BM2N','10018G1000000000BM39','10018G1000000000BM2R','10018G1000000000BM2V') and
(to_date(l.leaveenddate,'YYYY-MM-DD') between t.start_date and t.end_date or sysdate between t.start_date and t.end_date)
)tmp where tmp.leave_qty>tmp.Use_QTY;
--计算休假
select h.pk_psndoc,h.pk_org,
substr(l.leaveenddate,1,4),
(l.leavehour+
nvl((select sum(o.differencehour)
from tbm_leavereg r
inner join tbm_leaveoff o on o.pk_leavereg=r.pk_leavereg
where r.pk_billsourceb=l.pk_leaveb),0)
)
into vPK_PSNDOC,vpk_org,vCuryear,vUse_Qty
from tbm_leaveb l
inner join tbm_leaveh h on h.pk_leaveh = l.pk_leaveh
where l.pk_leaveb=ppk_leaveb;
if vTotal_Enjoy_Qty>=vUse_Qty then --有足够假期抵扣
delete from HR_ELEAVE_MAPPING t where t.pk_leaveb=ppk_leaveb;
For TEMP_CUR_RECORD in TEMP_CUR loop
if TEMP_CUR_RECORD.leave_unit=1 then --天数作单位
if TEMP_CUR_RECORD.leave_balance>=vUse_Qty then
insert into HR_ELEAVE_MAPPING(ID,HR_EMPLOYEE_ENJOY_LEAVE_ID,pk_leaveb,COMPENSATION_QTY) VALUES(HR_ELEAVE_MAPPING_SEQ.NEXTVAL,TEMP_CUR_RECORD.ENJOY_LEAVE_ID,ppk_leaveb,vUse_Qty);
exit;
else
insert into HR_ELEAVE_MAPPING(ID,HR_EMPLOYEE_ENJOY_LEAVE_ID,pk_leaveb,COMPENSATION_QTY) VALUES(HR_ELEAVE_MAPPING_SEQ.NEXTVAL,TEMP_CUR_RECORD.ENJOY_LEAVE_ID,ppk_leaveb,TEMP_CUR_RECORD.leave_balance);
vUse_Qty:=vUse_Qty-TEMP_CUR_RECORD.leave_balance;
end if;
else --小时作单位
if TEMP_CUR_RECORD.leave_balance>=vUse_Qty then
insert into HR_ELEAVE_MAPPING(ID,HR_EMPLOYEE_ENJOY_LEAVE_ID,pk_leaveb,COMPENSATION_QTY) VALUES(HR_ELEAVE_MAPPING_SEQ.NEXTVAL,TEMP_CUR_RECORD.ENJOY_LEAVE_ID,ppk_leaveb,vUse_Qty);
exit;
else
insert into HR_ELEAVE_MAPPING(ID,HR_EMPLOYEE_ENJOY_LEAVE_ID,pk_leaveb,COMPENSATION_QTY) VALUES(HR_ELEAVE_MAPPING_SEQ.NEXTVAL,TEMP_CUR_RECORD.ENJOY_LEAVE_ID,ppk_leaveb,TEMP_CUR_RECORD.leave_balance);
vUse_Qty:=vUse_Qty-TEMP_CUR_RECORD.leave_balance;
end if;
end if;
end loop;
--更新员工假期
PKG_LEAVE.Update_Leave_By_PK_PSNDOC(vPK_PSNDOC,vpk_org,'10018G1000000000BM2N',vCuryear,-999,vResult);
commit;
result:='Success';
end if;
end if;
end Insert_Leave_Mapping_WL;
/*******************************************************************************************************************
NAME: Insert_Leave_Mapping
DESCRIPTION: 假期享有与休假 抵扣
PARAMETERS: pPK_PSNDOC
pPK_TIMEITEM:
pLeave_StartDate
RETURN: Success/Failed
USAGE: PKG_LEAVE.Insert_Leave_Mapping(pPK_PSNDOC IN Char,pPK_TIMEITEM IN Char,pLeave_StartDate IN Char);
HISOTORY:
DATE NAME DESCRIPTION
2016-02-02 RIVER HE FUNCTION CREATED
********************************************************************************************************************/
FUNCTION Insert_Leave_Mapping (pLeave_No IN varchar2) RETURN varchar2
AS
CURSOR TEMP_CUR IS
select
h.pk_leavetype,
l.pk_leaveb
from tbm_leaveh h
inner join tbm_leaveb l on l.pk_leaveh = h.pk_leaveh
where h.bill_code=pLeave_No;
-- where h.pk_psndoc=pPK_PSNDOC and h.pk_leavetype=pPK_TIMEITEM and to_char(l.leavebegindate,'YYYYMMDD')=pLeave_StartDate;
vResult varchar2(50);
begin
vResult:='Success';
For TEMP_CUR_RECORD in TEMP_CUR loop
if TEMP_CUR_RECORD.pk_leavetype='1002Z710000000021ZLJ' or TEMP_CUR_RECORD.pk_leavetype='10018G1000000000BM37' or TEMP_CUR_RECORD.pk_leavetype='10018G1000000000BM2T' or TEMP_CUR_RECORD.pk_leavetype='10018G1000000000BM2P' then --年假
PKG_LEAVE.Insert_Leave_Mapping_AL(TEMP_CUR_RECORD.pk_leaveb,vResult);
elsif TEMP_CUR_RECORD.pk_leavetype='10018G1000000000BM2N' or TEMP_CUR_RECORD.pk_leavetype='10018G1000000000BM39' or TEMP_CUR_RECORD.pk_leavetype='10018G1000000000BM2R' or TEMP_CUR_RECORD.pk_leavetype='10018G1000000000BM2V' then --司龄假
PKG_LEAVE.Insert_Leave_Mapping_WL(TEMP_CUR_RECORD.pk_leaveb,vResult);
elsif TEMP_CUR_RECORD.pk_leavetype='10018G1000000000BM2L' or TEMP_CUR_RECORD.pk_leavetype='10018G1000000000BM33' or TEMP_CUR_RECORD.pk_leavetype='10018G1000000000BM35' then --补休
PKG_LEAVE.Insert_Leave_Mapping_OT(TEMP_CUR_RECORD.pk_leaveb,vResult);
end if;
vResult:=vResult;
end loop;
return vResult;
end Insert_Leave_Mapping;
/*******************************************************************************************************************
NAME: Insert_Leave_Mapping
DESCRIPTION: 假期享有与休假 抵扣
PARAMETERS: pPK_PSNDOC
pPK_TIMEITEM:
pLeave_StartDate YYYYMMDD
RETURN: Success/Failed
USAGE: PKG_LEAVE.pro_Insert_Leave_Mapping(pLeave_No);
HISOTORY:
DATE NAME DESCRIPTION
2016-02-05 RIVER HE FUNCTION CREATED
********************************************************************************************************************/
PROCEDURE pro_Insert_Leave_Mapping(pLeave_No varchar2,pResult out varchar2)
AS
CURSOR TEMP_CUR IS
select
h.pk_leavetype,
l.pk_leaveb
from tbm_leaveh h
inner join tbm_leaveb l on l.pk_leaveh = h.pk_leaveh
where h.bill_code=pLeave_No;
-- where h.pk_psndoc=pPK_PSNDOC and h.pk_leavetype=pPK_TIMEITEM and to_char(l.leavebegindate,'YYYYMMDD')=pLeave_StartDate;
begin
pResult:='Success';
For TEMP_CUR_RECORD in TEMP_CUR loop
if TEMP_CUR_RECORD.pk_leavetype='1002Z710000000021ZLJ' or TEMP_CUR_RECORD.pk_leavetype='10018G1000000000BM37' or TEMP_CUR_RECORD.pk_leavetype='10018G1000000000BM2T' or TEMP_CUR_RECORD.pk_leavetype='10018G1000000000BM2P' then --年假
PKG_LEAVE.Insert_Leave_Mapping_AL(TEMP_CUR_RECORD.pk_leaveb,pResult);
elsif TEMP_CUR_RECORD.pk_leavetype='10018G1000000000BM2N' or TEMP_CUR_RECORD.pk_leavetype='10018G1000000000BM39' or TEMP_CUR_RECORD.pk_leavetype='10018G1000000000BM2R' or TEMP_CUR_RECORD.pk_leavetype='10018G1000000000BM2V' then --司龄假
PKG_LEAVE.Insert_Leave_Mapping_WL(TEMP_CUR_RECORD.pk_leaveb,pResult);
elsif TEMP_CUR_RECORD.pk_leavetype='10018G1000000000BM2L' or TEMP_CUR_RECORD.pk_leavetype='10018G1000000000BM33' or TEMP_CUR_RECORD.pk_leavetype='10018G1000000000BM35' then --补休
PKG_LEAVE.Insert_Leave_Mapping_OT(TEMP_CUR_RECORD.pk_leaveb,pResult);
end if;
end loop;
end pro_Insert_Leave_Mapping;
/* 需要使用
CREATE OR REPLACE TRIGGER TRI_TBM_LEAVEB_D BEFORE DELETE ON TBM_LEAVEB FOR EACH ROW
declare
vPK_LEAVETYPE char(20);
vPK_PSNDOC char(20);
vCuryear char(4);
vResult varchar2(50);
BEGIN
select h.pk_leavetype,h.pk_psnjob,h.leaveyear into vPK_LEAVETYPE,vPK_PSNDOC,vCuryear from tbm_leaveh h where h.pk_leaveh=:OLD.pk_leaveh;
delete from HR_ELEAVE_MAPPING H WHERE H.PK_LEAVEB =:OLD.pk_leaveb;
PKG_LEAVE.Update_Leave_By_PK_PSNDOC(vPK_PSNDOC,vPK_LEAVETYPE,vCuryear,-999,vResult);
DBMS_OUTPUT.PUT_LINE('成功更新员工假期!');
END TRI_TBM_LEAVEB_D;
以下不用
-------------------------------
CREATE OR REPLACE TRIGGER TRI_TBM_LEAVEB AFTER INSERT OR UPDATE OR DELETE ON TBM_LEAVEB FOR EACH ROW
declare
vPK_LEAVETYPE char(20);
vresult varchar(30);
vPK_PSNDOC char(20);
vCuryear char(4);
BEGIN
--10018G1000000000BM2N 司龄假
--10018G1000000000BM39 上年司龄假
--10018G1000000000BM2R 调整司龄假
--10018G1000000000BM2V 司龄假延期
--1002Z710000000021ZLJ 年假
--10018G1000000000BM37 上年年假
--10018G1000000000BM2T 调整年假
--10018G1000000000BM2P 年假延期
--10018G1000000000BM2L 补休
--10018G1000000000BM33 调整补休
--10018G1000000000BM35 补休延期
select h.pk_leavetype,h.pk_psnjob,h.leaveyear into vPK_LEAVETYPE,vPK_PSNDOC,vCuryear from tbm_leaveh h where h.pk_leaveh=:NEW.pk_leaveh;
IF DELETING THEN
PKG_LEAVE.Update_Leave_By_PK_PSNDOC(vPK_PSNDOC,vPK_LEAVETYPE,vCuryear,-999);
DBMS_OUTPUT.PUT_LINE('成功更新员工假期!');
ELSE --INSERTING UPDATING
if vPK_LEAVETYPE='1002Z710000000021ZLJ' then
PKG_LEAVE.Insert_Leave_Mapping_AL(:NEW.pk_leaveb,vresult);
dbms_output.PUT_LINE('1 TRI_TBM_LEAVEB=' || vPK_LEAVETYPE);
elsif vPK_LEAVETYPE='10018G1000000000BM2N' then
PKG_LEAVE.Insert_Leave_Mapping_WL(:NEW.pk_leaveb,vresult);
dbms_output.PUT_LINE('2 TRI_TBM_LEAVEB=' || vPK_LEAVETYPE);
elsif vPK_LEAVETYPE='10018G1000000000BM2L' then
PKG_LEAVE.Insert_Leave_Mapping_OT(:NEW.pk_leaveb,vresult);
dbms_output.PUT_LINE('3 TRI_TBM_LEAVEB=' || vPK_LEAVETYPE);
end if;
END IF;
END TRI_TBM_LEAVEB;
CREATE OR REPLACE TRIGGER TRI_TBM_LEAVEB_D BEFORE DELETE ON TBM_LEAVEB FOR EACH ROW
BEGIN
delete from HR_ELEAVE_MAPPING H WHERE H.PK_LEAVEB=:OLD.pk_leaveb;
DBMS_OUTPUT.PUT_LINE('成功更新员工假期!');
END TRI_TBM_LEAVEB_D;
----------------------------------
CREATE OR REPLACE TRIGGER TRI_HR_EMPLOYEE_ENJOY_LEAVE AFTER INSERT OR UPDATE OR DELETE ON HR_EMPLOYEE_ENJOY_LEAVE FOR EACH ROW
declare
vPK_LEAVETYPE char(20);
vresult varchar(30);
BEGIN
---
1002Z710000000021ZLJ 年假
10018G1000000000BM37 上年年假
10018G1000000000BM2T 调整年假
10018G1000000000BM2P 年假延期
10018G1000000000BM2N 司龄假
10018G1000000000BM39 上年司龄假
10018G1000000000BM2R 调整司龄假
10018G1000000000BM2V 司龄假延期
10018G1000000000BM2L 补休
10018G1000000000BM33 调整补休
10018G1000000000BM35 补休延期
---
if :NEW.PK_TIMEITEM='10018G1000000000BM2T' or :NEW.PK_TIMEITEM='10018G1000000000BM2R' or :NEW.PK_TIMEITEM='10018G1000000000BM2P' or :NEW.PK_TIMEITEM='10018G1000000000BM2V' or :NEW.PK_TIMEITEM='10018G1000000000BM2L' or :NEW.PK_TIMEITEM='10018G1000000000BM33' or :NEW.PK_TIMEITEM='10018G1000000000BM35' then
PKG_LEAVE.Update_Leave_By_PK_PSNDOC(:NEW.PK_PSNDOC,:NEW.PK_TIMEITEM,:NEW.LEAVE_YYYY,-999);
--dbms_output.PUT_LINE('1 TRI_TBM_LEAVEB=' || vPK_LEAVETYPE);
end if;
END TRI_HR_EMPLOYEE_ENJOY_LEAVE;
-------------
declare
vresult varchar2(20);
begin
PKG_LEAVE.Auto_Gen_Employee_Leave(to_number(to_char(add_months(sysdate,-1),'YYYY')) ,to_number(to_char(add_months(sysdate,-1),'YYYY')),vresult);
PKG_LEAVE.Auto_Gen_Employee_Leave(to_number(to_char(sysdate,'YYYY')) ,to_number(to_char(sysdate,'YYYY')),vresult);
end;
-------------
select pk_timeitem,timeitemname from tbm_timeitem where timeitemname in ('年假','司龄假','上年年假','上年司龄假','调整年假','调整司龄假','年假延期','司龄假延期','补休','调整补休','补休延期')
*/
---add by waite
---定时追补预支假期抵扣
PROCEDURE pro_Supplement_Leave_Mapping(pResult out varchar2)
AS
CURSOR TEMP_CUR IS
--查询假期未插入Mapping的数据
select p.code, p.name, p.glbdef1,h.pk_leavetype,h.bill_code
from tbm_leaveb b
inner join tbm_leaveh h
on b.pk_leaveh = h.pk_leaveh
inner join bd_psndoc p
on p.pk_psndoc = h.pk_psndoc
where b.pk_leaveb not in (select m.pk_leaveb from hr_eleave_mapping m)and h.pk_leavetype in('1002Z710000000021ZLJ','10018G1000000000BM2N','10018G1000000000BM2L') ;
-- where h.pk_psndoc=pPK_PSNDOC and h.pk_leavetype=pPK_TIMEITEM and to_char(l.leavebegindate,'YYYYMMDD')=pLeave_StartDate;
begin
pResult:='Success';
For TEMP_CUR_RECORD in TEMP_CUR loop
PKG_LEAVE.pro_Insert_Leave_Mapping(TEMP_CUR_RECORD.BILL_CODE,pResult);
end loop;
end pro_Supplement_Leave_Mapping;
END PKG_LEAVE;