Browse Source

合规登记修改货币的后续操作

hsun 2 years ago
parent
commit
28df0bf2bc

+ 1 - 1
controller/census/invoice_payment.go

@@ -238,7 +238,7 @@ func (ct *InvoicePaymentController) List(c *gin.Context) {
 				FlagImg:  currencyList[i].FlagImg,
 			})
 		}
-		sumList, e := fms.GetInvoiceListCurrencySum(cond, pars, "currency_unit, invoice_type")
+		sumList, e := fms.GetInvoiceListCurrencySum(amountTotalCond, amountTotalPars, "currency_unit, invoice_type")
 		if e != nil {
 			resp.FailMsg("获取失败", "获取商品到款统计货币合计金额失败, Err: "+e.Error(), c)
 			return

+ 54 - 16
controller/contract/register.go

@@ -368,11 +368,6 @@ func (rg *RegisterController) Edit(c *gin.Context) {
 		return
 	}
 	originHasPayment := item.HasPayment
-	// TODO:确认是否允许修改货币单位,若可修改货币单位则需要相应的处理开票到款
-	if req.CurrencyUnit != item.CurrencyUnit {
-		resp.Fail("暂不允许修改货币单位", c)
-		return
-	}
 
 	updateCols := []string{
 		"ContractCode", "RelateContractCode", "CrmContractId", "ContractSource", "CompanyName", "ActualCompanyName",
@@ -401,12 +396,64 @@ func (rg *RegisterController) Edit(c *gin.Context) {
 	item.HasPayment = req.HasPayment
 	item.NewCompany = req.NewCompany
 	item.ModifyTime = nowTime
+
 	// 存在代付的直接完成登记, 且不允许进行开票/到款登记
 	if req.HasPayment == 1 {
 		item.RegisterStatus = fms.ContractRegisterStatusComplete
 		updateCols = append(updateCols, "RegisterStatus")
 	}
 
+	// 开票到款信息
+	invoiceOB := new(fms.ContractInvoice)
+	invoiceCond := `contract_register_id = ?`
+	invoicePars := make([]interface{}, 0)
+	invoicePars = append(invoicePars, req.ContractRegisterId)
+	invoiceList, e := invoiceOB.List(invoiceCond, invoicePars, "")
+	if e != nil {
+		resp.FailMsg("操作失败", "获取合同开票到款列表失败, Err: "+e.Error(), c)
+		return
+	}
+	invoiceUpdateCols := make([]string, 0)
+
+	// 开票到款操作类型: 0-无; 1-更新; 2-删除;
+	invoiceHandleType := 0
+	if originHasPayment == 0 && req.HasPayment == 1 {
+		// 若从无代付修改为有代付, 则删除无代付期间新增的所有开票到款登记
+		invoiceHandleType = 2
+	} else {
+		// 修改了货币单位后,同步更新汇率及开票到款的换算金额
+		if req.CurrencyUnit != item.CurrencyUnit {
+			rateList, e := fmsService.GetTodayCurrencyRateList()
+			if e != nil {
+				resp.FailMsg("操作失败", "获取货币列表及汇率失败, Err: "+e.Error(), c)
+				return
+			}
+			var rate float64
+			for i := range rateList {
+				if rateList[i].Code == req.CurrencyUnit {
+					rate = rateList[i].RMBRate
+					break
+				}
+			}
+			if rate < 0 {
+				resp.FailMsg("操作失败", "货币汇率有误", c)
+				return
+			}
+			item.CurrencyUnit = req.CurrencyUnit
+			item.RMBRate = rate
+			updateCols = append(updateCols, "CurrencyUnit", "RMBRate")
+
+			// 调整开票到款换算后的金额, 保留两位小数
+			for i := range invoiceList {
+				invoiceList[i].CurrencyUnit = req.CurrencyUnit
+				a, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", invoiceList[i].OriginAmount/rate), 64)
+				invoiceList[i].Amount = a
+			}
+			invoiceUpdateCols = append(invoiceUpdateCols, "CurrencyUnit", "Amount")
+			invoiceHandleType = 1
+		}
+	}
+
 	// 套餐信息
 	serviceList, e := fmsService.HandleContractServiceAndDetail(req.ProductId, req.Services, true)
 	if e != nil {
@@ -414,21 +461,12 @@ func (rg *RegisterController) Edit(c *gin.Context) {
 		return
 	}
 
-	// 更新合同及套餐
-	if e = fms.UpdateContractRegisterAndServices(item, updateCols, serviceList); e != nil {
+	// 更新合同登记、套餐、开票到款
+	if e = fms.UpdateContractRegister(item, updateCols, serviceList, invoiceList, invoiceUpdateCols, invoiceHandleType); e != nil {
 		resp.FailMsg("操作失败", "更新合同及套餐失败, Err: "+e.Error(), c)
 		return
 	}
 
-	// 若从无代付修改为有代付, 则删除无代付期间新增的所有开票/到款登记(此情况并不经常出现, 但是可能会存在这种操作)
-	if originHasPayment == 0 && req.HasPayment == 1 {
-		go func() {
-			if e = fms.DeleteContractInvoicesByRegisterId(item.ContractRegisterId); e != nil {
-				alarm_msg.SendAlarmMsg("无代付修改为有代付, 删除开票到款记录失败, ErrMsg: "+err.Error(), 3)
-			}
-		}()
-	}
-
 	// 校验金额-是否修改状态
 	go fmsService.CheckContractRegisterAmount(item.ContractRegisterId)
 

+ 1 - 0
models/fms/contract_invoice.go

@@ -341,6 +341,7 @@ type ContractInvoiceAmountTotal struct {
 func GetContractInvoiceAmountTotal(condition string, pars []interface{}) (results []*ContractInvoiceAmountTotal, err error) {
 	query := global.DEFAULT_MYSQL.Table("contract_invoice").
 		Select("invoice_type, SUM(amount) AS total_amount").
+		Where("is_deleted = 0").
 		Where(condition, pars...).
 		Group("invoice_type")
 	err = query.Find(&results).Error

+ 21 - 3
models/fms/contract_register.go

@@ -231,8 +231,9 @@ func CreateContractRegisterAndServices(item *ContractRegister, serviceDetail []*
 	return
 }
 
-// UpdateContractRegisterAndServices 新增合同登记及套餐
-func UpdateContractRegisterAndServices(item *ContractRegister, updateCols []string, serviceDetail []*ContractServiceAndDetail) (err error) {
+// UpdateContractRegister 更新合同登记
+func UpdateContractRegister(item *ContractRegister, updateCols []string, serviceDetail []*ContractServiceAndDetail,
+	invoiceList []*ContractInvoice, invoiceUpdateCols []string, invoiceHandleType int) (err error) {
 	tx := global.DEFAULT_MYSQL.Begin()
 	defer func() {
 		if err != nil {
@@ -243,7 +244,7 @@ func UpdateContractRegisterAndServices(item *ContractRegister, updateCols []stri
 	}()
 
 	// 更新合同登记
-	if e := item.Update(updateCols); e != nil {
+	if e := tx.Model(item).Select(updateCols).Updates(item).Error; e != nil {
 		err = e
 		return
 	}
@@ -284,6 +285,23 @@ func UpdateContractRegisterAndServices(item *ContractRegister, updateCols []stri
 		//	t.Detail[j] = contractServiceDetail
 		//}
 	}
+
+	// 开票到款操作类型: 0-无; 1-更新; 2-删除;
+	if invoiceHandleType == 2 {
+		sql = `UPDATE contract_invoice SET is_deleted = 1 WHERE contract_register_id = ?`
+		if e := tx.Exec(sql, item.ContractRegisterId).Error; e != nil {
+			err = e
+			return
+		}
+	}
+	if invoiceHandleType == 1 {
+		for i := range invoiceList {
+			if e := tx.Model(invoiceList[i]).Select(invoiceUpdateCols).Updates(invoiceList[i]).Error; e != nil {
+				err = e
+				return
+			}
+		}
+	}
 	return
 }
 

+ 1 - 2
services/fms/contract_register.go

@@ -21,7 +21,6 @@ func CheckContractRegisterAmount(registerId int) {
 	var err error
 	defer func() {
 		if err != nil {
-			fmt.Println("校验合同登记金额失败, ErrMsg: "+err.Error())
 			alarm_msg.SendAlarmMsg("校验合同登记金额失败, ErrMsg: "+err.Error(), 3)
 		}
 	}()
@@ -48,7 +47,7 @@ func CheckContractRegisterAmount(registerId int) {
 	invoiceAmount := decimal.NewFromFloat(0).Round(2)
 	paymentAmount := decimal.NewFromFloat(0).Round(2)
 	for i := range invoiceList {
-		a := decimal.NewFromFloat(invoiceList[i].Amount).Round(2)
+		a := decimal.NewFromFloat(invoiceList[i].OriginAmount).Round(2)
 		if invoiceList[i].InvoiceType == fms.ContractInvoiceTypeMake {
 			invoiceAmount = invoiceAmount.Add(a)
 		}