Merge branch 'glms/feature/1.4.2' into glms/feature/dotnumber
# Conflicts: # YLErpWeb/App_Data/Config/otcformat.js # YLErpWeb/Views/SwapTrade2/TradeEdit.cshtml # YLErpWeb/wwwroot/Scripts/app/swaptrade/swapTradeEdit.js
This commit is contained in:
@@ -17,16 +17,29 @@ namespace YLErp.Modules.SwapModule
|
||||
return (decimal)method.Invoke(null, new object[] { position, unwindData });
|
||||
}
|
||||
|
||||
private static decimal InvokeCalcInitTradingFeePending(swap_position oriPosition, swap_position position, UnwindData unwindData)
|
||||
{
|
||||
var method = typeof(SwapDealService).GetMethod(
|
||||
"CalcInitTradingFeePending",
|
||||
BindingFlags.NonPublic | BindingFlags.Static);
|
||||
|
||||
Assert.IsNotNull(method, "CalcInitTradingFeePending was not found");
|
||||
|
||||
return (decimal)method.Invoke(null, new object[] { oriPosition, position, unwindData });
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void 百分比模式_按平仓名义本金计算并四舍五入到两位()
|
||||
{
|
||||
var position = new swap_position
|
||||
{
|
||||
PosiFeeType = 0,
|
||||
PosiTradingFeeUnit = 0.1234m
|
||||
PosiTradingFeeUnit = 0.1234m,
|
||||
PosiTradingFeePending = 1234.00m
|
||||
};
|
||||
var unwindData = new UnwindData
|
||||
{
|
||||
NotionalValue = 1_000_000m,
|
||||
CloseNotionalValue = 1_000_000m,
|
||||
CloseQty = 8888m
|
||||
};
|
||||
@@ -42,10 +55,12 @@ namespace YLErp.Modules.SwapModule
|
||||
var position = new swap_position
|
||||
{
|
||||
PosiFeeType = 1,
|
||||
PosiTradingFeeUnit = 1.235m
|
||||
PosiTradingFeeUnit = 1.235m,
|
||||
PosiTradingFeePending = 12.35m
|
||||
};
|
||||
var unwindData = new UnwindData
|
||||
{
|
||||
NotionalQty = 10m,
|
||||
CloseNotionalValue = 1_000_000m,
|
||||
CloseQty = 10m
|
||||
};
|
||||
@@ -61,5 +76,73 @@ namespace YLErp.Modules.SwapModule
|
||||
Assert.AreEqual(0m, InvokeCalcInitTradingFee(null, new UnwindData()));
|
||||
Assert.AreEqual(0m, InvokeCalcInitTradingFee(new swap_position(), null));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void BaseRatePendingFeeUsesTheSameActualCloseAmountAsCloseFee()
|
||||
{
|
||||
var oriPosition = new swap_position
|
||||
{
|
||||
PosiFeeType = 1,
|
||||
PosiTradingFeeUnit = 0.2m
|
||||
};
|
||||
oriPosition.PosiTradingFeePending = 2000m;
|
||||
var position = new swap_position { PosiTradingFeePending = 840m };
|
||||
var unwindData = new UnwindData { NotionalQty = 10000m, CloseQty = 3000m, CloseNotionalValue = 4200m };
|
||||
|
||||
var fee = InvokeCalcInitTradingFeePending(oriPosition, position, unwindData);
|
||||
|
||||
Assert.AreEqual(600m, fee);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void BaseRatePendingFeeAllocatesManuallyAdjustedOriginalPendingFee()
|
||||
{
|
||||
var oriPosition = new swap_position
|
||||
{
|
||||
PosiFeeType = 1,
|
||||
PosiTradingFeeUnit = 0.2m,
|
||||
PosiTradingFeePending = 1500m
|
||||
};
|
||||
var unwindData = new UnwindData { NotionalQty = 10000m, CloseQty = 3000m };
|
||||
|
||||
var fee = InvokeCalcInitTradingFeePending(oriPosition, new swap_position(), unwindData);
|
||||
|
||||
Assert.AreEqual(450m, fee);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void PartialCloseTradingFeeAndPendingFeeUseTheSameRoundedOriginalFeeAllocation()
|
||||
{
|
||||
var oriPosition = new swap_position
|
||||
{
|
||||
PosiFeeType = 0,
|
||||
PosiTradingFeeUnit = 1.1234m,
|
||||
PosiTradingFeePending = 113.46m
|
||||
};
|
||||
var unwindData = new UnwindData
|
||||
{
|
||||
NotionalValue = 10098m,
|
||||
CloseNotionalValue = 4039.2m,
|
||||
NotionalQty = 10000m,
|
||||
CloseQty = 4000m
|
||||
};
|
||||
|
||||
var tradingFee = InvokeCalcInitTradingFee(oriPosition, unwindData);
|
||||
var pendingFee = InvokeCalcInitTradingFeePending(oriPosition, new swap_position(), unwindData);
|
||||
|
||||
Assert.AreEqual(45.38m, tradingFee);
|
||||
Assert.AreEqual(45.38m, pendingFee);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void LegacyPendingFeeKeepsCurrentPositionValueWhenNoBaseRateIsConfigured()
|
||||
{
|
||||
var oriPosition = new swap_position { PosiTradingFeeUnit = 0m };
|
||||
var position = new swap_position { PosiTradingFeePending = 840m };
|
||||
|
||||
var fee = InvokeCalcInitTradingFeePending(oriPosition, position, new UnwindData());
|
||||
|
||||
Assert.AreEqual(840m, fee);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
using YLErp.Configuration;
|
||||
using YLErp.DBModels;
|
||||
using YLErp.Modules.TradeModule.DocGenerateModule;
|
||||
|
||||
namespace YLErp.UnitTestProject.Modules.TradeModule.DocGenerateModule
|
||||
{
|
||||
[TestClass]
|
||||
public class GuolianContractNoGeneratorTest
|
||||
{
|
||||
[TestMethod]
|
||||
public void IsGuolianSwapTrade_OnlyMatchesGuolianSwap()
|
||||
{
|
||||
var swapTrade = CreateSwapTrade();
|
||||
|
||||
Assert.IsTrue(GuolianContractNoGenerator.IsGuolianSwapTrade(swapTrade, CompanyEnum.国联));
|
||||
Assert.IsFalse(GuolianContractNoGenerator.IsGuolianSwapTrade(
|
||||
new trade { TradeType = "香草期权" }, CompanyEnum.国联));
|
||||
Assert.IsFalse(GuolianContractNoGenerator.IsGuolianSwapTrade(swapTrade, CompanyEnum.国泰君安));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ShouldGenerateTradeNumberAfterSave_OnlyGeneratesForBlankTradeNumber()
|
||||
{
|
||||
var blankTrade = CreateSwapTrade();
|
||||
var manualTrade = CreateSwapTrade();
|
||||
manualTrade.TradeNumber = "MANUAL-001";
|
||||
|
||||
Assert.IsTrue(GuolianContractNoGenerator.ShouldGenerateTradeNumberAfterSave(
|
||||
blankTrade, CompanyEnum.国联));
|
||||
Assert.IsFalse(GuolianContractNoGenerator.ShouldGenerateTradeNumberAfterSave(
|
||||
manualTrade, CompanyEnum.国联));
|
||||
Assert.IsFalse(GuolianContractNoGenerator.ShouldGenerateTradeNumberAfterSave(
|
||||
blankTrade, CompanyEnum.国泰君安));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void BuildTradeNumber_ClientTrade_UsesNumericSequenceAndSanitizesUnderlyingCode()
|
||||
{
|
||||
var trade = CreateSwapTrade();
|
||||
trade.OpponentRole = "甲方";
|
||||
trade.TradeDate = new DateTime(2026, 7, 24);
|
||||
trade.UnderlyingCode = "250210.IB";
|
||||
|
||||
var number = GuolianContractNoGenerator.BuildTradeNumber(trade, "IS", 3);
|
||||
|
||||
Assert.AreEqual("GLMS-IS-20260724-FICC-03-250210IB", number);
|
||||
}
|
||||
|
||||
[DataTestMethod]
|
||||
[DataRow(1, "A")]
|
||||
[DataRow(26, "Z")]
|
||||
[DataRow(27, "AA")]
|
||||
public void BuildTradeNumber_NonClientTrade_UsesLetterSequence(int sequenceNo, string sequenceCode)
|
||||
{
|
||||
var trade = CreateSwapTrade();
|
||||
trade.OpponentRole = "乙方";
|
||||
trade.TradeDate = new DateTime(2026, 7, 24);
|
||||
trade.UnderlyingCode = "180205.IB";
|
||||
|
||||
var number = GuolianContractNoGenerator.BuildTradeNumber(trade, "glmscounter", sequenceNo);
|
||||
|
||||
Assert.AreEqual($"GLMS-glmscounter-20260724-FICC-{sequenceCode}-180205IB", number);
|
||||
}
|
||||
|
||||
private static trade CreateSwapTrade()
|
||||
{
|
||||
return new trade { TradeType = "收益互换" };
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user