|
@@ -12,6 +12,7 @@ import com.actionsoft.sdk.local.api.Logger;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
|
|
|
|
@@ -150,10 +151,13 @@ public class contractCommissionService {
|
|
|
String CONTRACT_COST_ID = commission.getString("CONTRACT_COST_ID");
|
|
String CONTRACT_COST_ID = commission.getString("CONTRACT_COST_ID");
|
|
|
String CONTRACT_SERVICE_ID = commission.getString("CONTRACT_SERVICE_ID");
|
|
String CONTRACT_SERVICE_ID = commission.getString("CONTRACT_SERVICE_ID");
|
|
|
|
|
|
|
|
|
|
+ serviceLogger.info("CONTRACT_SERVICE_ID=" + CONTRACT_SERVICE_ID);
|
|
|
|
|
+ serviceLogger.info("CONTRACT_COST_ID=" + CONTRACT_COST_ID);
|
|
|
|
|
+
|
|
|
if (StringUtils.isBlank(CONTRACT_COST_ID) && StringUtils.isBlank(CONTRACT_SERVICE_ID))
|
|
if (StringUtils.isBlank(CONTRACT_COST_ID) && StringUtils.isBlank(CONTRACT_SERVICE_ID))
|
|
|
continue;
|
|
continue;
|
|
|
|
|
|
|
|
- List<RowMap> bills = DBSql.getMaps("SELECT a.* FROM VIEW_EU_DNCTT_INVOICE_DETAIL a WHERE a.CONTRACT_ID =? AND a.RECEIVE_AMOUNT > 0 AND a.INVOICE_AMOUNT = 0 AND NOT EXISTS( SELECT 1 FROM BO_EU_DNCTT_SALES_COMMISSION_PERIOD b WHERE b.SALES_COMMISSION_ID =? AND b.CONTRACT_ID = a.CONTRACT_ID AND b.PAY_AMOUNT > 0 AND b.INVOICE_DETAIL_ID = a.ID) AND EXISTS ( SELECT 1 FROM BO_EU_DNCRM_ACCOUNT_DEDUCTION c WHERE c.ID = a.ACCOUNT_DEDUCTION_ID AND ( ( c.TYPE_ID = 1325 AND FIND_IN_SET( c.OBJECT_ID, ? )) OR ( c.TYPE_ID = 1321 AND FIND_IN_SET( c.OBJECT_ID, ? ) ) ) )", new Object[]{commission.getString("CONTRACT_ID"), commission.getString("ID"), CONTRACT_SERVICE_ID, CONTRACT_COST_ID});
|
|
|
|
|
|
|
+ List<RowMap> bills = DBSql.getMaps("SELECT a.* FROM VIEW_EU_DNCTT_INVOICE_DETAIL a WHERE a.CONTRACT_ID =? AND a.RECEIVE_AMOUNT > 0 AND a.INVOICE_AMOUNT = 0 AND NOT EXISTS( SELECT 1 FROM BO_EU_DNCTT_SALES_COMMISSION_PERIOD b WHERE b.SALES_COMMISSION_ID =? AND b.CONTRACT_ID = a.CONTRACT_ID AND b.PAY_AMOUNT > 0 AND b.INVOICE_DETAIL_ID = a.ID) AND ( EXISTS ( SELECT 1 FROM BO_EU_DNCRM_ACCOUNT_DEDUCTION c WHERE c.ID = a.ACCOUNT_DEDUCTION_ID AND c.TYPE_ID = 1321 AND FIND_IN_SET( c.OBJECT_ID, ? ) ) OR EXISTS ( SELECT 1 FROM BO_EU_DNCRM_ACCOUNT_DEDUCTION c JOIN BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD d ON c.OBJECT_ID = d.ID WHERE c.ID = a.ACCOUNT_DEDUCTION_ID AND c.TYPE_ID = 1325 AND FIND_IN_SET( d.CONTRACT_SERVICE_ID, ? ) ))", new Object[]{commission.getString("CONTRACT_ID"), commission.getString("ID"), CONTRACT_COST_ID, CONTRACT_SERVICE_ID});
|
|
|
|
|
|
|
|
serviceLogger.info("获取付款的收费条目:" + bills.size());
|
|
serviceLogger.info("获取付款的收费条目:" + bills.size());
|
|
|
|
|
|
|
@@ -163,6 +167,17 @@ public class contractCommissionService {
|
|
|
period.set("ID", null);
|
|
period.set("ID", null);
|
|
|
String ACCOUNT_DEDUCTION_ID = bill.getString("ACCOUNT_DEDUCTION_ID");//计费条目ID
|
|
String ACCOUNT_DEDUCTION_ID = bill.getString("ACCOUNT_DEDUCTION_ID");//计费条目ID
|
|
|
|
|
|
|
|
|
|
+ //FEE_DATE 费用账期
|
|
|
|
|
+ String FEE_DATE = DBSql.getString("SELECT MAX(c.RECEIVE_DATE) FROM BO_EU_DNCTT_INVOICE_PLAN a JOIN BO_EU_DNCTT_INVOICE_PLAN_DETAIL b ON a.BINDID=b.BINDID JOIN BO_EU_DNCTT_INVOICE_PLAN_RECEIVE c ON a.BINDID=c.BINDID WHERE a.ISEND=1 AND b.ACCOUNT_DEDUCTION_ID=? ", new Object[]{ACCOUNT_DEDUCTION_ID});
|
|
|
|
|
+ if (StringUtils.isBlank(FEE_DATE))
|
|
|
|
|
+ continue;
|
|
|
|
|
+ serviceLogger.info("FEE_DATE=" + FEE_DATE);
|
|
|
|
|
+ FEE_DATE = FEE_DATE.substring(0, 10);
|
|
|
|
|
+ //获取 FEE_DATE 的下个月
|
|
|
|
|
+ FEE_DATE = contractService.getLocalDate(FEE_DATE).plusMonths(1).format(DateTimeFormatter.ofPattern("yyyy-MM"));
|
|
|
|
|
+ period.set("FEE_DATE", FEE_DATE);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
BigDecimal shou_tax = BigDecimal.ZERO;//税率-收
|
|
BigDecimal shou_tax = BigDecimal.ZERO;//税率-收
|
|
|
BigDecimal fu_tax = BigDecimal.ZERO;//税率-付
|
|
BigDecimal fu_tax = BigDecimal.ZERO;//税率-付
|
|
|
|
|
|
|
@@ -176,11 +191,17 @@ public class contractCommissionService {
|
|
|
SDK.getProcessAPI().deleteById(comssionperiodBindId, uc.getUID());
|
|
SDK.getProcessAPI().deleteById(comssionperiodBindId, uc.getUID());
|
|
|
}
|
|
}
|
|
|
//获取合同服务的周期
|
|
//获取合同服务的周期
|
|
|
- RowMap service = DBSql.getMap("SELECT b.PERIOD_BEGIN_DATE,b.PERIOD_END_DATE,b.PERIOD_COST,b.CONTRACT_SERVICE_ID from BO_EU_DNCRM_ACCOUNT_DEDUCTION a JOIN BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD b ON a.OBJECT_ID=b.ID AND a.TYPE_ID=1325 AND a.ID=? ", new Object[]{ACCOUNT_DEDUCTION_ID});
|
|
|
|
|
|
|
+ RowMap service = DBSql.getMap("SELECT b.PERIOD_BEGIN_DATE,b.PERIOD_END_DATE,b.PERIOD_COST,b.CONTRACT_SERVICE_ID,b.CONTRACT_ID,c.MINIMUM_PROFIT_MARGIN,c.ALLOW_COMMISSION_PAYMENT from BO_EU_DNCRM_ACCOUNT_DEDUCTION a JOIN BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD b ON a.OBJECT_ID=b.ID AND a.TYPE_ID=1325 JOIN BO_EU_DNCTT_CONTRACT c ON b.CONTRACT_ID=c.ID WHERE a.ID=? ", new Object[]{ACCOUNT_DEDUCTION_ID});
|
|
|
|
|
|
|
|
RowMap ded = DBSql.getMap("select * from BO_EU_DNCRM_ACCOUNT_DEDUCTION where ID=?", new Object[]{ACCOUNT_DEDUCTION_ID});
|
|
RowMap ded = DBSql.getMap("select * from BO_EU_DNCRM_ACCOUNT_DEDUCTION where ID=?", new Object[]{ACCOUNT_DEDUCTION_ID});
|
|
|
|
|
|
|
|
if (service != null) {
|
|
if (service != null) {
|
|
|
|
|
+
|
|
|
|
|
+ //利润不达标,不需要计算佣金
|
|
|
|
|
+ if (RULE_CATE.equals("4648") && service.getDouble("MINIMUM_PROFIT_MARGIN") > 0 && service.getDouble("ALLOW_COMMISSION_PAYMENT") == 0) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
period.set("CONTRACT_SERVICE_ID", service.get("CONTRACT_SERVICE_ID"));
|
|
period.set("CONTRACT_SERVICE_ID", service.get("CONTRACT_SERVICE_ID"));
|
|
|
period.set("PERIOD_BEGIN_DATE", service.get("PERIOD_BEGIN_DATE"));//周期开始时间
|
|
period.set("PERIOD_BEGIN_DATE", service.get("PERIOD_BEGIN_DATE"));//周期开始时间
|
|
|
period.set("PERIOD_END_DATE", service.get("PERIOD_END_DATE"));//周期结束
|
|
period.set("PERIOD_END_DATE", service.get("PERIOD_END_DATE"));//周期结束
|
|
@@ -197,17 +218,18 @@ public class contractCommissionService {
|
|
|
COST_INCLUDE_TAX = COST_INCLUDE_TAX.subtract(RECEIVED_DOLLARS_INCLUDE_TAX);
|
|
COST_INCLUDE_TAX = COST_INCLUDE_TAX.subtract(RECEIVED_DOLLARS_INCLUDE_TAX);
|
|
|
|
|
|
|
|
if (lastPeriod.get("COST_BF_INCLUDE_TAX") != null) {
|
|
if (lastPeriod.get("COST_BF_INCLUDE_TAX") != null) {
|
|
|
- COST_INCLUDE_TAX = COST_INCLUDE_TAX.subtract(TypeUtil.convert(lastPeriod.get("COST_BF_INCLUDE_TAX"), BigDecimal.class));
|
|
|
|
|
|
|
+ COST_INCLUDE_TAX = COST_INCLUDE_TAX.add(TypeUtil.convert(lastPeriod.get("COST_BF_INCLUDE_TAX"), BigDecimal.class));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ //本次转结成本
|
|
|
if (COST_INCLUDE_TAX.compareTo(BigDecimal.ZERO) > 0) {
|
|
if (COST_INCLUDE_TAX.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
period.set("COST_BF_INCLUDE_TAX", COST_INCLUDE_TAX);
|
|
period.set("COST_BF_INCLUDE_TAX", COST_INCLUDE_TAX);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- RowMap contractService = DBSql.getMap("SELECT IS_CTRTAX_APPLIED,TAX_CATEGORY_ID,VAT_TAX,PURCHASE_TAX_CATEGORY_ID FROM BO_EU_DNCTT_CONTRACT_SERVICE WHERE ID=?", new Object[]{service.get("CONTRACT_SERVICE_ID")});
|
|
|
|
|
|
|
+ RowMap contractService = DBSql.getMap("SELECT IS_CTRTAX_APPLIED,TAX_CATEGORY_ID,VAT_TAX,PURCHASE_TAX_CATEGORY_ID,NAME FROM BO_EU_DNCTT_CONTRACT_SERVICE WHERE ID=?", new Object[]{service.get("CONTRACT_SERVICE_ID")});
|
|
|
if (contractService != null) {
|
|
if (contractService != null) {
|
|
|
-
|
|
|
|
|
|
|
+ period.set("CONTRACT_SERVICE_NAME", contractService.get("NAME"));
|
|
|
//应收用的税
|
|
//应收用的税
|
|
|
RowMap taxcate = DBSql.getMap("SELECT NAME,EXT1 FROM BO_EU_DND_GENERAL WHERE OID = ? AND ORGID=?", new Object[]{contractService.getString("TAX_CATEGORY_ID"), uc.getCompanyModel().getId()});
|
|
RowMap taxcate = DBSql.getMap("SELECT NAME,EXT1 FROM BO_EU_DND_GENERAL WHERE OID = ? AND ORGID=?", new Object[]{contractService.getString("TAX_CATEGORY_ID"), uc.getCompanyModel().getId()});
|
|
|
shou_tax = TypeUtil.convert(taxcate.get("EXT1"), BigDecimal.class);
|
|
shou_tax = TypeUtil.convert(taxcate.get("EXT1"), BigDecimal.class);
|
|
@@ -235,21 +257,20 @@ public class contractCommissionService {
|
|
|
//period.set("COST_INCLUDE_TAX", bill.get(""));//本期成本(含税)
|
|
//period.set("COST_INCLUDE_TAX", bill.get(""));//本期成本(含税)
|
|
|
//period.set("COST_BF_INCLUDE_TAX", bill.get(""));//上期结转成本(含税)
|
|
//period.set("COST_BF_INCLUDE_TAX", bill.get(""));//上期结转成本(含税)
|
|
|
|
|
|
|
|
- if (shou_tax.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
|
|
- shou_tax = BigDecimal.ONE.add(shou_tax);
|
|
|
|
|
- period.set("RECEIVABLE_DOLLARS", TypeUtil.convert(period.get("RECEIVABLE_DOLLARS_INCLUDE_TAX"), BigDecimal.class).divide(shou_tax, 10, BigDecimal.ROUND_HALF_UP));//本期应收款(不含税)
|
|
|
|
|
|
|
+ // if (shou_tax.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
|
|
+ shou_tax = BigDecimal.ONE.add(shou_tax);
|
|
|
|
|
+ period.set("RECEIVABLE_DOLLARS", TypeUtil.convert(period.get("RECEIVABLE_DOLLARS_INCLUDE_TAX"), BigDecimal.class).divide(shou_tax, 10, BigDecimal.ROUND_HALF_UP));//本期应收款(不含税)
|
|
|
|
|
|
|
|
- period.set("RECEIVED_DOLLARS", TypeUtil.convert(period.get("RECEIVED_DOLLARS_INCLUDE_TAX"), BigDecimal.class).divide(shou_tax, 10, BigDecimal.ROUND_HALF_UP));//本期已收款(不含税)
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (fu_tax.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
|
|
- fu_tax = BigDecimal.ONE.add(fu_tax);
|
|
|
|
|
- if (period.containsKey("COST_INCLUDE_TAX") && period.get("COST_INCLUDE_TAX") != null)
|
|
|
|
|
- period.set("COST", TypeUtil.convert(period.get("COST_INCLUDE_TAX"), BigDecimal.class).divide(fu_tax, 10, BigDecimal.ROUND_HALF_UP));//本期成本(不含税)
|
|
|
|
|
- if (period.containsKey("COST_BF_INCLUDE_TAX") && period.get("COST_BF_INCLUDE_TAX") != null)
|
|
|
|
|
- period.set("COST_BF", TypeUtil.convert(period.get("COST_BF_INCLUDE_TAX"), BigDecimal.class).divide(fu_tax, 10, BigDecimal.ROUND_HALF_UP));//上期结转成本(不含税)
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ period.set("RECEIVED_DOLLARS", TypeUtil.convert(period.get("RECEIVED_DOLLARS_INCLUDE_TAX"), BigDecimal.class).divide(shou_tax, 10, BigDecimal.ROUND_HALF_UP));//本期已收款(不含税)
|
|
|
|
|
+ // }
|
|
|
|
|
|
|
|
|
|
+ // if (fu_tax.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
|
|
+ fu_tax = BigDecimal.ONE.add(fu_tax);
|
|
|
|
|
+ if (period.containsKey("COST_INCLUDE_TAX") && period.get("COST_INCLUDE_TAX") != null)
|
|
|
|
|
+ period.set("COST", TypeUtil.convert(period.get("COST_INCLUDE_TAX"), BigDecimal.class).divide(fu_tax, 10, BigDecimal.ROUND_HALF_UP));//本期成本(不含税)
|
|
|
|
|
+ if (period.containsKey("COST_BF_INCLUDE_TAX") && period.get("COST_BF_INCLUDE_TAX") != null)
|
|
|
|
|
+ period.set("COST_BF", TypeUtil.convert(period.get("COST_BF_INCLUDE_TAX"), BigDecimal.class).divide(fu_tax, 10, BigDecimal.ROUND_HALF_UP));//上期结转成本(不含税)
|
|
|
|
|
+ // }
|
|
|
|
|
|
|
|
switch (RULE_CATE) {
|
|
switch (RULE_CATE) {
|
|
|
case "4647": {
|
|
case "4647": {
|
|
@@ -275,10 +296,10 @@ public class contractCommissionService {
|
|
|
//销售净利百分比:针对已经全部收款的合同服务进行生成,创建一条合同佣金周期记录
|
|
//销售净利百分比:针对已经全部收款的合同服务进行生成,创建一条合同佣金周期记录
|
|
|
BigDecimal RATIO = TypeUtil.convert(commission.get("RATIO"), BigDecimal.class);
|
|
BigDecimal RATIO = TypeUtil.convert(commission.get("RATIO"), BigDecimal.class);
|
|
|
//使用含税价
|
|
//使用含税价
|
|
|
|
|
+
|
|
|
if (commission.getString("INCLUDE_TAX").equals("1")) {
|
|
if (commission.getString("INCLUDE_TAX").equals("1")) {
|
|
|
COMMISSION_DOLLARS = TypeUtil.convert(bill.get("RECEIVE_AMOUNT"), BigDecimal.class);
|
|
COMMISSION_DOLLARS = TypeUtil.convert(bill.get("RECEIVE_AMOUNT"), BigDecimal.class);
|
|
|
|
|
|
|
|
- //本期成本(含税)
|
|
|
|
|
if (period.containsKey("COST_INCLUDE_TAX") && period.get("COST_INCLUDE_TAX") != null)
|
|
if (period.containsKey("COST_INCLUDE_TAX") && period.get("COST_INCLUDE_TAX") != null)
|
|
|
COMMISSION_DOLLARS = COMMISSION_DOLLARS.subtract(TypeUtil.convert(period.get("COST_INCLUDE_TAX"), BigDecimal.class));
|
|
COMMISSION_DOLLARS = COMMISSION_DOLLARS.subtract(TypeUtil.convert(period.get("COST_INCLUDE_TAX"), BigDecimal.class));
|
|
|
|
|
|
|
@@ -286,13 +307,6 @@ public class contractCommissionService {
|
|
|
if (period.containsKey("COST_BF_INCLUDE_TAX") && period.get("COST_BF_INCLUDE_TAX") != null)
|
|
if (period.containsKey("COST_BF_INCLUDE_TAX") && period.get("COST_BF_INCLUDE_TAX") != null)
|
|
|
COMMISSION_DOLLARS = COMMISSION_DOLLARS.subtract(TypeUtil.convert(period.get("COST_BF_INCLUDE_TAX"), BigDecimal.class));
|
|
COMMISSION_DOLLARS = COMMISSION_DOLLARS.subtract(TypeUtil.convert(period.get("COST_BF_INCLUDE_TAX"), BigDecimal.class));
|
|
|
|
|
|
|
|
- period.set("NET_PROFIT", COMMISSION_DOLLARS);//利润
|
|
|
|
|
-
|
|
|
|
|
- COMMISSION_DOLLARS = COMMISSION_DOLLARS.multiply(RATIO).divide(BigDecimal.valueOf(100), 10, BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
-
|
|
|
|
|
- COMMISSION_DOLLARS = COMMISSION_DOLLARS.divide(BigDecimal.ONE.add(tax), 10, BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
- period.set("COMMISSION_DOLLARS", COMMISSION_DOLLARS);//佣金金额
|
|
|
|
|
-
|
|
|
|
|
} else {
|
|
} else {
|
|
|
//使用不含税价
|
|
//使用不含税价
|
|
|
COMMISSION_DOLLARS = TypeUtil.convert(period.get("RECEIVED_DOLLARS"), BigDecimal.class);//不含税已收
|
|
COMMISSION_DOLLARS = TypeUtil.convert(period.get("RECEIVED_DOLLARS"), BigDecimal.class);//不含税已收
|
|
@@ -305,13 +319,16 @@ public class contractCommissionService {
|
|
|
if (period.containsKey("COST_BF") && period.get("COST_BF") != null)
|
|
if (period.containsKey("COST_BF") && period.get("COST_BF") != null)
|
|
|
COMMISSION_DOLLARS = COMMISSION_DOLLARS.subtract(TypeUtil.convert(period.get("COST_BF"), BigDecimal.class));
|
|
COMMISSION_DOLLARS = COMMISSION_DOLLARS.subtract(TypeUtil.convert(period.get("COST_BF"), BigDecimal.class));
|
|
|
|
|
|
|
|
- period.set("NET_PROFIT", COMMISSION_DOLLARS);//利润
|
|
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
+ if (COMMISSION_DOLLARS.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
|
|
+ period.set("NET_PROFIT", COMMISSION_DOLLARS);//利润
|
|
|
COMMISSION_DOLLARS = COMMISSION_DOLLARS.multiply(RATIO).divide(BigDecimal.valueOf(100), 10, BigDecimal.ROUND_HALF_UP);
|
|
COMMISSION_DOLLARS = COMMISSION_DOLLARS.multiply(RATIO).divide(BigDecimal.valueOf(100), 10, BigDecimal.ROUND_HALF_UP);
|
|
|
-
|
|
|
|
|
COMMISSION_DOLLARS = COMMISSION_DOLLARS.divide(BigDecimal.ONE.add(tax), 10, BigDecimal.ROUND_HALF_UP);
|
|
COMMISSION_DOLLARS = COMMISSION_DOLLARS.divide(BigDecimal.ONE.add(tax), 10, BigDecimal.ROUND_HALF_UP);
|
|
|
period.set("COMMISSION_DOLLARS", COMMISSION_DOLLARS);//佣金金额
|
|
period.set("COMMISSION_DOLLARS", COMMISSION_DOLLARS);//佣金金额
|
|
|
-
|
|
|
|
|
|
|
+ } else {
|
|
|
|
|
+ period.set("NET_PROFIT", BigDecimal.ZERO);
|
|
|
|
|
+ period.set("COMMISSION_DOLLARS", BigDecimal.ZERO);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|