public void GenerateCashFlows(SessionInfo sessioninfo, DA_TRN trn, int intDaySpan, decimal firstRate, decimal secondRate) { DateTime dteActualFlow; DateTime dteLastActualFlow; DateTime dteEstFlow; int intCFSeq; decimal spotrate; //string strLegFreq; DA_TRN_CASHFLOW flow; LookupBusiness _lookupBusiness = new LookupBusiness(); int addMonth = 1; //default for Month int addDay = 1; MA_FREQ_TYPE freq = null; InstrumentBusiness _insBusiness = new InstrumentBusiness(); MA_INSTRUMENT ins = _insBusiness.GetByID(sessioninfo, trn.INSTRUMENT_ID.Value); for (int intLeg = 1; intLeg <= 2; intLeg++) { dteActualFlow = dteEstFlow = dteLastActualFlow = trn.START_DATE.Value.Date; //CCS : 4 priciple payment flows will be generated, 2 on initial payment date and 2 on maturity date if (ins.LABEL == "CCS") { //Initial Exchange flow = new DA_TRN_CASHFLOW(); flow.FLAG_FIRST = intLeg == 1 ? true : false; flow.SEQ = 1; flow.FLOW_DATE = trn.START_DATE; flow.FLOW_AMOUNT = intLeg == 1 ? trn.FIRST.NOTIONAL : -trn.SECOND.NOTIONAL; flow.FLOW_AMOUNT_THB = intLeg == 1 ? Math.Ceiling(flow.FLOW_AMOUNT.Value * firstRate) : Math.Ceiling(flow.FLOW_AMOUNT.Value * secondRate); flow.ID = Guid.NewGuid(); flow.DA_TRN_ID = trn.ID; flow.LOG.INSERTDATE = trn.LOG.INSERTDATE; flow.LOG.INSERTBYUSERID = trn.LOG.INSERTBYUSERID; trn.DA_TRN_FLOW.Add(flow); } intCFSeq = 2; freq = intLeg == 1 ? _lookupBusiness.GetFreqByID(trn.FIRST.FREQTYPE_ID.Value) : _lookupBusiness.GetFreqByID(trn.SECOND.FREQTYPE_ID.Value); do { if ((FrequencyType)Enum.Parse(typeof(FrequencyType), freq.USERCODE) == FrequencyType.W) { dteActualFlow = dteActualFlow.AddDays(7); } else if ((FrequencyType)Enum.Parse(typeof(FrequencyType), freq.USERCODE) == FrequencyType.B) { dteActualFlow = trn.MATURITY_DATE.Value; } else if (((FrequencyType)Enum.Parse(typeof(FrequencyType), freq.USERCODE)).ToString().StartsWith("D")) { addDay = (int)Enum.Parse(typeof(FrequencyType), freq.USERCODE).GetHashCode(); dteActualFlow = dteActualFlow.AddDays(addDay); } else { addMonth = (int)Enum.Parse(typeof(FrequencyType), freq.USERCODE).GetHashCode(); dteActualFlow = dteActualFlow.AddMonths(addMonth); } for (int i = -intDaySpan; i <= intDaySpan; i++) { flow = new DA_TRN_CASHFLOW(); dteEstFlow = dteActualFlow.AddDays(i); flow.FLAG_FIRST = intLeg == 1 ? true : false; flow.SEQ = intCFSeq; if (intLeg == 1) { flow.RATE = trn.FIRST.FLAG_FIXED == true ? trn.FIRST.RATE : trn.FIRST.RATE + trn.FIRST.FIRSTFIXINGAMT; flow.FLOW_AMOUNT = trn.FIRST.NOTIONAL * flow.RATE / 100 * Convert.ToDecimal((dteEstFlow - dteLastActualFlow).TotalDays) / 365; spotrate = firstRate; } else { flow.RATE = trn.SECOND.FLAG_FIXED == true ? trn.SECOND.RATE : trn.SECOND.RATE + trn.SECOND.FIRSTFIXINGAMT; flow.FLOW_AMOUNT = trn.SECOND.NOTIONAL * flow.RATE / 100 * Convert.ToDecimal((dteEstFlow - dteLastActualFlow).TotalDays) / 365; spotrate = secondRate; } flow.FLOW_DATE = dteEstFlow; if (intLeg == 1) //flow amount is negative for pay leg flow.FLOW_AMOUNT = -flow.FLOW_AMOUNT; flow.FLOW_AMOUNT_THB = flow.FLOW_AMOUNT > 0 ? Math.Ceiling(flow.FLOW_AMOUNT.Value * spotrate) : Math.Floor(flow.FLOW_AMOUNT.Value * spotrate); flow.ID = Guid.NewGuid(); flow.DA_TRN_ID = trn.ID; flow.LOG.INSERTDATE = trn.LOG.INSERTDATE; flow.LOG.INSERTBYUSERID = trn.LOG.INSERTBYUSERID; trn.DA_TRN_FLOW.Add(flow); intCFSeq += 1; } dteLastActualFlow = dteActualFlow; } while (dteActualFlow < trn.MATURITY_DATE.Value.Date); if (ins.LABEL == "CCS") { //Maturity Exchange flow = new DA_TRN_CASHFLOW(); flow.FLAG_FIRST = intLeg == 1 ? true : false; flow.SEQ = intCFSeq; flow.FLOW_DATE = trn.MATURITY_DATE; flow.FLOW_AMOUNT = intLeg == 1 ? -trn.FIRST.NOTIONAL : trn.SECOND.NOTIONAL; flow.FLOW_AMOUNT_THB = intLeg == 1 ? Math.Ceiling(flow.FLOW_AMOUNT.Value * firstRate) : Math.Ceiling(flow.FLOW_AMOUNT.Value * secondRate); flow.ID = Guid.NewGuid(); flow.DA_TRN_ID = trn.ID; flow.LOG.INSERTDATE = trn.LOG.INSERTDATE; flow.LOG.INSERTBYUSERID = trn.LOG.INSERTBYUSERID; trn.DA_TRN_FLOW.Add(flow); } } }