個(gè)人所得稅計(jì)算器-springboot開發(fā)

年關(guān)將至种呐,該到了發(fā)年終獎(jiǎng)的時(shí)候了宰翅。所以就到網(wǎng)上去找下,個(gè)稅計(jì)算器爽室,但是發(fā)現(xiàn)做的有點(diǎn)像病毒網(wǎng)站似的汁讼。所以計(jì)算結(jié)果也不太敢信,于是琢磨著,要不自己動(dòng)手寫一個(gè)個(gè)稅計(jì)算器吧嘿架。

說干就干卜录,先上國家稅務(wù)局了解了下個(gè)稅計(jì)算的公式,說簡單也簡單說復(fù)雜也復(fù)雜眶明,個(gè)稅計(jì)算艰毒,分幾個(gè)種類:

1、綜合稅率表

image
image.gif

?

一般來說搜囱,我們員工的工資就按這個(gè)稅率表來計(jì)算丑瞧。

2、經(jīng)營所得

image
image.gif

?

這個(gè)應(yīng)該是個(gè)體工商戶類的適用

3蜀肘、勞務(wù)報(bào)酬

image
image.gif

?

這個(gè)一般適用于绊汹,比如有個(gè)兼職,外包等扮宠,如果要納稅西乖,就按這個(gè)稅率表。

這個(gè)是2018年最新的個(gè)稅稅率坛增,現(xiàn)在統(tǒng)一按5000元起征获雕,也就是收入在5000元以下,是不用納稅的收捣。

項(xiàng)目采用springboot開發(fā)届案,非常容易上手。

計(jì)算規(guī)則的代碼:

   /**
     * 計(jì)算個(gè)人所得稅
     * www.xcc.cn 版權(quán)所有
     * @param minusAmount 扣除社保的金額
     * @param minusAmount2 當(dāng)月工資(扣除社保后)(算年終獎(jiǎng))
     * @param salaryType 收入類型
     * @param minimumAmount 個(gè)稅基數(shù)罢艾,5000
     * */
    public GeshuiDto calc(double originAmount, double minusAmount, double minusAmount2, String salaryType, int minimumAmount) {
        GeshuiDto dto = new GeshuiDto();
        dto.originAmount = originAmount;
        dto.minusAmount = minusAmount;
        dto.taxAmount = 0;
        dto.finalAmount = 0;

        if(originAmount == 0){
            return dto;
        }

        //工資楣颠、薪金所得
        if(Objects.equal("1", salaryType)){
            double balanceAmount = BigDecimal.valueOf(originAmount)
                    .subtract(BigDecimal.valueOf(minusAmount))
                    .subtract(BigDecimal.valueOf(minimumAmount)).doubleValue();
            dto.balanceAmount = balanceAmount;
            if(minimumAmount == 5000) {
                if(balanceAmount >0 && balanceAmount <=3000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.03)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
                }
                if(balanceAmount >3000 && balanceAmount <=12000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.1)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(210)).doubleValue();
                }
                if(balanceAmount >12000 && balanceAmount <=25000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(1410)).doubleValue();
                }
                if(balanceAmount >25000 && balanceAmount <=35000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.25)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(2660)).doubleValue();
                }
                if(balanceAmount >35000 && balanceAmount <=55000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.3)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(4410)).doubleValue();
                }
                if(balanceAmount >55000 && balanceAmount <=80000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.35)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(7160)).doubleValue();
                }
                if(balanceAmount >80000 ){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.45)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(15160)).doubleValue();
                }
            }else {
                if(balanceAmount >0 && balanceAmount <=1500){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.03)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
                }
                if(balanceAmount >1500 && balanceAmount <=4500){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.1)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(105)).doubleValue();
                }
                if(balanceAmount >4500 && balanceAmount <=9000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(555)).doubleValue();
                }
                if(balanceAmount >9000 && balanceAmount <=35000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.25)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(1005)).doubleValue();
                }
                if(balanceAmount >35000 && balanceAmount <=55000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.3)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(2755)).doubleValue();
                }
                if(balanceAmount >55000 && balanceAmount <=80000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.35)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(5505)).doubleValue();
                }
                if(balanceAmount >80000 ){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.45)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(13505)).doubleValue();
                }
            }

        }else if(Objects.equal("2", salaryType)){ //個(gè)體工商戶生產(chǎn)、經(jīng)營所得
            double balanceAmount = originAmount;
            dto.balanceAmount = balanceAmount;
            if(balanceAmount >0 && balanceAmount <= 15000){
                dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.05)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
            }
            if(balanceAmount > 15000 && balanceAmount <= 30000){
                dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.1)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(750)).doubleValue();
            }
            if(balanceAmount > 30000 && balanceAmount <= 60000){
                dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(3750)).doubleValue();
            }
            if(balanceAmount > 60000 && balanceAmount <= 100000){
                dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.3)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(9750)).doubleValue();
            }
            if(balanceAmount > 100000){
                dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.35)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(14750)).doubleValue();
            }
        }else if(Objects.equal("3", salaryType)){ //年終獎(jiǎng)所得
            double balanceAmount = 0;
            if(minusAmount2 - minimumAmount < 0){
                balanceAmount = BigDecimal.valueOf(originAmount).subtract(BigDecimal.valueOf(3500-minusAmount2)).doubleValue();
            }else{
                balanceAmount = originAmount;
            }
            dto.balanceAmount = balanceAmount;
            double avg_balanceAmount = balanceAmount/12;
            if(minimumAmount == 5000) {
                if(avg_balanceAmount >0 && avg_balanceAmount<=3000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.03)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
                }
                if(avg_balanceAmount >3000 && avg_balanceAmount<=12000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.1)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(210)).doubleValue();
                }
                if(avg_balanceAmount >12000 && avg_balanceAmount<=25000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(1410)).doubleValue();
                }
                if(avg_balanceAmount >25000 && avg_balanceAmount<=35000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.25)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(2660)).doubleValue();
                }
                if(avg_balanceAmount >35000 && avg_balanceAmount<=55000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.3)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(4410)).doubleValue();
                }
                if(avg_balanceAmount >55000 && avg_balanceAmount<=80000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.35)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(7160)).doubleValue();
                }
                if(avg_balanceAmount >80000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.45)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(15160)).doubleValue();
                }
            }else {
                if(avg_balanceAmount >0 && avg_balanceAmount<=1500){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.03)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
                }
                if(avg_balanceAmount >1500 && avg_balanceAmount<=4500){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.1)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(105)).doubleValue();
                }
                if(avg_balanceAmount >4500 && avg_balanceAmount<=9000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(555)).doubleValue();
                }
                if(avg_balanceAmount >9000 && avg_balanceAmount<=35000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.25)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(1005)).doubleValue();
                }
                if(avg_balanceAmount >35000 && avg_balanceAmount<=55000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.3)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(2775)).doubleValue();
                }
                if(avg_balanceAmount >55000 && avg_balanceAmount<=80000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.35)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(5505)).doubleValue();
                }
                if(avg_balanceAmount >80000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.45)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(13505)).doubleValue();
                }
            }

        }else if(Objects.equal("4", salaryType)){ //勞務(wù)報(bào)酬所得
            dto.balanceAmount = originAmount;
            if(originAmount>0 && originAmount <= 800){
                dto.taxAmount =0;
            }else if(originAmount > 800){
                double balanceAmount = 0;
                if(originAmount >800 && originAmount <= 4000){
                    balanceAmount = originAmount-800;
                }
                if(originAmount > 4000){
                    balanceAmount = originAmount*0.8;
                }
                if(balanceAmount >0 && balanceAmount <= 20000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
                }
                if(balanceAmount >20000 && balanceAmount <= 50000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.3)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(2000)).doubleValue();
                }
                if(balanceAmount >50000){
                    dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.4)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(7000)).doubleValue();
                }
            }
        }else if(Objects.equal("5", salaryType)){ //稿酬所得
            double balanceAmount = 0;
            if(originAmount >0 && originAmount <= 4000){
                balanceAmount = originAmount-800;
            }else if(originAmount > 4000){
                balanceAmount = originAmount*0.8;
            }
            dto.balanceAmount = balanceAmount;
            dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.14)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        }else if(Objects.equal("6", salaryType)){ //特許權(quán)使用費(fèi)所得
            double balanceAmount = 0;
            if(originAmount >0 && originAmount <= 4000){
                balanceAmount = originAmount-800;
            }else if(originAmount > 4000){
                balanceAmount = originAmount*0.8;
            }
            dto.balanceAmount = balanceAmount;
            dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        }else if(Objects.equal("7", salaryType)){ //財(cái)產(chǎn)租賃所得
            double balanceAmount = 0;
            if(originAmount >0 && originAmount <= 4000){
                balanceAmount = originAmount-800;
            }else if(originAmount > 4000){
                balanceAmount = originAmount*0.8;
            }
            dto.balanceAmount = balanceAmount;
            dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        }else if(Objects.equal("8", salaryType)){ //財(cái)產(chǎn)轉(zhuǎn)讓所得
            dto.balanceAmount = originAmount;
            dto.taxAmount = BigDecimal.valueOf(originAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        }else if(Objects.equal("9", salaryType)){ //利息咐蚯、股息童漩、紅利所得
            dto.balanceAmount = originAmount;
            dto.taxAmount = BigDecimal.valueOf(originAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        }else if(Objects.equal("10", salaryType)){ //偶然所得
            dto.balanceAmount = originAmount;
            dto.taxAmount = BigDecimal.valueOf(originAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        }else{
            return dto;
        }
        if(Objects.equal("1", salaryType)){
            dto.finalAmount = BigDecimal.valueOf(originAmount)
                    .subtract(BigDecimal.valueOf(minusAmount))
                    .subtract(BigDecimal.valueOf(dto.taxAmount))
                    .setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        }else{
            dto.finalAmount = BigDecimal.valueOf(originAmount)
                    .subtract(BigDecimal.valueOf(dto.taxAmount))
                    .setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        }
        return dto;
    }
image.gif

既然開發(fā)完了,就想著春锋,弄個(gè)域名矫膨,掛個(gè)服務(wù)器給大家用一用,正好手頭也有一個(gè)空著的域名xcc.cn看疙,就搭建部署上線了豆拨。部署上,使用了jenkins+portainer能庆,將項(xiàng)目打成了docker鏡像,然后推到portainer部署啟動(dòng)脚线。

個(gè)稅計(jì)算器目前的公式上搁胆,可能有考慮不周的地方,大家可以指出來。

歡迎大家圍觀:個(gè)稅計(jì)算器 渠旁,各位下手輕點(diǎn)攀例,別弄?dú)埩恕?/p>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市顾腊,隨后出現(xiàn)的幾起案子粤铭,更是在濱河造成了極大的恐慌,老刑警劉巖杂靶,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梆惯,死亡現(xiàn)場離奇詭異,居然都是意外死亡吗垮,警方通過查閱死者的電腦和手機(jī)垛吗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烁登,“玉大人怯屉,你說我怎么就攤上這事《祝” “怎么了锨络?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長狼牺。 經(jīng)常有香客問我足删,道長,這世上最難降的妖魔是什么锁右? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任失受,我火速辦了婚禮,結(jié)果婚禮上咏瑟,老公的妹妹穿的比我還像新娘拂到。我一直安慰自己,他們只是感情好码泞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布兄旬。 她就那樣靜靜地躺著,像睡著了一般余寥。 火紅的嫁衣襯著肌膚如雪领铐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天宋舷,我揣著相機(jī)與錄音绪撵,去河邊找鬼。 笑死祝蝠,一個(gè)胖子當(dāng)著我的面吹牛音诈,可吹牛的內(nèi)容都是我干的幻碱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼细溅,長吁一口氣:“原來是場噩夢啊……” “哼褥傍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起喇聊,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤恍风,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后誓篱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朋贬,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年燕鸽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兄世。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡啊研,死狀恐怖御滩,靈堂內(nèi)的尸體忽然破棺而出党远,到底是詐尸還是另有隱情削解,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布沟娱,位于F島的核電站氛驮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏济似。R本人自食惡果不足惜矫废,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砰蠢。 院中可真熱鬧蓖扑,春花似錦、人聲如沸台舱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽竞惋。三九已至柜去,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拆宛,已是汗流浹背嗓奢。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胰挑,地道東北人蔓罚。 一個(gè)月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓椿肩,卻偏偏與公主長得像瞻颂,于是被迫代替她去往敵國和親豺谈。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容