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 + -
显示快捷键?