感谢 achen0207 分享脚本,让更多的人可以参考。 //作者:绍兴-和尚 //时间:2016-10-07 //背景情况:仅需要实际出勤天数来核算工资。 //作用:在考勤日报中 //1、判断是否入职但为上岗人员,有则删除; //2、判断是否有离职但排版提早已经拍了的,有则删除; //3、判断人员的辅助分组:行政人员双休和法定假日需要加班申请后该日考勤才会计算;非行政人员法定假日需要加班申请;,,,,如果没有加班申请,则删除。 //4、判断在超过排班(含指定加班时间)限定时间的加班,有没有加班申请记录,如果有的话,则延续加班时间,否则就不算加班。譬如规定规定是加班到16:40,但实际这个人加班到19:40,而公司又需要认可这个加班19:40的时间段,则必须额外写加班申请。 //离职日期,上岗日期,考勤日期,,,,,,,,,,,,,,,有的班次存在下班打卡1和下班打开2两种情况 int leave_date,post_date,考勤日期,法定工作时间,法定内实际工作时间,法定假日,允许加班分钟数,允许加班结束时间; //员工状态,运行SQL语句,提取当前考勤年月,班次类型,人员类型表示行政非生产和生产类别 string state, sql,考勤年月,班次,人员类型,删除当天排班标记; int 停工放假判断标识符,count,count_jb,n1; /* //员工请假 int beg_time1,end_time1,请假时刻1,请假时刻2; int beg_date,end_date,n1,beg_time,end_time,n2; int 时刻1,时刻2,count_jb; string 时刻11,时刻21; */ //---------------------------------------------------------------------- 法定工作时间=合计分钟数+迟到分钟数+早退分钟数+缺勤分钟数-加班折算分钟数;//8小时内 法定内实际工作时间=合计分钟数+迟到分钟数+早退分钟数-加班折算分钟数;//8小时内 停工放假判断标识符=0; 允许加班分钟数=0; 班次=str_get_sub(班次编号,0,1); 考勤日期=to_int(str_get_sub(class_date,0,8)); leave_date=get_emp_info(emp_id,"leave_date"); state=get_emp_info(emp_id,"sate"); post_date=get_emp_info(emp_id,"post_date"); 考勤年月=str_get_sub(class_date,0,6); 考勤年月=考勤年月+"%"; 删除当天排班标记=计算结果; //---------------------------------------------------------------------- if (state=="F" && 考勤日期>leave_date) { //离职日>考勤日,则要过滤; 删除当天排班标记="C"; }else if (考勤日期<post_date) { //上岗日<考勤日,则要过滤; 删除当天排班标记="C"; }else { //正常工作日 //--------------备注="班次类型:"+ 班次;-------------- if (计算结果!="C" )//C表示缺勤;H表示停工放假;至少上了半天 { //--------------判断是否法定假日-------------- 法定假日=dt_get_name("Holidays",考勤日期); //--------------判断人员的辅助分组,行政人员双休和法定假日需要加班申请后该日考勤才会计算,非行政人员法定假日需要加班申请-------------- sql="select beg_time,hours,minutes,benefit_state from timer_overtime where 1=1 "; sql=sql+" and emp_id='"+emp_id+"'"; sql=sql+" and (overtime_date = '"+考勤日期+"' )"; db_run(sql); count_jb=db_row_count(); if (count_jb>0) { //msg("1"); 允许加班分钟数=to_int(db_res(1)*60)+to_int(db_res(2)); 允许加班结束时间=to_int(str_get_sub(db_res(0),0,2))*60+to_int(str_get_sub(db_res(0),2,2))+允许加班分钟数; if (get_week_id(class_date)==6 || get_week_id(class_date)==7 || 法定假日!=考勤日期) {//如果该日是双休日或者法定假日 if (合计分钟数>允许加班分钟数) { 合计分钟数=允许加班分钟数; 迟到分钟数=0; 早退分钟数=0; 加班分钟数=0; 缺勤分钟数=0; if(允许加班分钟数>480){加班折算分钟数=合计分钟数-480; }else{加班折算分钟数=0; } 法定工作时间=合计分钟数+迟到分钟数+早退分钟数+缺勤分钟数-加班折算分钟数;//8小时内 法定内实际工作时间=合计分钟数+迟到分钟数+早退分钟数-加班折算分钟数;//8小时内 } }else {//如果该日是普通工作日 if (加班折算分钟数>=允许加班分钟数)//如果实际加班时间比允许加班时间大,则按照加班时间来限定。 { 合计分钟数=合计分钟数-加班折算分钟数+允许加班分钟数; 加班折算分钟数=允许加班分钟数; 法定工作时间=合计分钟数+迟到分钟数+早退分钟数+缺勤分钟数-加班折算分钟数;//8小时内 法定内实际工作时间=合计分钟数+迟到分钟数+早退分钟数-加班折算分钟数;//8小时内 }else{//如果实际加班时间比加班申请时间小,但又超过了原有班次限定的加班时间。譬如规定规定是加班到16:40,但实际这个人加班到19:40,而公司又需要认可这个加班19:40的时间段,则必须额外写加班申请。 int 时刻on,时刻off,实际加班时间,beg_time_1,end_time_2;//上班打卡时间,下班打卡时间 时刻on=to_int(str_get_sub(on_time_1,0,2))*60+to_int(str_get_sub(on_time_1,3,2)); 时刻off=to_int(str_get_sub(off_time_2,0,2))*60+to_int(str_get_sub(off_time_2,3,2)); sql="select beg_time_1,end_time_2 from timer_class_def where 1=1 "; sql=sql+" and class_id='"+班次编号+"'"; db_run(sql); count_jb=db_row_count(); if (count_jb>0) { //msg(count_jb); beg_time_1=to_int(str_get_sub(db_res(0),0,2))*60+to_int(str_get_sub(db_res(0),2,2)); //end_time_2=to_int(str_get_sub(db_res(1),0,2))*60+to_int(str_get_sub(db_res(1),2,2)); if(beg_time_1>时刻on){ 时刻on=beg_time_1; } } if(时刻off>允许加班结束时间){ 时刻off=允许加班结束时间; } //实际加班时间 实际加班时间=时刻off-时刻on-法定工作时间; if((时刻off-时刻on)<0){ 实际加班时间=24*60+时刻off-时刻on-法定工作时间; } if(实际加班时间>加班折算分钟数 && 实际加班时间<=允许加班分钟数){ 合计分钟数=合计分钟数-加班折算分钟数+实际加班时间; 加班折算分钟数=实际加班时间; 法定工作时间=合计分钟数+迟到分钟数+早退分钟数+缺勤分钟数-加班折算分钟数;//8小时内 法定内实际工作时间=合计分钟数+迟到分钟数+早退分钟数-加班折算分钟数;//8小时内 } } } }else{ //msg("2"); if (get_week_id(class_date)==6 || get_week_id(class_date)==7 || 法定假日!=考勤日期) { //get_emp_info(emp_id,"cross_group_id") //辅助分组:A行政,B非生产,C生产 人员类型=get_emp_info(emp_id,"cross_group_id"); if(人员类型=="A" ) { 删除当天排班标记="C";//如果A行政人员双休日或者法定日没有加班申请单,则定义本项【缺勤】,后续进行删除 } else if (人员类型=="B" && 法定假日!=考勤日期 ) { 删除当天排班标记="C";//如果B非生产人员法定日没有加班申请单,则定义本项【缺勤】,后续进行删除 } else if (人员类型=="C" && 法定假日!=考勤日期 ) { 删除当天排班标记="C";//如果C生产人员法定日没有加班申请单,则定义本项【缺勤】,后续进行删除 } } } if (删除当天排班标记!="C" )//C表示缺勤;H表示停工放假;至少上了半天 { //-----------------班次计算------------------------ switch (班次){ case "A": 数值一=法定内实际工作时间/法定工作时间; break; case "Z": 数值二=法定内实际工作时间/法定工作时间; break; case "Y": 数值三=法定内实际工作时间/法定工作时间; break; case "B": 数值一=法定内实际工作时间/法定工作时间; break; } 数值四=num_dec_cut(加班折算分钟数/60.0/8.0,2); 数值七=数值一+数值二+数值三+数值四; if (法定假日!=考勤日期) { 数值五=num_dec_cut(加班折算分钟数/60.0/8.0,2); 数值六=法定内实际工作时间/法定工作时间; 备注="法定假日"; } } } } //----------------------------------------------------------------------删除双休日节假日缺勤的记录 //msg("注意,法定节假日加班,请在首页加班记录申请。"); //判断如果是周六周日缺勤,则清除这一排班日报记录 if ((get_week_id(class_date)==6 || get_week_id(class_date)==7 || 法定假日!=考勤日期 )&& 删除当天排班标记=="C"){ sql="delete from timer_list where 1=1 "; sql=sql+" and emp_id='"+emp_id+"' "; sql=sql+" and class_date='"+class_date+"'"; sql=sql+" and class_id='"+班次编号+"'"; db_run(sql); // msg(class_date); } |