|
|
@@ -0,0 +1,408 @@
|
|
|
+package com.awspaas.user.apps.donenow_ctt.service;
|
|
|
+
|
|
|
+import com.actionsoft.bpms.bo.engine.BO;
|
|
|
+import com.actionsoft.bpms.bpmn.engine.model.run.delegate.ProcessInstance;
|
|
|
+import com.actionsoft.bpms.commons.database.RowMap;
|
|
|
+import com.actionsoft.bpms.server.UserContext;
|
|
|
+import com.actionsoft.bpms.util.DBSql;
|
|
|
+import com.actionsoft.sdk.local.SDK;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 发票服务
|
|
|
+ */
|
|
|
+public class invoiceService {
|
|
|
+ // 单例模式
|
|
|
+ private static volatile invoiceService instance;
|
|
|
+
|
|
|
+ private invoiceService() {
|
|
|
+ }
|
|
|
+
|
|
|
+ public static invoiceService getInstance() {
|
|
|
+ if (instance == null) {
|
|
|
+ synchronized (invoiceService.class) {
|
|
|
+ if (instance == null) {
|
|
|
+ instance = new invoiceService();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return instance;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ *处理发票
|
|
|
+ * @param uc
|
|
|
+ * @param accDeduIds
|
|
|
+ */
|
|
|
+ public List<String> ProcessInvoice(UserContext uc, String accDeduIds, InvoiceDealDto param, boolean isDeal) {
|
|
|
+ if (StringUtils.isBlank(accDeduIds))
|
|
|
+ return null;
|
|
|
+
|
|
|
+ String sqlWhere = " (";
|
|
|
+ String[] arr = accDeduIds.split(",");
|
|
|
+ for (int i = 0; i < arr.length; i++) {
|
|
|
+ sqlWhere += "?,";
|
|
|
+ }
|
|
|
+ sqlWhere = sqlWhere.substring(0, sqlWhere.length() - 1) + ")";
|
|
|
+
|
|
|
+ List<RowMap> thisAccDtoList = DBSql.getMaps("SELECT * FROM VIEW_EU_DNV_POSTED_ALL WHERE ID IN " + sqlWhere, Arrays.stream(arr).toArray());
|
|
|
+ if (thisAccDtoList.isEmpty())
|
|
|
+ return null;
|
|
|
+
|
|
|
+ //把里面的key转成大写
|
|
|
+ for (RowMap rowMap : thisAccDtoList) {
|
|
|
+ rowMap.forEach((key, value) -> rowMap.put(key.toUpperCase(), value));
|
|
|
+ //rowMap.forEach((key, value) -> rowMap.put(key.toLowerCase(), value));
|
|
|
+ }
|
|
|
+
|
|
|
+ List<RowMap> thisAccList = DBSql.getMaps("SELECT * FROM BO_EU_DNCRM_ACCOUNT_DEDUCTION WHERE ID IN " + sqlWhere, Arrays.stream(arr).toArray());
|
|
|
+
|
|
|
+ Map<String, List<RowMap>> dicList = thisAccList.stream().filter(rowMap -> rowMap.get("BILL_ACCOUNT_ID") != null).collect(
|
|
|
+ Collectors.groupingBy(rowMap -> rowMap.get("BILL_ACCOUNT_ID").toString())
|
|
|
+ );
|
|
|
+ if (dicList.isEmpty())
|
|
|
+ return null;
|
|
|
+
|
|
|
+ List<RowMap> itemTypeList = DBSql.getMaps("SELECT OID,NAME FROM BO_EU_DND_GENERAL WHERE GENERAL_TABLE_ID='121'");
|
|
|
+
|
|
|
+ List<String> invoiceIds = new ArrayList<>();
|
|
|
+ for (String key : dicList.keySet()) {
|
|
|
+
|
|
|
+ RowMap account = DBSql.getMap("SELECT * FROM BO_EU_DNCRM_ACCOUNT WHERE ID = ?", key);
|
|
|
+ // 客户的客户顾问在发票中是必填项,没有客户顾问暂时不创建发票
|
|
|
+ if (StringUtils.isBlank(account.getString("RESOURCE_ID"))) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<RowMap> noPurOrderList = dicList.get(key).stream().filter(rowMap -> StringUtils.isBlank(rowMap.getString("PURCHASE_ORDER_NO"))).collect(Collectors.toList());
|
|
|
+ if (noPurOrderList.size() > 0) {
|
|
|
+ //没有销售订单的条目,计费到这个客户的和这个客户的条目
|
|
|
+ List<RowMap> thisNoPurOrdList = thisAccDtoList.stream().filter(rowMap -> StringUtils.isBlank(rowMap.getString("PURCHASE_ORDER_NO")) && rowMap.get("ACCOUNT_ID").equals(key)).collect(Collectors.toList());
|
|
|
+ List<RowMap> billToThisNoPurOrdList = thisAccDtoList.stream().filter(rowMap -> StringUtils.isBlank(rowMap.getString("PURCHASE_ORDER_NO")) && !rowMap.get("ACCOUNT_ID").equals(key) && rowMap.get("BILL_ACCOUNT_ID").equals(key)).collect(Collectors.toList());
|
|
|
+
|
|
|
+ BO invoice = new BO();
|
|
|
+ //汇总
|
|
|
+ Double totalMoney = thisNoPurOrdList.stream().mapToDouble(rowMap -> rowMap.getDouble("DOLLARS")).sum() + billToThisNoPurOrdList.stream().mapToDouble(rowMap -> rowMap.getDouble("DOLLARS")).sum();
|
|
|
+ Double totalTax = thisNoPurOrdList.stream().mapToDouble(rowMap -> rowMap.getDouble("TAX_DOLLARS")).sum() + billToThisNoPurOrdList.stream().mapToDouble(rowMap -> rowMap.getDouble("TAX_DOLLARS")).sum();
|
|
|
+ invoice.set("TOTAL_MONEY", totalMoney);//总额
|
|
|
+ invoice.set("TOTAL_TAX", totalTax);//税
|
|
|
+ Double totalPrice = totalMoney - totalTax;//总价
|
|
|
+ invoice.set("TOTAL_PRICE", totalPrice);//总价(不含税)
|
|
|
+ Double noBillHours = thisNoPurOrdList.stream().filter(rowMap -> StringUtils.isBlank(rowMap.getString("BILLABLE"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum() + billToThisNoPurOrdList.stream().filter(rowMap -> StringUtils.isBlank(rowMap.getString("BILLABLE"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum();
|
|
|
+
|
|
|
+ invoice.set("NOBILL_HOURS", noBillHours);//不计费工时
|
|
|
+ Double billHours = thisNoPurOrdList.stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("BILLABLE"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum() + billToThisNoPurOrdList.stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("BILLABLE"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum();
|
|
|
+ invoice.set("BILL_HOURS", billHours);//计费工时
|
|
|
+ Double prepaidHours = thisNoPurOrdList.stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("CONTRACT_BLOCK_ID"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum() + billToThisNoPurOrdList.stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("CONTRACT_BLOCK_ID"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum();
|
|
|
+ invoice.set("PREPAID_HOURS", prepaidHours);//预付工时
|
|
|
+
|
|
|
+
|
|
|
+ StringBuilder thisIds = new StringBuilder();
|
|
|
+ if (thisNoPurOrdList.size() > 0) {
|
|
|
+ thisNoPurOrdList.forEach(rowMap -> thisIds.append(rowMap.get("ID").toString() + ","));
|
|
|
+ }
|
|
|
+ if (billToThisNoPurOrdList.size() > 0) {
|
|
|
+ billToThisNoPurOrdList.forEach(rowMap -> thisIds.append(rowMap.get("ID").toString() + ","));
|
|
|
+ }
|
|
|
+ String stringIds = thisIds.toString();
|
|
|
+ if (StringUtils.isNotBlank(stringIds)) {
|
|
|
+ stringIds = stringIds.substring(0, stringIds.length() - 1);
|
|
|
+ }
|
|
|
+ String invoiceNo = SDK.getRuleAPI().executeAtScript("@year()-@sequence(@concat(@companyId(),@year(),INVOICE),6)");//发票编号
|
|
|
+ ProcessInstance processInstance = SDK.getProcessAPI().createProcessInstance("obj_a7d46a9dd4df40b899ddcf02113fe0d2", uc.getUID(), "新增账单" + invoiceNo);
|
|
|
+
|
|
|
+
|
|
|
+ invoice.set("INVOICE_NO", invoiceNo);//发票编号
|
|
|
+ invoice.set("INVOICE_DATE", param.getInvoiceDate());
|
|
|
+ invoice.set("TOTAL", dicList.get(key).stream().mapToDouble(rowMap -> rowMap.getDouble("EXTENDED_PRICE")).sum());//总价
|
|
|
+ invoice.set("TAX_VALUE", dicList.get(key).stream().mapToDouble(rowMap -> rowMap.getDouble("TAX_DOLLARS")).sum());//税
|
|
|
+ invoice.set("DATE_RANGE_FROM", param.getDateRangeFrom());//开始时间
|
|
|
+ invoice.set("DATE_RANGE_TO", param.getDateRangeTo());//结束时间
|
|
|
+ invoice.set("PAYMENT_TERM_ID", param.getPaymentTermId());//付款条款
|
|
|
+ invoice.set("PURCHASE_ORDER_NO", "");
|
|
|
+ invoice.set("NOTES", param.getNotes());
|
|
|
+ invoice.set("TAX_REGION_NAME", account.getString("TAX_REGION_ID") == null ? "" : DBSql.getString("SELECT NAME FROM BO_EU_DND_GENERAL WHERE OID = ?", new Object[]{account.getString("TAX_REGION_ID")}));
|
|
|
+ invoice.setBindId(processInstance.getId());
|
|
|
+
|
|
|
+ dn.recordFormChanges.record(uc, invoice, "保存发票");
|
|
|
+
|
|
|
+ SDK.getBOAPI().create("BO_EU_DNCTT_INVOICE", invoice, processInstance, uc);
|
|
|
+
|
|
|
+ int invoice_line = 1;
|
|
|
+ for (RowMap param_item : thisNoPurOrdList) {
|
|
|
+
|
|
|
+ RowMap accDedItem = dicList.get(key).stream().filter(rowMap -> rowMap.get("ID").equals(param_item.get("ID"))).findFirst().get();
|
|
|
+
|
|
|
+ String billable_hours = param_item.getString("BILLABLE_HOURS");
|
|
|
+
|
|
|
+ if (param_item.getString("CONTRACT_TYPE_ID").equals("1199") || param_item.getString("CONTRACT_TYPE_ID").equals("1201")) {
|
|
|
+ billable_hours = "合同已包";
|
|
|
+ } else if (param_item.getString("CONTRACT_TYPE_ID").equals("1202") || param_item.getString("CONTRACT_TYPE_ID").equals("1203")) {
|
|
|
+ if (StringUtils.isNotBlank(param_item.getString("BILLABLE")))
|
|
|
+ billable_hours = "预支付";
|
|
|
+ }
|
|
|
+
|
|
|
+ BO invoiceItem = new BO();
|
|
|
+ invoiceItem.setBindId(invoice.getBindId());
|
|
|
+ invoiceItem.set("INVOICE_ID", invoice.getId());
|
|
|
+ invoiceItem.set("ITEM_DATE", param_item.get("ITEM_DATE"));
|
|
|
+ invoiceItem.set("ITEM_DESC", param_item.get("ITEM_DESC"));
|
|
|
+ invoiceItem.set("ITEM_TYPE", param_item.get("ITEM_TYPE"));
|
|
|
+ invoiceItem.set("RESOURCE_NAME", param_item.get("RESOURCE_NAME"));
|
|
|
+ invoiceItem.set("billable_hours", billable_hours);
|
|
|
+ invoiceItem.set("QUANTITY", param_item.get("QUANTITY"));
|
|
|
+ invoiceItem.set("RATE", param_item.get("RATE"));
|
|
|
+ invoiceItem.set("EFFECTIVE_TAX_RATE", accDedItem.getDouble("EFFECTIVE_TAX_RATE") * 100);
|
|
|
+ invoiceItem.set("TAX_CATEGORY_NAME", accDedItem.get("TAX_CATEGORY_NAME"));
|
|
|
+ String itemType = itemTypeList.stream().filter(rowMap -> rowMap.get("OID").equals(param_item.get("ITEM_TYPE"))).findFirst().get().getString("NAME");
|
|
|
+ invoiceItem.set("ITEM_TYPE", itemType);
|
|
|
+ invoiceItem.set("DOLLARS", param_item.get("DOLLARS"));
|
|
|
+ invoiceItem.set("HOURLY_RATE", param_item.get("HOURLY_RATE"));
|
|
|
+ invoiceItem.set("ROLE_NAME", param_item.get("ROLE_NAME"));
|
|
|
+ invoiceItem.set("WORK_TYPE", param_item.get("WORK_TYPE"));
|
|
|
+ invoiceItem.set("TAX_INCLUSIVE", param_item.get("DOLLARS"));
|
|
|
+ invoiceItem.set("ACCOUNT_DEDUCTION_ID", param_item.get("ID"));
|
|
|
+ SDK.getBOAPI().createDataBO("BO_EU_DNCTT_INVOICE_DETAIL", invoiceItem, uc);
|
|
|
+
|
|
|
+ //更新账户抵扣条目
|
|
|
+ if (isDeal)// 处理,区分预览和实际生成
|
|
|
+ {
|
|
|
+ BO thisacc_ded = SDK.getBOAPI().get("BO_EU_DNCRM_ACCOUNT_DEDUCTION", accDedItem.getString("ID"));
|
|
|
+ thisacc_ded.set("INVOICE_ID", invoice.getId());
|
|
|
+ thisacc_ded.set("INVOICE_LINE_ITEM_NO", invoice_line);
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNCRM_ACCOUNT_DEDUCTION", thisacc_ded);
|
|
|
+ }
|
|
|
+ invoice_line++;
|
|
|
+ }
|
|
|
+ //付费到这个客户的条目
|
|
|
+ if (billToThisNoPurOrdList.size() > 0) {
|
|
|
+ Map<String, List<RowMap>> dicBillToThis = billToThisNoPurOrdList.stream().collect(Collectors.groupingBy(rowMap -> rowMap.getString("account_id")));
|
|
|
+ for (String bkey : dicBillToThis.keySet()) {
|
|
|
+
|
|
|
+ for (RowMap param_item : dicBillToThis.get(bkey)) {
|
|
|
+ RowMap accDedItem = dicList.get(key).stream().filter(rowMap -> rowMap.get("ID").equals(param_item.get("ID"))).findFirst().get();
|
|
|
+
|
|
|
+ String billable_hours = param_item.getString("BILLABLE_HOURS");
|
|
|
+
|
|
|
+ if (param_item.getString("CONTRACT_TYPE_ID").equals("1199") || param_item.getString("CONTRACT_TYPE_ID").equals("1201")) {
|
|
|
+ billable_hours = "合同已包";
|
|
|
+ } else if (param_item.getString("CONTRACT_TYPE_ID").equals("1202") || param_item.getString("CONTRACT_TYPE_ID").equals("1203")) {
|
|
|
+ if (StringUtils.isNotBlank(param_item.getString("BILLABLE")))
|
|
|
+ billable_hours = "预支付";
|
|
|
+ }
|
|
|
+
|
|
|
+ BO invoiceItem = new BO();
|
|
|
+ invoiceItem.setBindId(invoice.getBindId());
|
|
|
+ invoiceItem.set("INVOICE_ID", invoice.getId());
|
|
|
+ invoiceItem.set("ITEM_DATE", param_item.get("ITEM_DATE"));
|
|
|
+ invoiceItem.set("ITEM_DESC", param_item.get("ITEM_DESC"));
|
|
|
+ invoiceItem.set("ITEM_TYPE", param_item.get("ITEM_TYPE"));
|
|
|
+ invoiceItem.set("RESOURCE_NAME", param_item.get("RESOURCE_NAME"));
|
|
|
+ invoiceItem.set("billable_hours", billable_hours);
|
|
|
+ invoiceItem.set("QUANTITY", param_item.get("QUANTITY"));
|
|
|
+ invoiceItem.set("RATE", param_item.get("RATE"));
|
|
|
+ invoiceItem.set("EFFECTIVE_TAX_RATE", accDedItem.getDouble("EFFECTIVE_TAX_RATE") * 100);
|
|
|
+ invoiceItem.set("TAX_CATEGORY_NAME", accDedItem.get("TAX_CATEGORY_NAME"));
|
|
|
+ String itemType = itemTypeList.stream().filter(rowMap -> rowMap.get("OID").equals(param_item.get("ITEM_TYPE"))).findFirst().get().getString("NAME");
|
|
|
+ invoiceItem.set("ITEM_TYPE", itemType);
|
|
|
+ invoiceItem.set("DOLLARS", param_item.get("DOLLARS"));
|
|
|
+ invoiceItem.set("HOURLY_RATE", param_item.get("HOURLY_RATE"));
|
|
|
+ invoiceItem.set("ROLE_NAME", param_item.get("ROLE_NAME"));
|
|
|
+ invoiceItem.set("WORK_TYPE", param_item.get("WORK_TYPE"));
|
|
|
+ invoiceItem.set("TAX_INCLUSIVE", param_item.get("DOLLARS"));
|
|
|
+ invoiceItem.set("ACCOUNT_DEDUCTION_ID", param_item.get("ID"));
|
|
|
+ SDK.getBOAPI().createDataBO("BO_EU_DNCTT_INVOICE_DETAIL", invoiceItem, uc);
|
|
|
+
|
|
|
+
|
|
|
+ //更新账户抵扣条目
|
|
|
+ if (isDeal)// 处理,区分预览和实际生成
|
|
|
+ {
|
|
|
+ BO thisacc_ded = SDK.getBOAPI().get("BO_EU_DNCRM_ACCOUNT_DEDUCTION", accDedItem.getString("ID"));
|
|
|
+ thisacc_ded.set("INVOICE_ID", invoice.getId());
|
|
|
+ thisacc_ded.set("INVOICE_LINE_ITEM_NO", invoice_line);
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNCRM_ACCOUNT_DEDUCTION", thisacc_ded);
|
|
|
+ }
|
|
|
+ invoice_line++;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //有采购订单的条目
|
|
|
+ List<RowMap> purchOrderList = dicList.get(key).stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("purchase_order_no"))).collect(Collectors.toList());
|
|
|
+
|
|
|
+ if (purchOrderList.size() > 0) {
|
|
|
+ Map<String, List<RowMap>> poDic = purchOrderList.stream().collect(Collectors.groupingBy(rowMap -> rowMap.getString("purchase_order_no")));
|
|
|
+ for (String poKey : poDic.keySet()) {
|
|
|
+
|
|
|
+ //采购订单的条目
|
|
|
+ List<RowMap> thisPurOrdList = poDic.get(poKey).stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("purchase_order_no")) && rowMap.getString("account_id").equals(key) && rowMap.getString("bill_account_id").equals(key)).collect(Collectors.toList());
|
|
|
+
|
|
|
+ //采购订单的条目
|
|
|
+ List<RowMap> billToThisPurOrdList = poDic.get(poKey).stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("purchase_order_no")) && !rowMap.getString("account_id").equals(key) && rowMap.getString("bill_account_id").equals(key)).collect(Collectors.toList());
|
|
|
+
|
|
|
+
|
|
|
+ BO invoice = new BO();
|
|
|
+ //汇总
|
|
|
+ Double totalMoney = thisPurOrdList.stream().mapToDouble(rowMap -> rowMap.getDouble("DOLLARS")).sum() + billToThisPurOrdList.stream().mapToDouble(rowMap -> rowMap.getDouble("DOLLARS")).sum();
|
|
|
+ Double totalTax = thisPurOrdList.stream().mapToDouble(rowMap -> rowMap.getDouble("TAX_DOLLARS")).sum() + billToThisPurOrdList.stream().mapToDouble(rowMap -> rowMap.getDouble("TAX_DOLLARS")).sum();
|
|
|
+ invoice.set("TOTAL_MONEY", totalMoney);//总额
|
|
|
+ invoice.set("TOTAL_TAX", totalTax);//税
|
|
|
+ Double totalPrice = totalMoney - totalTax;//总价
|
|
|
+ invoice.set("TOTAL_PRICE", totalPrice);//总价(不含税)
|
|
|
+ Double noBillHours = thisPurOrdList.stream().filter(rowMap -> StringUtils.isBlank(rowMap.getString("BILLABLE"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum() + billToThisPurOrdList.stream().filter(rowMap -> StringUtils.isBlank(rowMap.getString("BILLABLE"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum();
|
|
|
+
|
|
|
+ invoice.set("NOBILL_HOURS", noBillHours);//不计费工时
|
|
|
+ Double billHours = thisPurOrdList.stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("BILLABLE"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum() + billToThisPurOrdList.stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("BILLABLE"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum();
|
|
|
+ invoice.set("BILL_HOURS", billHours);//计费工时
|
|
|
+ Double prepaidHours = thisPurOrdList.stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("CONTRACT_BLOCK_ID"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum() + billToThisPurOrdList.stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("CONTRACT_BLOCK_ID"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum();
|
|
|
+ invoice.set("PREPAID_HOURS", prepaidHours);//预付工时
|
|
|
+
|
|
|
+
|
|
|
+ String invoiceNo = SDK.getRuleAPI().executeAtScript("@year()-@sequence(@concat(@companyId(),@year(),INVOICE),6)");//发票编号
|
|
|
+ ProcessInstance processInstance = SDK.getProcessAPI().createProcessInstance("obj_a7d46a9dd4df40b899ddcf02113fe0d2", uc.getUID(), "新增账单" + invoiceNo);
|
|
|
+
|
|
|
+
|
|
|
+ invoice.set("INVOICE_NO", invoiceNo);//发票编号
|
|
|
+ invoice.set("INVOICE_DATE", param.getInvoiceDate());
|
|
|
+ invoice.set("TOTAL", poDic.get(key).stream().mapToDouble(rowMap -> rowMap.getDouble("EXTENDED_PRICE")).sum());//总价
|
|
|
+ invoice.set("TAX_VALUE", poDic.get(key).stream().mapToDouble(rowMap -> rowMap.getDouble("TAX_DOLLARS")).sum());//税
|
|
|
+ invoice.set("DATE_RANGE_FROM", param.getDateRangeFrom());//开始时间
|
|
|
+ invoice.set("DATE_RANGE_TO", param.getDateRangeTo());//结束时间
|
|
|
+ invoice.set("PAYMENT_TERM_ID", param.getPaymentTermId());//付款条款
|
|
|
+ invoice.set("PURCHASE_ORDER_NO", "");
|
|
|
+ invoice.set("NOTES", param.getNotes());
|
|
|
+ invoice.set("TAX_REGION_NAME", account.getString("TAX_REGION_ID") == null ? "" : DBSql.getString("SELECT NAME FROM BO_EU_DND_GENERAL WHERE OID = ?", new Object[]{account.getString("TAX_REGION_ID")}));
|
|
|
+ invoice.setBindId(processInstance.getId());
|
|
|
+
|
|
|
+ dn.recordFormChanges.record(uc, invoice, "保存发票");
|
|
|
+
|
|
|
+ SDK.getBOAPI().create("BO_EU_DNCTT_INVOICE", invoice, processInstance, uc);
|
|
|
+
|
|
|
+
|
|
|
+ int invoice_line = 1;
|
|
|
+ for (RowMap param_item : thisPurOrdList) {
|
|
|
+
|
|
|
+ RowMap accDedItem = dicList.get(key).stream().filter(rowMap -> rowMap.get("ID").equals(param_item.get("ID"))).findFirst().get();
|
|
|
+
|
|
|
+ String billable_hours = param_item.getString("BILLABLE_HOURS");
|
|
|
+
|
|
|
+ if (param_item.getString("CONTRACT_TYPE_ID").equals("1199") || param_item.getString("CONTRACT_TYPE_ID").equals("1201")) {
|
|
|
+ billable_hours = "合同已包";
|
|
|
+ } else if (param_item.getString("CONTRACT_TYPE_ID").equals("1202") || param_item.getString("CONTRACT_TYPE_ID").equals("1203")) {
|
|
|
+ if (StringUtils.isNotBlank(param_item.getString("BILLABLE")))
|
|
|
+ billable_hours = "预支付";
|
|
|
+ }
|
|
|
+
|
|
|
+ BO invoiceItem = new BO();
|
|
|
+ invoiceItem.setBindId(invoice.getBindId());
|
|
|
+ invoiceItem.set("INVOICE_ID", invoice.getId());
|
|
|
+ invoiceItem.set("ITEM_DATE", param_item.get("ITEM_DATE"));
|
|
|
+ invoiceItem.set("ITEM_DESC", param_item.get("ITEM_DESC"));
|
|
|
+ invoiceItem.set("ITEM_TYPE", param_item.get("ITEM_TYPE"));
|
|
|
+ invoiceItem.set("RESOURCE_NAME", param_item.get("RESOURCE_NAME"));
|
|
|
+ invoiceItem.set("billable_hours", billable_hours);
|
|
|
+ invoiceItem.set("QUANTITY", param_item.get("QUANTITY"));
|
|
|
+ invoiceItem.set("RATE", param_item.get("RATE"));
|
|
|
+ invoiceItem.set("EFFECTIVE_TAX_RATE", accDedItem.getDouble("EFFECTIVE_TAX_RATE") * 100);
|
|
|
+ invoiceItem.set("TAX_CATEGORY_NAME", accDedItem.get("TAX_CATEGORY_NAME"));
|
|
|
+ String itemType = itemTypeList.stream().filter(rowMap -> rowMap.get("OID").equals(param_item.get("ITEM_TYPE"))).findFirst().get().getString("NAME");
|
|
|
+ invoiceItem.set("ITEM_TYPE", itemType);
|
|
|
+ invoiceItem.set("DOLLARS", param_item.get("DOLLARS"));
|
|
|
+ invoiceItem.set("HOURLY_RATE", param_item.get("HOURLY_RATE"));
|
|
|
+ invoiceItem.set("ROLE_NAME", param_item.get("ROLE_NAME"));
|
|
|
+ invoiceItem.set("WORK_TYPE", param_item.get("WORK_TYPE"));
|
|
|
+ invoiceItem.set("TAX_INCLUSIVE", param_item.get("DOLLARS"));
|
|
|
+ invoiceItem.set("ACCOUNT_DEDUCTION_ID", param_item.get("ID"));
|
|
|
+ SDK.getBOAPI().createDataBO("BO_EU_DNCTT_INVOICE_DETAIL", invoiceItem, uc);
|
|
|
+
|
|
|
+ //更新账户抵扣条目
|
|
|
+ if (isDeal)// 处理,区分预览和实际生成
|
|
|
+ {
|
|
|
+ BO thisacc_ded = SDK.getBOAPI().get("BO_EU_DNCRM_ACCOUNT_DEDUCTION", accDedItem.getString("ID"));
|
|
|
+ thisacc_ded.set("INVOICE_ID", invoice.getId());
|
|
|
+ thisacc_ded.set("INVOICE_LINE_ITEM_NO", invoice_line);
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNCRM_ACCOUNT_DEDUCTION", thisacc_ded);
|
|
|
+ }
|
|
|
+ invoice_line++;
|
|
|
+ }
|
|
|
+ //付费到这个客户的条目
|
|
|
+ if (billToThisPurOrdList.size() > 0) {
|
|
|
+ Map<String, List<RowMap>> dicBillToThis = billToThisPurOrdList.stream().collect(Collectors.groupingBy(rowMap -> rowMap.getString("account_id")));
|
|
|
+ for (String bkey : dicBillToThis.keySet()) {
|
|
|
+
|
|
|
+ for (RowMap param_item : dicBillToThis.get(bkey)) {
|
|
|
+ RowMap accDedItem = dicList.get(key).stream().filter(rowMap -> rowMap.get("ID").equals(param_item.get("ID"))).findFirst().get();
|
|
|
+
|
|
|
+ String billable_hours = param_item.getString("BILLABLE_HOURS");
|
|
|
+
|
|
|
+ if (param_item.getString("CONTRACT_TYPE_ID").equals("1199") || param_item.getString("CONTRACT_TYPE_ID").equals("1201")) {
|
|
|
+ billable_hours = "合同已包";
|
|
|
+ } else if (param_item.getString("CONTRACT_TYPE_ID").equals("1202") || param_item.getString("CONTRACT_TYPE_ID").equals("1203")) {
|
|
|
+ if (StringUtils.isNotBlank(param_item.getString("BILLABLE")))
|
|
|
+ billable_hours = "预支付";
|
|
|
+ }
|
|
|
+
|
|
|
+ BO invoiceItem = new BO();
|
|
|
+ invoiceItem.setBindId(invoice.getBindId());
|
|
|
+ invoiceItem.set("INVOICE_ID", invoice.getId());
|
|
|
+ invoiceItem.set("ITEM_DATE", param_item.get("ITEM_DATE"));
|
|
|
+ invoiceItem.set("ITEM_DESC", param_item.get("ITEM_DESC"));
|
|
|
+ invoiceItem.set("ITEM_TYPE", param_item.get("ITEM_TYPE"));
|
|
|
+ invoiceItem.set("RESOURCE_NAME", param_item.get("RESOURCE_NAME"));
|
|
|
+ invoiceItem.set("billable_hours", billable_hours);
|
|
|
+ invoiceItem.set("QUANTITY", param_item.get("QUANTITY"));
|
|
|
+ invoiceItem.set("RATE", param_item.get("RATE"));
|
|
|
+ invoiceItem.set("EFFECTIVE_TAX_RATE", accDedItem.getDouble("EFFECTIVE_TAX_RATE") * 100);
|
|
|
+ invoiceItem.set("TAX_CATEGORY_NAME", accDedItem.get("TAX_CATEGORY_NAME"));
|
|
|
+ String itemType = itemTypeList.stream().filter(rowMap -> rowMap.get("OID").equals(param_item.get("ITEM_TYPE"))).findFirst().get().getString("NAME");
|
|
|
+ invoiceItem.set("ITEM_TYPE", itemType);
|
|
|
+ invoiceItem.set("DOLLARS", param_item.get("DOLLARS"));
|
|
|
+ invoiceItem.set("HOURLY_RATE", param_item.get("HOURLY_RATE"));
|
|
|
+ invoiceItem.set("ROLE_NAME", param_item.get("ROLE_NAME"));
|
|
|
+ invoiceItem.set("WORK_TYPE", param_item.get("WORK_TYPE"));
|
|
|
+ invoiceItem.set("TAX_INCLUSIVE", param_item.get("DOLLARS"));
|
|
|
+ invoiceItem.set("ACCOUNT_DEDUCTION_ID", param_item.get("ID"));
|
|
|
+ SDK.getBOAPI().createDataBO("BO_EU_DNCTT_INVOICE_DETAIL", invoiceItem, uc);
|
|
|
+
|
|
|
+
|
|
|
+ //更新账户抵扣条目
|
|
|
+ if (isDeal)// 处理,区分预览和实际生成
|
|
|
+ {
|
|
|
+ BO thisacc_ded = SDK.getBOAPI().get("BO_EU_DNCRM_ACCOUNT_DEDUCTION", accDedItem.getString("ID"));
|
|
|
+ thisacc_ded.set("INVOICE_ID", invoice.getId());
|
|
|
+ thisacc_ded.set("INVOICE_LINE_ITEM_NO", invoice_line);
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNCRM_ACCOUNT_DEDUCTION", thisacc_ded);
|
|
|
+ }
|
|
|
+ invoice_line++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ return invoiceIds;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private boolean addInvoiceItem(UserContext uc, List<RowMap> invoiceItemList) {
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|