private static void CheckRepoLimit(Boolean blnIsSubmit, DA_TRN record, out object PCESCEObject)
        {
            try
            {
                LimitDisplayModel PCECheckRecords     = DealUIP.CheckPCE(SessionInfo, record, ProductId);
                LimitDisplayModel CountryCheckRecords = DealUIP.CheckCountryLimit(SessionInfo, record, ProductId);

                PCESCEObject = ConsoLimitDisplay(blnIsSubmit, PCECheckRecords, null, CountryCheckRecords);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        private static void CheckFXSpotLimits(Boolean blnIsSubmit, DA_TRN record, DA_TRN record2, out object PCESCEObject)
        {
            try
            {
                LimitDisplayModel PCECheckRecords     = DealUIP.CheckFXSwapPCE(SessionInfo, record, record2, ProductId);
                LimitDisplayModel SCECheckRecords     = record.FLAG_SETTLE.Value ?  DealUIP.CheckFXSwapSCE(SessionInfo, record, record2, ProductId) : null;
                LimitDisplayModel CountryCheckRecords = DealUIP.CheckFXSwapCountryLimit(SessionInfo, record, record2, ProductId);

                PCESCEObject = ConsoLimitDisplay(blnIsSubmit, PCECheckRecords, SCECheckRecords, CountryCheckRecords);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
示例#3
0
        public LimitDisplayModel CheckCountryLimit(SessionInfo sessioninfo, DA_TRN trn, string strExcludeID)
        {
            LimitCheckBusiness _limitCheckBusiness = new LimitCheckBusiness();
            LimitDisplayModel limitDisplay = new LimitDisplayModel();
            Guid guExcludeID = Guid.Empty;

            if (trn.KK_PCCF != null)
            {
                List<CountryLimitModel> deal_conts = new List<CountryLimitModel>();

                if (trn.FLAG_SETTLE.HasValue && trn.FLAG_SETTLE.Value)
                {
                    deal_conts = (from f in trn.DA_TRN_FLOW
                                  where f.FLOW_AMOUNT_THB > 0
                                  select new CountryLimitModel
                                  {
                                      EXPOSURE_DATE = f.FLOW_DATE.Value,
                                      EXPOSURE = f.FLOW_AMOUNT_THB.Value + trn.KK_CONTRIBUTE
                                  }).ToList();
                }

                if (trn.TRADE_DATE.Value != trn.MATURITY_DATE.Value)
                    deal_conts.Add(new CountryLimitModel { EXPOSURE_DATE = trn.TRADE_DATE.Value, EXPOSURE = trn.KK_CONTRIBUTE.Value });

                //Find original deal for exclude it from limit calculation
                if (strExcludeID != null && Guid.TryParse(strExcludeID.Replace("\"", ""), out guExcludeID))
                    guExcludeID = Guid.Parse(strExcludeID.Replace("\"", ""));

                List<LimitCheckModel> ori_conts = _limitCheckBusiness.CheckAllCountry(sessioninfo.Process.CurrentDate, trn, guExcludeID, Guid.Empty);

                limitDisplay.LimitDisplayObject = GenerateCountryLimitDisplay(deal_conts, ori_conts, trn, null, sessioninfo.CountryOverwrite, ref limitDisplay);

                if (limitDisplay.LimitCheckStatus == eLimitCheckStatus.NEEDAPPROVE)
                    trn.OVER_COUNTRY_AMOUNT = limitDisplay.OverAmount;
            }
            else
            {
                limitDisplay.LimitCheckStatus = eLimitCheckStatus.ERROR;
                limitDisplay.Message = "This deal breach allowed tenor.";
            }
            return limitDisplay;
        }
示例#4
0
        private static void CheckFILimit(Boolean blnIsSubmit, DA_TRN record, out object PCESCEObject)
        {
            try
            {
                LimitDisplayModel PCECheckRecords     = DealUIP.CheckPCE(SessionInfo, record, ProductId);
                LimitDisplayModel SCECheckRecords     = null;
                LimitDisplayModel CountryCheckRecords = DealUIP.CheckCountryLimit(SessionInfo, record, ProductId);

                var flagSettle = record.FLAG_SETTLE.Value && record.NOTIONAL_THB.Value > 0;

                if (flagSettle)
                {
                    SCECheckRecords = DealUIP.CheckSCE(SessionInfo, record, ProductId);
                }

                PCESCEObject = ConsoLimitDisplay(blnIsSubmit, PCECheckRecords, SCECheckRecords, CountryCheckRecords);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
示例#5
0
        public static object ConsoLimitDisplay(bool blnSubmit, LimitDisplayModel pce, LimitDisplayModel set, LimitDisplayModel country)
        {
            object result = new object();

            if (pce.LimitCheckStatus == eLimitCheckStatus.ERROR)
            {
                result = new
                        {
                            Result = "ERROR",
                            Message = pce.Message,
                        };
            }
            else if (set != null && set.LimitCheckStatus == eLimitCheckStatus.ERROR)
            {
                result = new
                        {
                            Result = "ERROR",
                            Message = set.Message,
                        };
            }
            else if (country.LimitCheckStatus == eLimitCheckStatus.ERROR)
            {
                result = new
                        {
                            Result = "ERROR",
                            Message = country.Message,
                        };
            }
            else if (pce.LimitCheckStatus == eLimitCheckStatus.NOTALLOW
                        || (set != null ? set.LimitCheckStatus == eLimitCheckStatus.NOTALLOW : false)
                        || country.LimitCheckStatus == eLimitCheckStatus.NOTALLOW)
            {
                result = new
                {
                    Result = "NOTALLOW",
                    Message = "",
                    PCERecords = JsonConvert.SerializeObject(pce.LimitDisplayObject, new IsoDateTimeConverter()),
                    SCERecords = JsonConvert.SerializeObject(set != null ? set.LimitDisplayObject : null, new IsoDateTimeConverter()),
                    CountryRecords = JsonConvert.SerializeObject(country.LimitDisplayObject, new IsoDateTimeConverter())
                };
            }
            else if (blnSubmit && (pce.LimitCheckStatus == eLimitCheckStatus.NEEDAPPROVE
                                    || (set != null ? set.LimitCheckStatus == eLimitCheckStatus.NEEDAPPROVE : false)
                                    || country.LimitCheckStatus == eLimitCheckStatus.NEEDAPPROVE))
            {
                result = new
                        {
                            Result = "NEEDAPPROVE",
                            Message = "",
                            PCERecords = JsonConvert.SerializeObject(pce.LimitDisplayObject, new IsoDateTimeConverter()),
                            SCERecords = JsonConvert.SerializeObject(set != null ? set.LimitDisplayObject : null, new IsoDateTimeConverter()),
                            CountryRecords = JsonConvert.SerializeObject(country.LimitDisplayObject, new IsoDateTimeConverter())
                        };
            }
            else
            {
                result = new
                        {
                            Result = "OK",
                            Message = "",
                            PCERecords = JsonConvert.SerializeObject(pce.LimitDisplayObject, new IsoDateTimeConverter()),
                            SCERecords = JsonConvert.SerializeObject(set != null ? set.LimitDisplayObject : null, new IsoDateTimeConverter()),
                            CountryRecords = JsonConvert.SerializeObject(country.LimitDisplayObject, new IsoDateTimeConverter())
                        };
            }

            return result;
        }
示例#6
0
        public static object ConsoLimitDisplay(bool blnSubmit, LimitDisplayModel pce, LimitDisplayModel set, LimitDisplayModel country)
        {
            object result = new object();

            if (pce.LimitCheckStatus == eLimitCheckStatus.ERROR)
            {
                result = new
                {
                    Result  = "ERROR",
                    Message = pce.Message,
                };
            }
            else if (set != null && set.LimitCheckStatus == eLimitCheckStatus.ERROR)
            {
                result = new
                {
                    Result  = "ERROR",
                    Message = set.Message,
                };
            }
            else if (country.LimitCheckStatus == eLimitCheckStatus.ERROR)
            {
                result = new
                {
                    Result  = "ERROR",
                    Message = country.Message,
                };
            }
            else if (pce.LimitCheckStatus == eLimitCheckStatus.NOTALLOW ||
                     (set != null ? set.LimitCheckStatus == eLimitCheckStatus.NOTALLOW : false) ||
                     country.LimitCheckStatus == eLimitCheckStatus.NOTALLOW)
            {
                result = new
                {
                    Result         = "NOTALLOW",
                    Message        = "",
                    PCERecords     = JsonConvert.SerializeObject(pce.LimitDisplayObject, new IsoDateTimeConverter()),
                    SCERecords     = JsonConvert.SerializeObject(set != null ? set.LimitDisplayObject : null, new IsoDateTimeConverter()),
                    CountryRecords = JsonConvert.SerializeObject(country.LimitDisplayObject, new IsoDateTimeConverter())
                };
            }
            else if (blnSubmit && (pce.LimitCheckStatus == eLimitCheckStatus.NEEDAPPROVE ||
                                   (set != null ? set.LimitCheckStatus == eLimitCheckStatus.NEEDAPPROVE : false) ||
                                   country.LimitCheckStatus == eLimitCheckStatus.NEEDAPPROVE))
            {
                result = new
                {
                    Result         = "NEEDAPPROVE",
                    Message        = "",
                    PCERecords     = JsonConvert.SerializeObject(pce.LimitDisplayObject, new IsoDateTimeConverter()),
                    SCERecords     = JsonConvert.SerializeObject(set != null ? set.LimitDisplayObject : null, new IsoDateTimeConverter()),
                    CountryRecords = JsonConvert.SerializeObject(country.LimitDisplayObject, new IsoDateTimeConverter())
                };
            }
            else
            {
                result = new
                {
                    Result         = "OK",
                    Message        = "",
                    PCERecords     = JsonConvert.SerializeObject(pce.LimitDisplayObject, new IsoDateTimeConverter()),
                    SCERecords     = JsonConvert.SerializeObject(set != null ? set.LimitDisplayObject : null, new IsoDateTimeConverter()),
                    CountryRecords = JsonConvert.SerializeObject(country.LimitDisplayObject, new IsoDateTimeConverter())
                };
            }

            return(result);
        }
示例#7
0
        public LimitDisplayModel CheckFXSwapCountryLimit(SessionInfo sessioninfo, DA_TRN trn1, DA_TRN trn2, string strExcludeID)
        {
            LimitCheckBusiness _limitCheckBusiness = new LimitCheckBusiness();
            LimitDisplayModel limitDisplay = new LimitDisplayModel();
            DA_TRN oldtrn1 = null;
            DA_TRN oldtrn2 = null;
            Guid guExcludeID1 = Guid.Empty;
            Guid guExcludeID2 = Guid.Empty;

            if (trn1.KK_PCCF != null && trn2.KK_PCCF != null)
            {

                List<CountryLimitModel> deal_conts = new List<CountryLimitModel>();

                if (trn1.FLAG_SETTLE.HasValue && trn1.FLAG_SETTLE.Value)
                {
                    deal_conts = (from f in trn1.DA_TRN_FLOW
                                  where f.FLOW_AMOUNT_THB > 0
                                  select new CountryLimitModel
                                  {
                                      EXPOSURE_DATE = f.FLOW_DATE.Value,
                                      EXPOSURE = f.FLOW_AMOUNT_THB.Value + trn1.KK_CONTRIBUTE
                                  }).Union(
                                  (from f in trn2.DA_TRN_FLOW
                                   where f.FLOW_AMOUNT_THB > 0
                                   select new CountryLimitModel
                                   {
                                       EXPOSURE_DATE = f.FLOW_DATE.Value,
                                       EXPOSURE = f.FLOW_AMOUNT_THB.Value + trn2.KK_CONTRIBUTE
                                   })).ToList();

                }

                if (trn1.TRADE_DATE.Value != trn1.MATURITY_DATE.Value)
                    deal_conts.Add(new CountryLimitModel { EXPOSURE_DATE = trn1.TRADE_DATE.Value, EXPOSURE = trn1.KK_CONTRIBUTE.Value + trn2.KK_CONTRIBUTE.Value });

                //Find original deals for exclude them from limit calculation
                if (strExcludeID != null && Guid.TryParse(strExcludeID.Replace("\"", ""), out guExcludeID1))
                {
                    guExcludeID1 = Guid.Parse(strExcludeID.Replace("\"", ""));

                    oldtrn1 = GetByID(guExcludeID1);
                    oldtrn2 = GetDealByProcessDate(sessioninfo.Process.CurrentDate).FirstOrDefault(p => p.INT_DEAL_NO == oldtrn1.INT_DEAL_NO && p.VERSION == oldtrn1.VERSION && p.ID != oldtrn1.ID);

                    if (oldtrn2 == null || oldtrn1 == null)
                        throw this.CreateException(new Exception(), "Cannot find original deals.");

                    guExcludeID1 = oldtrn1.ID;
                    guExcludeID2 = oldtrn2.ID;
                }

                List<LimitCheckModel> ori_conts = _limitCheckBusiness.CheckAllCountry(sessioninfo.Process.CurrentDate, trn2, guExcludeID1, guExcludeID2);

                limitDisplay.LimitDisplayObject = GenerateCountryLimitDisplay(deal_conts, ori_conts, trn1, trn2, sessioninfo.CountryOverwrite, ref limitDisplay);

                if (limitDisplay.LimitCheckStatus == eLimitCheckStatus.NEEDAPPROVE)
                {
                    trn1.OVER_COUNTRY_AMOUNT = limitDisplay.OverAmount;
                    trn2.OVER_COUNTRY_AMOUNT = limitDisplay.OverAmount;
                }
            }
            else
            {
                limitDisplay.LimitCheckStatus = eLimitCheckStatus.ERROR;
                limitDisplay.Message = "This deal breach allowed tenor.";
            }
            return limitDisplay;
        }
示例#8
0
        public LimitDisplayModel CheckSwapCountryLimit(SessionInfo sessioninfo, DA_TRN trn, string strExcludeID)
        {
            LimitCheckBusiness _limitCheckBusiness = new LimitCheckBusiness();
            InstrumentBusiness _insBusiness = new InstrumentBusiness();
            LimitDisplayModel limitDisplay = new LimitDisplayModel();
            Guid guExcludeID = Guid.Empty;

            if (trn.KK_PCCF != null)
            {
                List<CountryLimitModel> deal_conts = new List<CountryLimitModel>();

                MA_INSTRUMENT ins = _insBusiness.GetByID(sessioninfo, trn.INSTRUMENT_ID.Value);

                if (ins.LABEL == "CCS")
                {
                    deal_conts = (from f in trn.DA_TRN_FLOW
                                  where f.FLOW_AMOUNT > 0 // Receive cash flows only
                                  select new
                                  {
                                      Flow_Date = f.FLOW_DATE,
                                      Flow_Amount_THB = f.FLOW_AMOUNT_THB
                                  }).GroupBy(fl => new { fl.Flow_Date })
                                    .Select(p => new CountryLimitModel
                                    {
                                        EXPOSURE_DATE = p.Key.Flow_Date,
                                        EXPOSURE = p.Sum(x => x.Flow_Amount_THB) + trn.KK_CONTRIBUTE.Value
                                    }).OrderBy(p => p.EXPOSURE_DATE).ToList();
                }
                else //Net cashflow for IRS
                {
                    deal_conts = (from f in trn.DA_TRN_FLOW
                                  select new
                                  {
                                      Flow_Date = f.FLOW_DATE,
                                      Flow_ccy = f.FLAG_FIRST ? trn.FIRST.CCY_ID : trn.SECOND.CCY_ID,
                                      Flow_Amount_THB = f.FLOW_AMOUNT_THB
                                  }).GroupBy(fl => new { fl.Flow_Date, fl.Flow_ccy })
                                    .Select(p => new CountryLimitModel
                                    {
                                        EXPOSURE_DATE = p.Key.Flow_Date,
                                        EXPOSURE = p.Sum(x => x.Flow_Amount_THB) + trn.KK_CONTRIBUTE.Value
                                    }).Where(t => t.EXPOSURE > 0).OrderBy(p => p.EXPOSURE_DATE).ToList();
                }

                if (trn.TRADE_DATE.Value != trn.MATURITY_DATE.Value)
                    deal_conts.Add(new CountryLimitModel { EXPOSURE_DATE = trn.TRADE_DATE.Value, EXPOSURE = trn.KK_CONTRIBUTE.Value });

                //Find original deal for exclude it from limit calculation
                if (strExcludeID != null && Guid.TryParse(strExcludeID.Replace("\"", ""), out guExcludeID))
                    guExcludeID = Guid.Parse(strExcludeID.Replace("\"", ""));

                List<LimitCheckModel> ori_conts = _limitCheckBusiness.CheckAllCountry(sessioninfo.Process.CurrentDate, trn, guExcludeID, Guid.Empty);

                limitDisplay.LimitDisplayObject = GenerateCountryLimitDisplay(deal_conts, ori_conts, trn, null, sessioninfo.CountryOverwrite, ref limitDisplay);

                if (limitDisplay.LimitCheckStatus == eLimitCheckStatus.NEEDAPPROVE)
                    trn.OVER_COUNTRY_AMOUNT = limitDisplay.OverAmount;
            }
            else
            {
                limitDisplay.LimitCheckStatus = eLimitCheckStatus.ERROR;
                limitDisplay.Message = "This deal breach allowed tenor.";
            }

            return limitDisplay;
        }
示例#9
0
        public LimitDisplayModel CheckSwapSCE(SessionInfo sessioninfo, DA_TRN trn, string strExcludeID)
        {
            LimitCheckBusiness _limitCheckBusiness = new LimitCheckBusiness();
            InstrumentBusiness _insBusiness = new InstrumentBusiness();
            LimitDisplayModel limitDisplay = new LimitDisplayModel();
            Guid guExcludeID = Guid.Empty;
            List<DA_TRN_CASHFLOW> deal_conts = new List<DA_TRN_CASHFLOW>();

            MA_INSTRUMENT ins = _insBusiness.GetByID(sessioninfo, trn.INSTRUMENT_ID.Value);

            if (ins.LABEL == "CCS")
            {
                deal_conts = (from f in trn.DA_TRN_FLOW
                              where f.FLOW_AMOUNT > 0 // Receive cash flows only
                              select new
                              {
                                  Flow_Date = f.FLOW_DATE,
                                  Flow_Amount_THB = f.FLOW_AMOUNT_THB
                              }).GroupBy(fl => new { fl.Flow_Date })
                                .Select(p => new DA_TRN_CASHFLOW
                                {
                                    FLOW_DATE = p.Key.Flow_Date,
                                    FLOW_AMOUNT_THB = p.Sum(x => x.Flow_Amount_THB)
                                }).OrderBy(p => p.FLOW_DATE).ToList();
            }
            else //Net cashflow for IRS
            {
                deal_conts = (from f in trn.DA_TRN_FLOW
                              select new
                              {
                                  Flow_Date = f.FLOW_DATE,
                                  Flow_ccy = f.FLAG_FIRST ? trn.FIRST.CCY_ID : trn.SECOND.CCY_ID,
                                  Flow_Amount_THB = f.FLOW_AMOUNT_THB
                              }).GroupBy(fl => new { fl.Flow_Date, fl.Flow_ccy })
                                .Select(p => new DA_TRN_CASHFLOW
                                {
                                    FLOW_DATE = p.Key.Flow_Date,
                                    FLOW_AMOUNT_THB = p.Sum(x => x.Flow_Amount_THB)
                                }).Where(t => t.FLOW_AMOUNT_THB > 0).OrderBy(p => p.FLOW_DATE).ToList();
            }

            //Find original deal for exclude it from limit calculation
            if (strExcludeID != null && Guid.TryParse(strExcludeID.Replace("\"", ""), out guExcludeID))
                guExcludeID = Guid.Parse(strExcludeID.Replace("\"", ""));

            List<LimitCheckModel> ori_conts = _limitCheckBusiness.CheckAllSET(sessioninfo.Process.CurrentDate, trn, guExcludeID, Guid.Empty);

            limitDisplay.LimitDisplayObject = GenerateSETDisplay(deal_conts, ori_conts, sessioninfo.SETOverwrite, ref limitDisplay);

            if (limitDisplay.LimitCheckStatus == eLimitCheckStatus.NEEDAPPROVE)
                trn.OVER_SETTL_AMOUNT = limitDisplay.OverAmount;

            return limitDisplay;
        }
示例#10
0
        //public LimitDisplayModel CheckPCE(SessionInfo sessioninfo, DA_TRN trn)
        //{
        //    StaticDataBusiness _staticDataBusiness = new StaticDataBusiness();
        //    LimitCheckBusiness _limitCheckBusiness = new LimitCheckBusiness();
        //    LimitDisplayModel limitDisplay = new LimitDisplayModel();
        //    trn.KK_PCCF = _staticDataBusiness.GetPCCF(sessioninfo, trn);
        //    if (trn.KK_PCCF != null)
        //    {
        //        trn.KK_CONTRIBUTE = Math.Ceiling(trn.NOTIONAL_THB.Value * trn.KK_PCCF.Value / 100);
        //        List<LimitCheckModel> limits = _limitCheckBusiness.GetPCEByCriteria(sessioninfo.Process.CurrentDate, trn.CTPY_ID, trn.PRODUCT_ID.Value, "", Guid.Empty, Guid.Empty);
        //        foreach (LimitCheckModel limit in limits)
        //        {
        //            limit.DEAL_CONTRIBUTION = trn.KK_CONTRIBUTE.Value;
        //            SetLimitDisplayStatus(limit, ref limitDisplay);
        //        }
        //        limitDisplay.LimitDisplayObject = limits;
        //    }
        //    else
        //    {
        //        limitDisplay.LimitCheckStatus = eLimitCheckStatus.NOTALLOW;
        //        limitDisplay.LimitErrorObj = new { Result = "ERROR", Message = "This deal breach allowed tenor." };
        //    }
        //    return limitDisplay;
        //}
        public LimitDisplayModel CheckPCE(SessionInfo sessioninfo, DA_TRN trn, string strExcludeID)
        {
            StaticDataBusiness _staticDataBusiness = new StaticDataBusiness();
            LimitCheckBusiness _limitCheckBusiness = new LimitCheckBusiness();
            LimitDisplayModel limitDisplay = new LimitDisplayModel();
            Guid guExcludeID = Guid.Empty;

            trn.KK_PCCF = _staticDataBusiness.GetPCCF(sessioninfo, trn);

            //Find original deal for exclude it from limit calculation
            if (strExcludeID != null && Guid.TryParse(strExcludeID.Replace("\"", ""), out guExcludeID))
                guExcludeID = Guid.Parse(strExcludeID.Replace("\"", ""));

            if (trn.KK_PCCF != null)
            {
                trn.KK_CONTRIBUTE = Math.Ceiling(trn.NOTIONAL_THB.Value * trn.KK_PCCF.Value / 100);

                List<LimitCheckModel> limits = _limitCheckBusiness.CheckAllPCE(sessioninfo.Process.CurrentDate, trn, guExcludeID, Guid.Empty);

                foreach (LimitCheckModel limit in limits)
                {
                    limit.DEAL_CONTRIBUTION = trn.KK_CONTRIBUTE.Value;
                    SetLimitDisplayStatus(limit, sessioninfo.PCEOverwrite, ref limitDisplay);
                }

                if (limitDisplay.LimitCheckStatus == eLimitCheckStatus.NEEDAPPROVE)
                    trn.OVER_AMOUNT = limitDisplay.OverAmount;

                limitDisplay.LimitDisplayObject = limits;
            }
            else
            {
                limitDisplay.LimitCheckStatus = eLimitCheckStatus.ERROR;
                limitDisplay.Message = "This deal breach allowed tenor.";
            }

            return limitDisplay;
        }
示例#11
0
        public LimitDisplayModel CheckSCE(SessionInfo sessioninfo, DA_TRN trn, string strExcludeID)
        {
            LimitCheckBusiness _limitCheckBusiness = new LimitCheckBusiness();
            LimitDisplayModel limitDisplay = new LimitDisplayModel();
            Guid guExcludeID = Guid.Empty;

            List<DA_TRN_CASHFLOW> deal_conts = (from f in trn.DA_TRN_FLOW
                                                where f.FLOW_AMOUNT_THB > 0
                                                select new DA_TRN_CASHFLOW
                                                {
                                                    FLOW_DATE = f.FLOW_DATE.Value,
                                                    FLOW_AMOUNT_THB = f.FLOW_AMOUNT_THB.Value
                                                }).ToList();

            //Find original deal for exclude it from limit calculation
            if (strExcludeID != null && Guid.TryParse(strExcludeID.Replace("\"", ""), out guExcludeID))
                guExcludeID = Guid.Parse(strExcludeID.Replace("\"", ""));

            List<LimitCheckModel> ori_conts = _limitCheckBusiness.CheckAllSET(sessioninfo.Process.CurrentDate, trn, guExcludeID, Guid.Empty);

            limitDisplay.LimitDisplayObject = GenerateSETDisplay(deal_conts, ori_conts, sessioninfo.SETOverwrite , ref limitDisplay);

            if (limitDisplay.LimitCheckStatus == eLimitCheckStatus.NEEDAPPROVE)
                trn.OVER_SETTL_AMOUNT = limitDisplay.OverAmount;

            return limitDisplay;
        }
示例#12
0
        public LimitDisplayModel CheckFXSwapSCE(SessionInfo sessioninfo, DA_TRN trn1, DA_TRN trn2, string strExcludeID)
        {
            LimitCheckBusiness _limitCheckBusiness = new LimitCheckBusiness();
            LimitDisplayModel limitDisplay = new LimitDisplayModel();
            DA_TRN oldtrn1 = null;
            DA_TRN oldtrn2 = null;
            Guid guExcludeID1 = Guid.Empty;
            Guid guExcludeID2 = Guid.Empty;

            List<DA_TRN_CASHFLOW> deal_conts = ((from f in trn1.DA_TRN_FLOW
                                               where f.FLOW_AMOUNT_THB > 0
                                                 select new DA_TRN_CASHFLOW
                                               {
                                                   FLOW_DATE = f.FLOW_DATE.Value,
                                                   FLOW_AMOUNT_THB = f.FLOW_AMOUNT_THB.Value
                                               }).Union(
                                              (from f in trn2.DA_TRN_FLOW
                                               where f.FLOW_AMOUNT_THB > 0
                                               select new DA_TRN_CASHFLOW
                                               {
                                                   FLOW_DATE = f.FLOW_DATE.Value,
                                                   FLOW_AMOUNT_THB = f.FLOW_AMOUNT_THB.Value
                                               })
                                               )).ToList();

            //Find original deals for exclude them from limit calculation
            if (strExcludeID != null && Guid.TryParse(strExcludeID.Replace("\"", ""), out guExcludeID1))
            {
                guExcludeID1 = Guid.Parse(strExcludeID.Replace("\"", ""));

                oldtrn1 = GetByID(guExcludeID1);
                oldtrn2 = GetDealByProcessDate(sessioninfo.Process.CurrentDate).FirstOrDefault(p => p.INT_DEAL_NO == oldtrn1.INT_DEAL_NO && p.VERSION == oldtrn1.VERSION && p.ID != oldtrn1.ID);

                if (oldtrn2 == null || oldtrn1 == null)
                    throw this.CreateException(new Exception(), "Cannot find original deals.");

                guExcludeID1 = oldtrn1.ID;
                guExcludeID2 = oldtrn2.ID;
            }

            List<LimitCheckModel> ori_conts = _limitCheckBusiness.CheckAllSET(sessioninfo.Process.CurrentDate, trn1, guExcludeID1, guExcludeID2);

            limitDisplay.LimitDisplayObject = GenerateSETDisplay(deal_conts, ori_conts, sessioninfo.SETOverwrite, ref limitDisplay);

            if (limitDisplay.LimitCheckStatus == eLimitCheckStatus.NEEDAPPROVE)
            {
                trn1.OVER_SETTL_AMOUNT = limitDisplay.OverAmount;
                trn2.OVER_SETTL_AMOUNT = limitDisplay.OverAmount;
            }

            return limitDisplay;
        }
示例#13
0
        private void SetLimitDisplayStatus(LimitCheckModel objLimit, bool blnOverwrite, ref LimitDisplayModel objLimitDisplay)
        {
            if (objLimit.STATUS == eLimitStatusCode.EXCEED.ToString() || objLimit.STATUS == eLimitStatusCode.EXPIRED.ToString())
            {
                if ((objLimit.UTILIZATION - objLimit.AMOUNT) > objLimitDisplay.OverAmount)
                {
                    objLimitDisplay.OverAmount = objLimit.UTILIZATION - objLimit.AMOUNT;
                }

                if (!blnOverwrite || objLimit.TEMP_AMOUNT != 0)
                    objLimitDisplay.LimitCheckStatus = eLimitCheckStatus.NOTALLOW;
                else
                    objLimitDisplay.LimitCheckStatus = eLimitCheckStatus.NEEDAPPROVE;
            }
        }
示例#14
0
        private List<LimitCheckModel> GenerateSETDisplay(List<DA_TRN_CASHFLOW> deal_conts, List<LimitCheckModel> ori_conts, bool blnOverwrite, ref LimitDisplayModel limitDisplay)
        {
            List<LimitCheckModel> tempList = null;
            List<LimitCheckModel> limits = new List<LimitCheckModel>();
            LimitCheckModel limit = null;

            foreach (var deal_cont in deal_conts)
            {
                tempList = ori_conts.Where(f => f.FLOW_DATE == deal_cont.FLOW_DATE).ToList();

                foreach (LimitCheckModel item in tempList)
                {
                    limit = new LimitCheckModel();

                    limit.ORIGINAL_KK_CONTRIBUTE = item.ORIGINAL_KK_CONTRIBUTE;
                    limit.SNAME = item.SNAME;
                    limit.LIMIT_LABEL = item.LIMIT_LABEL;
                    limit.FLAG_CONTROL = item.FLAG_CONTROL;
                    limit.GEN_AMOUNT = item.GEN_AMOUNT;
                    limit.TEMP_AMOUNT = item.TEMP_AMOUNT;
                    //limit.AMOUNT = item.AMOUNT;
                    limit.FLOW_DATE = deal_cont.FLOW_DATE.Value;
                    limit.EXPIRE_DATE = item.EXPIRE_DATE;
                    limit.PROCESSING_DATE = item.PROCESSING_DATE;
                    limit.DEAL_CONTRIBUTION = deal_cont.FLOW_AMOUNT_THB.Value;

                    SetLimitDisplayStatus(limit, blnOverwrite, ref limitDisplay);

                    limits.Add(limit);
                }

                //Case that original exposure has no match date with deal exposure
                if (tempList.Count == 0)
                {
                    //Get limit info that is not equal to deal flow date
                    var limitinfos = ori_conts.GroupBy(p => p.SNAME)
                                                .Select(g => new { g, count = g.Count() })
                                                .SelectMany(t => t.g.Select(b => b)
                                                    .Zip(Enumerable.Range(1, t.count), (j, i) => new { j.SNAME, j.LIMIT_LABEL, j.FLAG_CONTROL, j.GEN_AMOUNT, j.TEMP_AMOUNT, j.EXPIRE_DATE, j.PROCESSING_DATE, rn = i }))
                                                .Where(w => w.rn == 1).ToList();

                    if (limitinfos.Count() > 0)
                    {
                        foreach (var check in limitinfos)
                        {
                            limit = new LimitCheckModel();

                            limit.ORIGINAL_KK_CONTRIBUTE = 0;
                            limit.SNAME = check.SNAME;
                            limit.LIMIT_LABEL = check.LIMIT_LABEL;
                            limit.FLAG_CONTROL = check.FLAG_CONTROL;
                            limit.GEN_AMOUNT = check.GEN_AMOUNT;
                            limit.TEMP_AMOUNT = check.TEMP_AMOUNT;
                            //limit.AMOUNT = check.AMOUNT;
                            limit.FLOW_DATE = deal_cont.FLOW_DATE.Value;
                            limit.EXPIRE_DATE = check.EXPIRE_DATE;
                            limit.PROCESSING_DATE = check.PROCESSING_DATE;
                            limit.DEAL_CONTRIBUTION = deal_cont.FLOW_AMOUNT_THB.Value;

                            SetLimitDisplayStatus(limit, blnOverwrite, ref limitDisplay);

                            limits.Add(limit);
                        }
                    }
                }
            }

            return limits.OrderBy(p => p.SNAME).ThenBy(p => p.FLOW_DATE).ToList() ;
        }
示例#15
0
        private List<LimitCheckModel> GenerateCountryLimitDisplay(List<CountryLimitModel> deal_conts, List<LimitCheckModel> ori_conts, DA_TRN trn1, DA_TRN trn2, bool blnOverwrite, ref LimitDisplayModel limitDisplay)
        {
            CountryLimitModel tempCountry = null;
            List<LimitCheckModel> limits = new List<LimitCheckModel>();
            decimal decExp = trn1.KK_CONTRIBUTE.Value + (trn2 != null ? trn2.KK_CONTRIBUTE.Value : 0);

            foreach (var ori_cont in ori_conts)
            {
                tempCountry = deal_conts.FirstOrDefault(f => f.EXPOSURE_DATE == ori_cont.FLOW_DATE);

                ori_cont.DEAL_CONTRIBUTION = tempCountry != null ? tempCountry.EXPOSURE.Value : decExp;

                SetLimitDisplayStatus(ori_cont, blnOverwrite, ref limitDisplay);

                if ((ori_cont.FLOW_DATE == trn1.TRADE_DATE || ori_cont.FLOW_DATE == trn1.MATURITY_DATE)
                    || (trn2 != null && (ori_cont.FLOW_DATE == trn2.TRADE_DATE || ori_cont.FLOW_DATE == trn2.MATURITY_DATE))
                    || (ori_cont.STATUS == eLimitStatusCode.EXCEED.ToString() || ori_cont.STATUS == eLimitStatusCode.EXPIRED.ToString()))
                {
                    limits.Add(ori_cont);
                }
            }

            return limits;
        }
示例#16
0
        public LimitDisplayModel CheckFXSwapPCE(SessionInfo sessioninfo, DA_TRN trn1, DA_TRN trn2, string strExcludeID)
        {
            StaticDataBusiness _staticDataBusiness = new StaticDataBusiness();
            LimitCheckBusiness _limitCheckBusiness = new LimitCheckBusiness();
            LimitDisplayModel limitDisplay = new LimitDisplayModel();
            DA_TRN oldtrn1 = null;
            DA_TRN oldtrn2 = null;
            Guid guExcludeID1 = Guid.Empty;
            Guid guExcludeID2 = Guid.Empty;

            //Exposure include far leg only -> set near leg to 0
            trn1.KK_PCCF = 0;
            trn2.KK_PCCF = _staticDataBusiness.GetPCCF(sessioninfo, trn2);

            //Find original deals for exclude them from limit calculation
            if (strExcludeID != null && Guid.TryParse(strExcludeID.Replace("\"", ""), out guExcludeID1))
            {
                guExcludeID1 = Guid.Parse(strExcludeID.Replace("\"", ""));

                oldtrn1 = GetByID(guExcludeID1);
                oldtrn2 = GetDealByProcessDate(sessioninfo.Process.CurrentDate).FirstOrDefault(p => p.INT_DEAL_NO == oldtrn1.INT_DEAL_NO && p.VERSION == oldtrn1.VERSION && p.ID != oldtrn1.ID);

                if (oldtrn2 == null || oldtrn1 == null)
                    throw this.CreateException(new Exception(), "Cannot find original deals.");

                guExcludeID1 = oldtrn1.ID;
                guExcludeID2 = oldtrn2.ID;
            }

            if (trn1.KK_PCCF != null && trn2.KK_PCCF != null)
            {
                trn1.KK_CONTRIBUTE = 0;
                trn2.KK_CONTRIBUTE = Math.Ceiling(trn2.NOTIONAL_THB.Value * trn2.KK_PCCF.Value / 100);

                List<LimitCheckModel> limits = _limitCheckBusiness.CheckAllPCE(sessioninfo.Process.CurrentDate, trn1, guExcludeID1, guExcludeID2);

                foreach (LimitCheckModel limit in limits)
                {
                    limit.DEAL_CONTRIBUTION = trn1.KK_CONTRIBUTE.Value + trn2.KK_CONTRIBUTE.Value;
                    SetLimitDisplayStatus(limit, sessioninfo.PCEOverwrite, ref limitDisplay);
                }

                if (limitDisplay.LimitCheckStatus == eLimitCheckStatus.NEEDAPPROVE)
                {
                    trn1.OVER_AMOUNT = limitDisplay.OverAmount;
                    trn2.OVER_AMOUNT = limitDisplay.OverAmount;
                }

                limitDisplay.LimitDisplayObject = limits;
            }
            else
            {
                limitDisplay.LimitCheckStatus = eLimitCheckStatus.ERROR;
                limitDisplay.Message = "This deal breach allowed tenor.";
            }

            return limitDisplay;
        }