公佈一下工資管理系統中核心部分工資計算的程式碼
終於完成了工資計算部分的程式碼,請大家指教一下
使用者可以自行定義工資計算公式:例如
實發工資=應發工資-應扣工資
個人所得稅=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
相關文章
- 資料庫:系統設計的核心資料庫
- 大資料分散式計算系統 Spark 入門核心之 RDD大資料分散式Spark
- 開放資料中心聯盟公佈8個雲端計算需求
- win10系統下工作管理員視窗沒有程式一欄的解決方法Win10
- win10系統下工作管理員如何檢視程式PIDWin10
- 公佈上一次搜尋引擎的程式碼
- 資料庫系統-設計、實現與管理(一)資料庫
- 揭祕騰訊程式碼管理核心—工蜂Git系統架構Git架構
- 試驗資料管理系統在其它系統中的定位
- 眾至科技資料防洩露系統,保護企業辦公核心資料
- 雲端計算:大資料時代的系統工程(三)大資料
- 雲端計算:大資料時代的系統工程(二)大資料
- 自動駕駛系統程式碼洩露,黑客公佈特斯拉 Semi Truck 細節自動駕駛黑客
- OA 辦公管理系統模組 設計方案
- 程式碼·--四則運算的主要核心程式碼
- win10系統下工作管理員閃退的解決方法Win10
- 企業學習資料管理系統與公開課堂
- 競拍系統設計和核心資料結構資料結構
- CRM辦公管理系統
- 在 MySQL 中,如何計算一組資料的中位數?MySql
- 資料管理系統設計和實現
- Laravel核心程式碼學習 — 事件系統Laravel事件
- Laravel核心程式碼學習 -- 事件系統Laravel事件
- 推薦!國外程式設計師整理的系統管理員資源大全程式設計師
- 標題:電商後臺管理系統——資料統計
- PGL系統管理部相簿
- 大資料計算生態之資料計算(一)大資料
- 以資料為核心的資訊系統
- 學生管理系統程式碼
- 資料統計工具與常用的核心資料指標指標
- 大型公建能耗監測系統-源中瑞能源管理系統
- 預算管理系統
- 免費OA辦公系統在企業管理中的作用
- 美國銀行公佈基於區塊鏈的外部資料驗證系統專利區塊鏈
- 資料庫課程設計-宿舍管理系統資料庫
- SAP系統中的一些標準的工具程式或樣例程式資源
- 文化和旅遊部公佈《遊戲遊藝裝置管理辦法》遊戲
- 秒殺系統設計中的資料處理