计算五险一金的存储过程:calc_salary

calc_salary源码如下:

/* Formatted on 2008/03/06 12:56 (Formatter Plus v4.8.8) */
CREATE OR REPLACE PROCEDURE calc_salary (
    p_basic_wages                IN   NUMBER,                                                  --基本工资
    p_pension_insurance_1        IN   NUMBER DEFAULT 0.20,
    --养老保险公司缴存比例
    p_pension_insurance_2        IN   NUMBER DEFAULT 0.08,
    --养老保险个人缴存比例
    p_medical_insurance_1        IN   NUMBER DEFAULT 0.10,
    --医疗保险公司缴存比例
    p_medical_insurance_2        IN   NUMBER DEFAULT 0.02,
    --医疗保险个人缴存比例+3元
    p_unemployment_insurance_1   IN   NUMBER DEFAULT 0.015,
    --失业保险公司缴存比例
    p_unemployment_insurance_2   IN   NUMBER DEFAULT 0.005,
    --失业保险个人缴存比例
    p_workinjury_insurance_1     IN   NUMBER DEFAULT 0,
    --工伤保险公司缴存比例,个人不交
    p_maternity_insurance_1      IN   NUMBER DEFAULT 0,
    --生育保险公司缴存比例,个人不交
    p_house_fund_1               IN   NUMBER DEFAULT 0.08,
    --住房公积金公司缴存比例
    p_house_fund_2               IN   NUMBER DEFAULT 0.08,                       --住房公积金个人缴存比例
    p_medical_insurance_fee      IN   NUMBER DEFAULT 3,                           --医疗保险个人工本费3元
    p_tax_start                  IN   NUMBER DEFAULT 2000                                  --纳税起征额度
)
/*
"五险一金",包括养老保险、医疗保险、失业保险、工伤保险和生育保险,一金指的是住房公积金。
   其中养老保险、医疗保险和失业保险,这三种险是由企业和个人共同缴纳的保费,
   工伤保险和生育保险完全是由企业承担的,个人不需要缴纳。
   "四险"(男员工一般无生育保险)是法定的,而"一金"不是法定的。
--
应纳税所得额算法:
每月取得工资收入后,先减去个人承担的基本养老保险金、医疗保险金、失业保险金,以及按省级政府
   规定标准缴纳的住房公积金,再减去费用扣除额1600元/月,为应纳税所得额。
--
目前北京五险一金缴存比例:(其实大部分是三险一金,其中工伤保险和生育保险没有)
养老保险缴费比例:单位20%(其中17%划入统筹基金,3%划入个人帐户),个人8%(全部划入个人帐户);
医疗保险缴费比例:单位10%,个人2%+3元;
失业保险缴费比例:单位1.5%,个人0.5%;
工伤保险根据单位被划分的行业范围来确定它的工伤费率;
生育保险缴费比例:单位0.8%,个人不交钱。
公积金缴费比例:根据企业的实际情况,选择住房公积金缴费比例,一般是8%,
   但原则上最高缴费额不得超过北京市职工平均工资300%的10%。
eg:
SQL> set serverout on
SQL> exec calc_salary(2500);
SQL> exec calc_salary(7500,p_house_fund_2=>0.20);
SQL> exec calc_salary(10000,0,0,0,0,0,0,0,0,0,0,0,2000);
SQL> exec calc_salary(13000);
*/
AS
    v_pension_insurance_1        NUMBER (10, 2) := p_basic_wages * p_pension_insurance_1;
    --养老保险公司缴存数额
    v_pension_insurance_2        NUMBER (10, 2) := p_basic_wages * p_pension_insurance_2;
    --养老保险个人缴存数额
    v_medical_insurance_1        NUMBER (10, 2) := p_basic_wages * p_medical_insurance_1;
    --医疗保险公司缴存数额
    v_medical_insurance_2        NUMBER (10, 2)
                                      := p_basic_wages * p_medical_insurance_2 + p_medical_insurance_fee;
    --医疗保险个人缴存数额+3元
    v_unemployment_insurance_1   NUMBER (10, 2) := p_basic_wages * p_unemployment_insurance_1;
    --失业保险公司缴存数额
    v_unemployment_insurance_2   NUMBER (10, 2) := p_basic_wages * p_unemployment_insurance_2;
    --失业保险个人缴存数额
    v_workinjury_insurance_1     NUMBER (10, 2) := p_basic_wages * p_workinjury_insurance_1;
    --工伤保险公司缴存数额,个人不交
    v_maternity_insurance_1      NUMBER (10, 2) := p_basic_wages * p_maternity_insurance_1;
    --生育保险公司缴存数额,个人不交
    v_house_fund_1               NUMBER (10, 2) := p_basic_wages * p_house_fund_1;
    --住房公积金公司缴存数额
    v_house_fund_2               NUMBER (10, 2) := p_basic_wages * p_house_fund_2;
    --住房公积金个人缴存数额
    v_should_tax                 NUMBER (10, 2);
    --应纳税所得额,是基本工资减去起征额度和扣除各项个人缴存的保险基金后的额度
    v_tax_ratio                  NUMBER (10, 2);                                                  --税率
    v_susuankouchushu            NUMBER (10);                                               --速算扣除数
    --
    v_tax                        NUMBER (10, 2);                                                  --税额
    v_total_house_fund           NUMBER (10, 2);                                        --住房公积金总额
    v_real_income                NUMBER (10, 2);                                              --实际收入
    v_real_income_have_house     NUMBER (10, 2);                              --虚拟收入(包括实收和基金)
    v_personal_insurance         NUMBER (10, 2);                                  --个人缴存的保险和基金
    v_company_insurance_fund     NUMBER (10, 2);                                  --公司缴存的保险和基金
    v_company_cost               NUMBER (10, 2);                                            --公司总成本
BEGIN
    v_should_tax :=
          p_basic_wages
        - p_tax_start
        - v_pension_insurance_2
        - v_medical_insurance_2
        - v_unemployment_insurance_2
        - v_house_fund_2;
    v_total_house_fund := v_house_fund_1 + v_house_fund_2;
    v_personal_insurance := v_pension_insurance_2 + v_medical_insurance_2 + v_unemployment_insurance_2;
    v_company_insurance_fund :=
          v_pension_insurance_1
        + v_medical_insurance_1
        + v_unemployment_insurance_1
        + v_workinjury_insurance_1
        + v_maternity_insurance_1
        + v_house_fund_1;

    /*
    全月应纳税所得额 税率(%) 速算扣除数(元)
    1 不超过500元的 5 0
    2 超过500元至2000元的部分 10 25
    3 超过2000元至5000元的部分 15 125
    4 超过5000元至20000元的部分 20 375
    5 超过20000元至40000元的部分 25 1375
    6 超过40000元至60000元的部分 30 3375
    7 超过60000元至80000元的部分 35 6375
    8 超过80000元至100000元的部分 40 10375
    9 超过100000元的部分 45 15375
        */
    CASE
        WHEN v_should_tax < 500
        THEN
            v_tax_ratio := 0.05;
            v_susuankouchushu := 0;
        WHEN v_should_tax < 2000
        THEN
            v_tax_ratio := 0.10;
            v_susuankouchushu := 25;
        WHEN v_should_tax < 5000
        THEN
            v_tax_ratio := 0.15;
            v_susuankouchushu := 125;
        WHEN v_should_tax < 20000
        THEN
            v_tax_ratio := 0.20;
            v_susuankouchushu := 375;
        WHEN v_should_tax < 40000
        THEN
            v_tax_ratio := 0.25;
            v_susuankouchushu := 1375;
        WHEN v_should_tax < 60000
        THEN
            v_tax_ratio := 0.30;
            v_susuankouchushu := 3375;
        WHEN v_should_tax < 80000
        THEN
            v_tax_ratio := 0.35;
            v_susuankouchushu := 6375;
        WHEN v_should_tax < 100000
        THEN
            v_tax_ratio := 0.40;
            v_susuankouchushu := 10375;
        ELSE
            v_tax_ratio := 0.45;
            v_susuankouchushu := 15375;
    END CASE;

    v_tax := v_should_tax * v_tax_ratio - v_susuankouchushu;
    v_real_income := v_should_tax + p_tax_start - v_tax;
    v_real_income_have_house := v_real_income + v_total_house_fund;
    v_company_cost := p_basic_wages + v_company_insurance_fund;
    --print
    DBMS_OUTPUT.put_line (RPAD ('-', 50, '-'));
    DBMS_OUTPUT.put_line (   RPAD ('pension_insurance_1' || '(' || p_pension_insurance_1 * 100 || '%'
                                   || ')',
                                   30,
                                   ' '
                                  )
                          || ':'
                          || TO_CHAR (v_pension_insurance_1, '9,999,990.99')
                         );
    DBMS_OUTPUT.put_line (   RPAD ('pension_insurance_2' || '(' || p_pension_insurance_2 * 100 || '%'
                                   || ')',
                                   30,
                                   ' '
                                  )
                          || ':'
                          || TO_CHAR (v_pension_insurance_2, '9,999,990.99')
                         );
    DBMS_OUTPUT.put_line (   RPAD ('medical_insurance_1' || '(' || p_medical_insurance_1 * 100 || '%'
                                   || ')',
                                   30,
                                   ' '
                                  )
                          || ':'
                          || TO_CHAR (v_medical_insurance_1, '9,999,990.99')
                         );
    DBMS_OUTPUT.put_line (   RPAD ('medical_insurance_2' || '(' || p_medical_insurance_2 * 100 || '%'
                                   || ')',
                                   30,
                                   ' '
                                  )
                          || ':'
                          || TO_CHAR (v_medical_insurance_2, '9,999,990.99')
                         );
    DBMS_OUTPUT.put_line (   RPAD (   'unemployment_insurance_1'
                                   || '('
                                   || p_unemployment_insurance_1 * 100
                                   || '%'
                                   || ')',
                                   30,
                                   ' '
                                  )
                          || ':'
                          || TO_CHAR (v_unemployment_insurance_1, '9,999,990.99')
                         );
    DBMS_OUTPUT.put_line (   RPAD (   'unemployment_insurance_2'
                                   || '('
                                   || p_unemployment_insurance_2 * 100
                                   || '%'
                                   || ')',
                                   30,
                                   ' '
                                  )
                          || ':'
                          || TO_CHAR (v_unemployment_insurance_2, '9,999,990.99')
                         );
    DBMS_OUTPUT.put_line (   RPAD (   'workinjury_insurance_1'
                                   || '('
                                   || p_workinjury_insurance_1 * 100
                                   || '%'
                                   || ')',
                                   30,
                                   ' '
                                  )
                          || ':'
                          || TO_CHAR (v_workinjury_insurance_1, '9,999,990.99')
                         );
    DBMS_OUTPUT.put_line (   RPAD (   'maternity_insurance_1'
                                   || '('
                                   || p_maternity_insurance_1 * 100
                                   || '%'
                                   || ')',
                                   30,
                                   ' '
                                  )
                          || ':'
                          || TO_CHAR (v_maternity_insurance_1, '9,999,990.99')
                         );
    DBMS_OUTPUT.put_line (   RPAD ('house_fund_1' || '(' || p_house_fund_1 * 100 || '%' || ')', 30, ' ')
                          || ':'
                          || TO_CHAR (v_house_fund_1, '9,999,990.99')
                         );
    DBMS_OUTPUT.put_line (   RPAD ('house_fund_2' || '(' || p_house_fund_2 * 100 || '%' || ')', 30, ' ')
                          || ':'
                          || TO_CHAR (v_house_fund_2, '9,999,990.99')
                         );
    DBMS_OUTPUT.put_line (RPAD ('-', 50, '-'));
    DBMS_OUTPUT.put_line (RPAD ('should_tax', 30, ' ') || ':' || TO_CHAR (v_should_tax, '9,999,990.99'));
    DBMS_OUTPUT.put_line (   RPAD ('tax_ratio(%)', 30, ' ')
                          || ':'
                          || TO_CHAR (v_tax_ratio * 100, '9,999,990.99')
                         );
    DBMS_OUTPUT.put_line (   RPAD ('susuankouchushu', 30, ' ')
                          || ':'
                          || TO_CHAR (v_susuankouchushu, '9,999,990.99')
                         );
    DBMS_OUTPUT.put_line (RPAD ('tax', 30, ' ') || ':' || TO_CHAR (v_tax, '9,999,990.99'));
    DBMS_OUTPUT.put_line (RPAD ('-', 50, '-'));
    DBMS_OUTPUT.put_line (RPAD ('basic_wages', 30, ' ') || ':' || TO_CHAR (p_basic_wages, '9,999,990.99'));
    DBMS_OUTPUT.put_line (   RPAD ('company_insurance_fund', 30, ' ')
                          || ':'
                          || TO_CHAR (v_company_insurance_fund, '9,999,990.99')
                         );
    DBMS_OUTPUT.put_line (RPAD ('company_cost', 30, ' ') || ':'
                          || TO_CHAR (v_company_cost, '9,999,990.99')
                         );
    DBMS_OUTPUT.put_line (RPAD ('-', 50, '-'));
    DBMS_OUTPUT.put_line (   RPAD ('personal_insurance', 30, ' ')
                          || ':'
                          || TO_CHAR (v_personal_insurance, '9,999,990.99')
                         );
    DBMS_OUTPUT.put_line (   RPAD ('total_house_fund', 30, ' ')
                          || ':'
                          || TO_CHAR (v_total_house_fund, '9,999,990.99')
                         );
    DBMS_OUTPUT.put_line (RPAD ('real_income', 30, ' ') || ':' || TO_CHAR (v_real_income, '9,999,990.99'));
    DBMS_OUTPUT.put_line (   RPAD ('real_income(have house)', 30, ' ')
                          || ':'
                          || TO_CHAR (v_real_income_have_house, '9,999,990.99')
                         );
    DBMS_OUTPUT.put_line (RPAD ('-', 50, '-'));
END;


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部