예제 #1
0
        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);
                }
            }
        }