atdprocess.pas
来自「pasa人力资源考勤管理系统」· PAS 代码 · 共 1,026 行 · 第 1/5 页
PAS
1,026 行
readok:=true;
end
else
if qry1.fieldbyname('factout').value>recdatetime then
begin
out1:=recdatetime;
o:=true;
log:=ExtractFilePath(Application.ExeName)+'log\duplicateerr.txt';
if fileexists(log) then
begin
assignfile(logfile,log);
append(logfile);
writeln(logfile,pchar(formatdatetime('yyyy'+dateseparator+'mm'+dateseparator+'dd hh:mm:ss',now)+'读第'+inttostr(item)+'时段实际下班打卡记录时发现有重复打卡记录:'+cardno+rq+recdatetime));
closefile(logfile);
end else
begin
assignfile(logfile,log);
rewrite(logfile);
writeln(logfile,pchar(formatdatetime('yyyy'+dateseparator+'mm'+dateseparator+'dd hh:mm:ss',now)+'读第'+inttostr(item)+'时段实际下班打卡记录时发现有重复打卡记录:'+cardno+rq+recdatetime));
closefile(logfile);
end;
end;
readok:=true;
end; //stateout1
//更新记录
Query2.Close;
if g then
if o then
sql:='factgo='''+go1+''',factout='''+out1+''''
else
sql:='factgo='''+go1+''''
else
if o then
sql:='factout='''+out1+'''';
if length(sql)>0 then
begin
Query2.SQL.Text:='Update '+tablename+' set '+sql+' where cardno='''+cardno+''' and rq='''+rq+''' and itemtime='+inttostr(item)+' ';
Query2.ExecSQL;
end;
//标识成已处理
if readok then
begin
Query2.Close;
Query2.sql.text:='Update atd15010 set readok=1 where cardno='''+cardno+''' and recdate='''+rq+''' and state='''+state+''' ';
Query2.execsql;
end;
end;
adooriginal.Next;
end; //while
//将换班的资料转入换班主档
Query1.Close;
Query1.sql.Add('Insert into atd26010 (workno,cardno,rq,scheno,dothing,itemtime,mustgo,factgo,mustout,factout,musthours,'+ 'tempvalue,addtime,continuetime,decrease,ot,otkind,users,process) select * from '+tablename+' as a where a.users=''换班'' and a.process=0 ');
//将正常主档中的换班资料清除
Query1.SQL.Add('Delete from '+tablename+' where users=''换班'' and process=0 ');
Query1.ExecSQL;
end; //with
end;
//考勤日汇总
//source为考勤资料表,dest为日汇总表,ottable加班时数表,sourcechange考勤异动表,destchange日汇总异动表,otchange加班时数异动表
procedure TFormatdprocess.daytotal(source,dest,ottable,sourcechange,destchange,otchange:string);
label normal;
var
rq,lastrq,workno,mustgo,mustout:string; //rq,lastrq不一样时代表当天的资料处理完毕,此时应计算日薪
date1,date2:string;
factgo,factout:string;
late,early:integer;
musthours,facthours:real; //应出勤时数,实出勤时数
process:boolean; //以处理,多余时数算加班
otkind,leavekind:string; //加班类别
eveningot,overtimeot,eveninghours:real; //深夜加班时数,超时加班时数,实出勤时数,大夜班时数
kuanggong,ot,leavenon:real;
earlydec,latedec,kuanggongdec,leavedec,otmoney,eveningmoney,daytimemoney,daytimeadd,basemoney,addmoney,presentdec:real; //早退扣款,迟到扣款,旷工扣款,请假扣款,加班费,大夜班钱,正常出勤底薪,正常出勤津贴,底薪,津贴,全勤奖扣除倍数
days,fixot:real; //本月应出勤天数由行事历得来,加班费元/小时
m,x:string; //找出津贴项目
i:integer;
monthy,cmonthy,kmonthy:string; //monthy用于正常流程,cmonthy用于异动流程,kmonthy用于汇总月考勤流程
bookmark1:TBookMark;
firstrq:string;
function earlylate(earlylate:integer;var present:real):real; //计算迟到早退扣款
var
dec:real;
begin
dec:=0;
with datamod do
begin
if adosalsetlatestyle.asboolean then //按时间计迟到早退
begin
dec:=earlylate div adosalsetlatemin1.value;
if (earlylate mod adosalsetlatemin1.value)>0 then
if adosalsetlatecan.AsBoolean then //不够也按那样算
dec:=dec +1;
dec:=dec*adosalsetlatemoney1.value;
present:=present+1;
end else //按次数计
begin
if (earlylate>adosalsetlatetime.value) and (earlylate<adosalsetlatemin1.value) then
begin
dec:=basemoney * adosalsetlatebase2.value + addmoney * adosalsetlateadd2.value + adosalsetlatemoney2.value;
present:=present+adosalsetlateqq2.value;
end
else if (earlylate>adosalsetlatemin2.value) and (earlylate<adosalsetlatemin3.value) then
begin
dec:=basemoney * adosalsetlatebase3.value + addmoney * adosalsetlateadd3.value + adosalsetlatemoney3.value;
present:=present+adosalsetlateqq3.value;
end;
end;
result:=dec;
end;
end; //计算迟到早退
function CalcMonthy(rq:string):string; //计算此日属于那月
var
month:string;
begin
with datamod do
begin
if (adosalsetcalcmoneysrq.value<adosalsetcalcmoneyerq.value) then //若月结是在本月
month:=copy(lastrq,1,6) //26~25 28日
else
begin
if (adosalsetcalcmoneymon.value='0') then //计前月
begin
if ((copy(lastrq,7,2)>=adosalsetcalcmoneysrq.value) and (copy(lastrq,7,2)>adosalsetcalcmoneyerq.value)) then //跨月结且算成前月的
month:=copy(lastrq,1,6)
else if ((copy(lastrq,7,2)<=adosalsetcalcmoneyerq.value) and (copy(lastrq,7,2)<adosalsetcalcmoneysrq.value)) then
month:=monthdec(lastrq,-1);
end
else if (adosalsetcalcmoneymon.value='2')then //计后月
begin
if ((copy(lastrq,7,2)>=adosalsetcalcmoneysrq.value) and (copy(lastrq,7,2)>adosalsetcalcmoneyerq.value)) then //跨月结且算成前月的
month:=monthdec(lastrq,1)
else if ((copy(lastrq,7,2)<=adosalsetcalcmoneyerq.value) and (copy(lastrq,7,2)<adosalsetcalcmoneysrq.value)) then
month:=copy(lastrq,1,6);
end;
end;
result:=month;
end; //with
end; //计算此日属于那月
//latetime,earlytime,kuatime,ohours,fhours,ehours,lhours,kind 为出勤资料
//ldec,edec,kdec,bmoney,addmoney,omoney,adec,pdec 为结果存放处
//base,add,fix 为薪资资料
//ottablename,workno,rq 为加班资料来源
procedure CalcMoney(latetime,earlytime:integer;kuatime,ohours,fhours,ehours,lhours:real;lkind:string;
var ldec,edec,kdec,bmoney,addmoney,omoney,adec,pdec:real;base,add,fix:real;ottablename,workno,rq:string); //计算薪资
var
emoney:real; //大夜班薪资
begin
with datamod do
begin
if adosalsetbyday.AsString='日' then //迟到早退按日计时才处理否则月汇总表中计算
begin
ldec:=earlylate(latetime,pdec); //迟到扣款
edec:=earlylate(earlytime,pdec); //早退扣款
if adosalsetkgdayunit.AsString='小时' then
begin
kdec:=kuatime*adosalsetkgdaymoney.value*(base/adosalsetdivhours.AsFloat)+adosalsetkgdayadd.value*add;//旷工扣款
end
else // basemoney/adosalsetdivhours.AsFloat时薪
kdec:=kuatime*adosalsetkgdaymoney.value+adosalsetkgdayadd.value*add;
emoney:=ehours*adosalseteveningtimes.value*(base/adosalsetdivhours.AsFloat)+adosalseteveningmoney.Value; //大夜班薪资
bmoney:=fhours*(base/adosalsetdivhours.AsFloat)+emoney; //正常出勤底薪
addmoney:=fhours*(add/adosalsetdivhours.AsFloat); //正常出勤津贴
Query1.Close; //找加班时数及类别
Query1.SQL.text:='Select * from '+ottablename+' where workno='''+workno+''' and rq='''+lastrq+''' ';
Query1.Open;
Query1.First;
while not Query1.eof do
begin
if Query1.fieldbyname('otkind').asstring='深夜加班' then //加班费为:时数*倍数*时薪+补贴
omoney:=otmoney+Query1.fieldbyname('othours').value*(fix)*adosalsetovertimes1.value+adosalsetotmoney1.value
else if Query1.fieldbyname('otkind').asstring='超时加班' then //加班费为:时数*倍数*时薪+补贴
omoney:=otmoney+Query1.fieldbyname('othours').value*(fix)*adosalsetovertimes2.value+adosalsetotmoney2.value
else if adootkind.Locate('otkind',Query1.fieldbyname('otkind').value,[]) then
omoney:=otmoney+Query1.FieldByName('othours').value*(fix)*adootkindotmoney.value;
Query1.next;
end; //加班时数及类别
//计算请假扣钱,若为有薪假不扣
if adoaskkind.Locate('askkind',leavekind,[]) then
begin
if adoaskkindhavemoney.asstring='无薪假' then
begin //请假扣薪资
adec:=lhours*adoaskkindbasedec.value*(base/adosalsetdivhours.AsFloat)+lhours*adoaskkindadddec.value*(add/adosalsetdivhours.AsFloat);
//请假扣全勤
if (lhours>adoaskkindhours1.value) and (lhours<adoaskkindhours2.value) then
pdec:=pdec+adoaskkindpresent1.value
else if (lhours>adoaskkindhours2.value) then
pdec:=pdec+1;
end;
end; //计算请假扣钱
end;
end; //with
end; //计算薪资
begin
with datamod do
begin
adoatdset.open;
adosalset.Open;
adootkind.Open;
adoaskkind.Open;
Adopersonal.Close;
Adopersonal.commandtext:='Select * from per24010 where brushcard=1 order by workno';
Adopersonal.open;
Adopersonal.first;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?