年關(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、綜合稅率表
?
一般來說搜囱,我們員工的工資就按這個(gè)稅率表來計(jì)算丑瞧。
2、經(jīng)營所得
?
這個(gè)應(yīng)該是個(gè)體工商戶類的適用
3蜀肘、勞務(wù)報(bào)酬
?
這個(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;
}
既然開發(fā)完了,就想著春锋,弄個(gè)域名矫膨,掛個(gè)服務(wù)器給大家用一用,正好手頭也有一個(gè)空著的域名xcc.cn看疙,就搭建部署上線了豆拨。部署上,使用了jenkins+portainer能庆,將項(xiàng)目打成了docker鏡像,然后推到portainer部署啟動(dòng)脚线。
個(gè)稅計(jì)算器目前的公式上搁胆,可能有考慮不周的地方,大家可以指出來。
歡迎大家圍觀:個(gè)稅計(jì)算器 渠旁,各位下手輕點(diǎn)攀例,別弄?dú)埩恕?/p>