公布一下工资管理系统中核心部分工资计算的代码

原创 2006年06月09日 17:32:00

终于完成了工资计算部分的代码,请大家指教一下

用户可以自行定义工资计算公式:例如

实发工资=应发工资-应扣工资
个人所得税=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;
       
    }

CCF201612-2 工资计算(100分)

试题编号: 201612-2 试题名称: 工资计算 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   小明的公司每个月给小明发工资,而小明拿...
  • tigerisland45
  • tigerisland45
  • 2017年01月31日 16:29
  • 3628

5-10 计算工资 (15分)

某公司员工的工资计算方法如下:一周内工作时间不超过40小时,按正常工作时间计酬;超出40小时的工作时间部分,按正常工作时间报酬的1.5倍计酬。员工按进公司时间分为新职工和老职工,进公司不少于5年的员工...
  • qq_26570353
  • qq_26570353
  • 2016年04月02日 10:58
  • 1547

python练习-工资计算器

python练习-工资计算器 源代码如下: #! /usr/bin/env python def get_user_salary_sum(): salary = (raw_input("P...
  • halazi100
  • halazi100
  • 2016年06月18日 02:00
  • 631

ccf试题 工资计算

问题描述   小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资。假设他一个月的税前工资(扣除五险一金后、未扣税前的工资)为S元,则他应交的个人所得税按如下公式计算: ...
  • wqy20140101
  • wqy20140101
  • 2017年01月31日 16:59
  • 862

SAP 人力资源工资配置项1---工资计算周期配置

对于工资计算,需要配置三方面内容:工资计算周期、工资类型、工资项。   以下是配置工资计算周期配置: 1、定义期间参数 期间参数表明了工资核算的频率。 主题 设置期间参数 菜单路径 SAP...
  • xiouluoyang
  • xiouluoyang
  • 2014年06月10日 16:21
  • 3511

工资计算(用SQL来计算)

工资计算的公式是: 税金 = (工资 - 社保公积金 - 3500)*0.25 - 1005 税后 = 工资 - 社保公积金 - ((工资-社保公积金-3500)*0.25-1005)       ...
  • yupeigu
  • yupeigu
  • 2017年04月12日 11:09
  • 1188

SAP HR Schema 详解(三)工资核算基础

1 工资项(wage type)的分类 1.1  主要工资项 Primary wage tapes 主要工资项也称为对话工资项由用户前台手工输入,或通过系统设定的时间来产生。通过复制系统标准的技术...
  • CrazyNight_10
  • CrazyNight_10
  • 2017年03月22日 14:22
  • 853

java :工资计算

java :工资计算
  • qq_22808479
  • qq_22808479
  • 2017年03月20日 10:36
  • 369

js作业--自己写

1.编写一个程序,计算增加后的工资。要求工龄满5,增加20%工资;若2—4,则增加15%;若小于2,则增加10%工资。 Document 输入工作年份 输入工资 点击...
  • sinat_36146776
  • sinat_36146776
  • 2016年10月21日 20:55
  • 915

CSP考试 2016年12月第2题 工资计算 C++实现

#include using namespace std; int main() { int a; cin>>a; int b; int jg; if(a>3500) { b=a-...
  • woniupengpeng
  • woniupengpeng
  • 2016年12月21日 19:17
  • 589
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:公布一下工资管理系统中核心部分工资计算的代码
举报原因:
原因补充:

(最多只允许输入30个字)