合并仲裁实际消耗结算选项
This commit is contained in:
@@ -224,7 +224,7 @@ func buildArbitrationDecision(tx *gorm.DB, row model.Dispute, order model.Rental
|
||||
|
||||
func arbitrationUsesActualCheckout(result string) bool {
|
||||
switch result {
|
||||
case "release_deposit", "deduct_deposit", "compensate_owner":
|
||||
case "actual_settlement", "release_deposit", "deduct_deposit", "compensate_owner":
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
@@ -301,6 +301,14 @@ func arbitrationConsumableAmountCent(order model.RentalOrder, checkout *model.Or
|
||||
|
||||
func arbitrationDepositDeductAmountCent(order model.RentalOrder, req ArbitrateRequest) (int64, error) {
|
||||
switch req.Result {
|
||||
case "actual_settlement":
|
||||
if req.AmountCent <= 0 {
|
||||
return 0, nil
|
||||
}
|
||||
if req.AmountCent > order.DepositAmountCent {
|
||||
return 0, ErrInvalidDispute
|
||||
}
|
||||
return req.AmountCent, nil
|
||||
case "release_deposit":
|
||||
return 0, nil
|
||||
case "deduct_deposit", "compensate_owner":
|
||||
@@ -628,6 +636,8 @@ func buildArbitrationHandoffContent(req ArbitrateRequest, settlement arbitration
|
||||
|
||||
func arbitrationResultLabel(result string) string {
|
||||
switch result {
|
||||
case "actual_settlement":
|
||||
return "按实际消耗结算"
|
||||
case "full_refund":
|
||||
return "全额退款"
|
||||
case "partial_refund":
|
||||
|
||||
@@ -337,7 +337,7 @@ func TestArbitrationCompletedOrderRequiresActualCoinConsumedM(t *testing.T) {
|
||||
}
|
||||
|
||||
_, err = repo.Arbitrate(t.Context(), 77, created.ID, ArbitrateRequest{
|
||||
Result: "release_deposit",
|
||||
Result: "actual_settlement",
|
||||
Remark: "确认完成订单",
|
||||
}, AuditMeta{})
|
||||
if !errors.Is(err, ErrInvalidDispute) {
|
||||
@@ -347,7 +347,7 @@ func TestArbitrationCompletedOrderRequiresActualCoinConsumedM(t *testing.T) {
|
||||
actualCoinConsumedM := 50.0
|
||||
actualConsumableAmountCent := int64(12000)
|
||||
_, err = repo.Arbitrate(t.Context(), 77, created.ID, ArbitrateRequest{
|
||||
Result: "release_deposit",
|
||||
Result: "actual_settlement",
|
||||
Remark: "确认实际消耗 50M",
|
||||
ActualCoinConsumedM: &actualCoinConsumedM,
|
||||
}, AuditMeta{})
|
||||
@@ -356,7 +356,7 @@ func TestArbitrationCompletedOrderRequiresActualCoinConsumedM(t *testing.T) {
|
||||
}
|
||||
|
||||
if _, err := repo.Arbitrate(t.Context(), 77, created.ID, ArbitrateRequest{
|
||||
Result: "release_deposit",
|
||||
Result: "actual_settlement",
|
||||
Remark: "确认实际消耗 50M 和额外物品",
|
||||
ActualCoinConsumedM: &actualCoinConsumedM,
|
||||
ActualConsumableAmountCent: &actualConsumableAmountCent,
|
||||
@@ -372,6 +372,40 @@ func TestArbitrationCompletedOrderRequiresActualCoinConsumedM(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestActualSettlementArbitrationUsesOwnerCompensationAmount(t *testing.T) {
|
||||
order := disputePureCoinOrder()
|
||||
actualCoinConsumedM := 50.0
|
||||
actualConsumableAmountCent := int64(12000)
|
||||
|
||||
settlement, actualSettlement, _, depositDeductAmountCent, err := buildActualCheckoutArbitrationSettlement(nil, model.Dispute{}, order, ArbitrateRequest{
|
||||
Result: "actual_settlement",
|
||||
Remark: "按实际消耗结算",
|
||||
ActualCoinConsumedM: &actualCoinConsumedM,
|
||||
ActualConsumableAmountCent: &actualConsumableAmountCent,
|
||||
}, 0)
|
||||
if err != nil {
|
||||
t.Fatalf("不填押金赔付的实际结算失败: %v", err)
|
||||
}
|
||||
if depositDeductAmountCent != 0 || actualSettlement.DepositCompensationCent != 0 || settlement.DepositDeductAmountCent != 0 {
|
||||
t.Fatalf("不填押金赔付不应默认扣全押金: input=%d actual=%d settlement=%d", depositDeductAmountCent, actualSettlement.DepositCompensationCent, settlement.DepositDeductAmountCent)
|
||||
}
|
||||
|
||||
compensationCent := int64(3000)
|
||||
settlement, actualSettlement, _, depositDeductAmountCent, err = buildActualCheckoutArbitrationSettlement(nil, model.Dispute{}, order, ArbitrateRequest{
|
||||
Result: "actual_settlement",
|
||||
Remark: "赔付号主",
|
||||
AmountCent: compensationCent,
|
||||
ActualCoinConsumedM: &actualCoinConsumedM,
|
||||
ActualConsumableAmountCent: &actualConsumableAmountCent,
|
||||
}, 0)
|
||||
if err != nil {
|
||||
t.Fatalf("填写押金赔付的实际结算失败: %v", err)
|
||||
}
|
||||
if depositDeductAmountCent != compensationCent || actualSettlement.DepositCompensationCent != compensationCent || settlement.DepositDeductAmountCent != compensationCent {
|
||||
t.Fatalf("押金赔付 = %d/%d/%d, want %d", depositDeductAmountCent, actualSettlement.DepositCompensationCent, settlement.DepositDeductAmountCent, compensationCent)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCheckoutDisputeArbitrationReusesCheckoutCoinConsumedM(t *testing.T) {
|
||||
db := setupDisputeTestDB(t)
|
||||
repo := NewRepository(db, Dependencies{RefundStarter: RefundStarterFunc(func(context.Context, uint64, int64, string, string) (string, error) {
|
||||
|
||||
Reference in New Issue
Block a user