公佈一下工資管理系統中核心部分工資計算的程式碼

gudesheng發表於2008-01-03

終於完成了工資計算部分的程式碼,請大家指教一下

使用者可以自行定義工資計算公式:例如

實發工資=應發工資-應扣工資
個人所得稅=tax(應發工資)

 

CREATE TABLE pq_unitgzxm (
   unit_id char(8) NOT NULL DEFAULT '',
   xmbh int NOT NULL DEFAULT 0,
   xmmc varchar(200) NOT NULL DEFAULT '',
   gs varchar(400) NOT NULL DEFAULT '',
   gdx bit NOT NULL DEFAULT '0',
   bz varchar(200) NOT NULL DEFAULT '',
   xtnd bit NOT NULL DEFAULT '0'
  )
 
Go
INSERT INTO pq_unitgzxm values ('00000001',1,'基本工資'  ,'',1,'',0);                 
INSERT INTO pq_unitgzxm values ('00000001',2,'獎金'      ,'',1,'',0);                 
INSERT INTO pq_unitgzxm values ('00000001',3,'應發工資'  ,'',1,'',0);                 
INSERT INTO pq_unitgzxm values ('00000001',4,'個人所得稅','',1,'系統內定,不可修改',1);
INSERT INTO pq_unitgzxm values ('00000001',5,'應扣工資'  ,'',1,'',0);                 
INSERT INTO pq_unitgzxm values ('00000001',6,'實發工資'  ,'',1,'系統內定,不可修改',1);

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[pq_gzb]')
   and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [pq_gzb]
CREATE TABLE pq_gzb (
   gzb_id char(8) NOT NULL PRIMARY KEY,
   unit_id char(8) NOT NULL DEFAULT '',    /* 單位id */
   dwmc varchar(400)  NOT NULL DEFAULT '', /* 單位名稱 */
   gzqjyear char(4)  NOT NULL DEFAULT '',  /* 工資期間年 */
   gzqjperiod char(2)  NOT NULL DEFAULT '', /* 工資期間期 */
   gzffksrq varchar(10)  NOT NULL DEFAULT '',    /* 工資發放開始日期 */
   gzffjsrq varchar(10)  NOT NULL DEFAULT '',   /* 工資發放結束日期 */

   jsshebao varchar(2)  NOT NULL DEFAULT '',  /* 計算社保 */
   shebaoksrq varchar(10)  NOT NULL DEFAULT '',    /* 社保開始日期 */
   shebaojsrq varchar(10)  NOT NULL DEFAULT '',   /* 社保結束日期 */
   fh varchar(8) NOT NULL DEFAULT '',         /* 複合 */
   fhr varchar(20) NOT NULL DEFAULT ''        /* 複合人 */
  )  
 
Go
 
INSERT INTO pq_gzb (gzb_id,unit_id,dwmc,gzqjyear,gzqjperiod,gzffksrq,gzffjsrq,jsshebao,fh,fhr) values ('00000001','00000001','軟體','2006','04','2006-04-01','2006-04-30','1','','');   


if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[pq_gzmx]')
   and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [pq_gzmx]
CREATE TABLE pq_gzmx (
   gzb_id char(8) NOT NULL DEFAULT '',
   employee_id char(8) NOT NULL DEFAULT '',
   xm varchar(400)  NOT NULL DEFAULT '',
   dwmc varchar(400)  NOT NULL DEFAULT '',
   unitcontract_id char(8) NOT NULL DEFAULT '',
   employeecontract_id char(8) NOT NULL DEFAULT '',
   gzffksrq varchar(10)  NOT NULL DEFAULT '',    /* 工資發放開始日期 */
   gzffjsrq varchar(10)  NOT NULL DEFAULT '',   /* 工資發放結束日期 */
   yff varchar(8) NOT NULL DEFAULT '',       /* 已發放 */
   gzdata1 decimal  NOT NULL DEFAULT '0',
   gzdata2 decimal  NOT NULL DEFAULT '0',
   gzdata3 decimal  NOT NULL DEFAULT '0',
   gzdata4 decimal  NOT NULL DEFAULT '0',
   gzdata5 decimal  NOT NULL DEFAULT '0',
   gzdata6 decimal  NOT NULL DEFAULT '0',
   gzdata7 decimal  NOT NULL DEFAULT '0',
   gzdata8 decimal  NOT NULL DEFAULT '0',
   gzdata9 decimal  NOT NULL DEFAULT '0',
   gzdata10 decimal  NOT NULL DEFAULT '0',
   gzdata11 decimal  NOT NULL DEFAULT '0',
   gzdata12 decimal  NOT NULL DEFAULT '0',
   gzdata13 decimal  NOT NULL DEFAULT '0',
   gzdata14 decimal  NOT NULL DEFAULT '0',
   gzdata15 decimal  NOT NULL DEFAULT '0',
   gzdata16 decimal  NOT NULL DEFAULT '0',
   gzdata17 decimal  NOT NULL DEFAULT '0',
   gzdata18 decimal  NOT NULL DEFAULT '0',
   gzdata19 decimal  NOT NULL DEFAULT '0',
   gzdata20 decimal  NOT NULL DEFAULT '0'
  )   

Go  
INSERT INTO pq_gzmx (gzb_id,employee_id,xm,dwmc,unitcontract_id,employeecontract_id,gzffksrq,gzffjsrq,gzdata1) values ('00000001','00000001','張三','軟體','00000001','00000001','2006-04-01','2006-04-30',0);   
INSERT INTO pq_gzmx (gzb_id,employee_id,xm,dwmc,unitcontract_id,employeecontract_id,gzffksrq,gzffjsrq,gzdata1) values ('00000001','00000002','李四','軟體','00000001','00000002','2006-04-01','2006-04-30',0);   

function cal_salary($gzb_id = '',$error = '') {
 global $db, $me, $t,$_POST;

 
 extract($_POST);
 if ($gzb_id && !$error) {
    $unit = $db->GetRow("select unit_id,dwmc from ".TBL_GZB." where gzb_id = '$gzb_id'");
    $unit_id = $unit['unit_id'];
    $dwmc = $unit['dwmc'];
  
      //取出該單位所有的工資項
    $unitgzxm = $db->GetAll("select xmmc,gdx,gs from ".TBL_UNITGZXM." where unit_id = '$unit_id'");
   
    //取出所有的工資表
    $rs = $db->Execute("select * from ".TBL_GZMX." where gzb_id = '$gzb_id'");
   
    while (!$rs->EOF) {  //取到工資表的一行,對這一行開始處理計算
     
     debug_echo("Now cal the employee:".$rs->fields['employee_id']);
     //先得到一個本行的名值對,如$data['應發工資']['value']=>'1000' $data['實發工資']['value']=>'1000'
     for ($i = 0, $count = count($unitgzxm); $i < $count; $i++) {
      
        $data[$unitgzxm[$i]['xmmc']]['value'] = $rs->fields['gzdata'.($i+1)];
        $data[$unitgzxm[$i]['xmmc']]['gs'] = $unitgzxm[$i]['gs'];
      
            if($unitgzxm[$i]['gdx']==1) { //是固定項的,用來計算
             
             if(trim($unitgzxm[$i]['gs'])!="") {
                $data[$unitgzxm[$i]['xmmc']]['ready'] = 0;  //表示該值尚沒有計算好
              }else {
               $data[$unitgzxm[$i]['xmmc']]['ready'] = 1; //固定項,但公式為空,也看成準備就緒
              }
              
            } else {
             
               $data[$unitgzxm[$i]['xmmc']]['ready'] = 1; //表示該值準備就緒
              
            }
        }      
       
        //print_r($data);
       
        $allcal = 0; //所有都計算完的標誌,為1時表示計算完畢
        while($allcal ==0) {
         $havecontinue = 0;
          for ($i = 0, $count = count($unitgzxm); $i < $count; $i++) {
         
            if($data[$unitgzxm[$i]['xmmc']]['ready']==0) { //該值尚未計算好,進行計算
           
             
                $allready = 1; // 公式中所有項都ready了麼?
               
                //取出公式裡面所有的中文
                 preg_match_all("/[".chr(0xa1)."-".chr(0xff)."]+/", $data[$unitgzxm[$i]['xmmc']]['gs'],$matches, PREG_SET_ORDER);
                
                 //檢查每一項ready情況
                 foreach ($matches as $val) {
                   if($data[$val[0]]['ready'] == 0)  {
                        $allready = 0;
                   }
                   else {
                      $data[$unitgzxm[$i]['xmmc']]['gs'] = str_replace($val[0], $data[$val[0]]['value'], $data[$unitgzxm[$i]['xmmc']]['gs']);
                   }
                  
                 }
                 debug_echo("the cal is".$data[$unitgzxm[$i]['xmmc']]['gs']);
                
                
                 //所有項都ready,就開始計算,計算完畢,$data[$unitgzxm[$i]['xmmc']]['ready'] = 1
                 //否則continue,繼續for迴圈,檢查下一個變數,並置havecontinue標誌
                
                 if($allready==1) {
                     //先替換變數
                    
                     //開始計算
                     $expression = $data[$unitgzxm[$i]['xmmc']]['gs'];
                    
                    
                     //$expression = "(2.33*6)";
                     $rpn = new Math_Rpn();
                     $value = $rpn->calculate($expression,'deg',false);
                     debug_echo("The value is ".$value);
                    
                     $record["gzdata".($i+1)] = $value;
                    
                     $data[$unitgzxm[$i]['xmmc']]['ready'] = 1;    
                 } else {
                      $havecontinue = 1;
                      continue;
                 }
                
              
           
            }
         
          } 
         
          if(!$havecontinue) $allcal = 1;
         
        }
       
        $db->AutoExecute(TBL_GZMX,$record,'UPDATE', "gzb_id = '$gzb_id' and employee_id='".$rs->fields['employee_id']."'");

                     
      $rs->MoveNext();
      } 
     
 }
 show_form($gzb_id);
}

pear RPN包中加入了tax()的自定義函式如下

'tax'  => array ('tax', 3, 1, '_tax'), //hack by Daniel Summer for rcpq

    /**
     * Tax function
     *
     * @param array $temp Temporary array
     * @param integer $pos Position of operator
     * @return float Function's relult
     * @access private
     */
    function _tax($temp, $pos) {
     global $db;
     
     $value = $temp[$pos-1];
     $base = $db->GetOne("select * from ".TBL_TAX_BASE." where name = 'base'");
     
     if($value < $base) return 0; //
     
     $value = $value - $base;
     $rates = $db->GetAll("select * from ".TBL_TAX_RATE);
     
     
      for ($i = 0, $count = count($rates); $i < $count; $i++) {
       if($value>=$rates[$i]['bottomline'] && $value<=$rates[$i]['topline']) {
          $value = $value * $rates[$i]['rate'];
          $value = $value - $rates[$i]['quickcal'];
          break;
        }
     
      } 
     
     
        return $value;
       
    }



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=783572


相關文章