|
@@ -151,4 +151,61 @@ public class CalculateTax {
|
|
|
return tax;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算税率
|
|
|
+ *
|
|
|
+ * @param
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static final BigDecimal calculateGoodsRate(GoodsEntity goodsEntity, BigDecimal actualPaymentAmount) {
|
|
|
+ // 该商品消费税
|
|
|
+ BigDecimal grandConsumerTax = BigDecimal.ZERO;
|
|
|
+ // 该商品增值税
|
|
|
+ BigDecimal grandValueAddTax = BigDecimal.ZERO;
|
|
|
+
|
|
|
+
|
|
|
+ String hsCode = goodsEntity.getHsCode();// 海关商品编码
|
|
|
+ String hsCodeName = goodsEntity.getHsCodeName();// 海关商品编码名称
|
|
|
+
|
|
|
+ // 消费税税率
|
|
|
+ final BigDecimal impConsumTaxRate = goodsEntity.getImpConsumTaxRate();
|
|
|
+ // 增值税税率
|
|
|
+ final BigDecimal valueAddedTaxRate = goodsEntity.getValueAddedTaxRate();
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 计算某类产品的消费税
|
|
|
+ final BigDecimal subConsumerTax = calculateConsumerTax(actualPaymentAmount, impConsumTaxRate, hsCodeName, goodsEntity, actualPaymentAmount);
|
|
|
+ // 计算某类产品的增值税
|
|
|
+ final BigDecimal subValueAddTax = calculateValueAddTax(actualPaymentAmount, valueAddedTaxRate, subConsumerTax);
|
|
|
+
|
|
|
+ // 计算总的消费税
|
|
|
+ grandConsumerTax = grandConsumerTax.add(subConsumerTax);
|
|
|
+ // 计算总的增值税
|
|
|
+ grandValueAddTax = grandValueAddTax.add(subValueAddTax);
|
|
|
+ } catch (final RuntimeException e) {
|
|
|
+ if (logger.isErrorEnabled()) logger.error("计算税费出错!请检查产品的分类数据,以及产品类别的税率数据!", e);
|
|
|
+ throw new IllegalStateException("计算税费出错!请检查产品的分类数据,以及产品类别的税率数据!", e);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果增值税为0,免税
|
|
|
+ if (BigDecimal.ZERO.compareTo(grandValueAddTax)==0){
|
|
|
+ return grandValueAddTax;
|
|
|
+ }
|
|
|
+ // 如果有消费税 23.06%=(0.13+0.15)/(1-0.15)*0.7
|
|
|
+ if (BigDecimal.ZERO.compareTo(grandConsumerTax)!=0){
|
|
|
+ return valueAddedTaxRate.add(impConsumTaxRate).
|
|
|
+ divide(new BigDecimal(100).subtract(impConsumTaxRate),10, BigDecimal.ROUND_HALF_UP)
|
|
|
+ .multiply(new BigDecimal("0.7")).setScale(4, BigDecimal.ROUND_HALF_UP);
|
|
|
+ }else {
|
|
|
+ // 如果没有消费税 9.1%=0.13*0.7
|
|
|
+ valueAddedTaxRate.multiply(new BigDecimal("0.7")).divide(new BigDecimal("100"),4,BigDecimal.ROUND_HALF_UP);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 按照公式,打7折
|
|
|
+ final BigDecimal tax = grandConsumerTax.add(grandValueAddTax).multiply(new BigDecimal("0.7")).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ return tax.divide(actualPaymentAmount, 4, BigDecimal.ROUND_HALF_UP);
|
|
|
+ }
|
|
|
+
|
|
|
}
|