Пример #1
0
        private DelinquentIncome InitializeModel(dynamic backdatedPos)
        {
            DelinquentIncome overduePos = new DelinquentIncome
            {
                MonthDue        = DateTime.Now.AddMonths(-1).ToString(),
                AccountTypeDesc = backdatedPos.AccountType,
                PositionId      = backdatedPos.PositionId,
                TickerSymbol    = backdatedPos.TickerSymbol
            };

            return(overduePos);
        }
Пример #2
0
        private DelinquentIncome MapToDelinquentIncome(Position mapSource, string investorId, string currentTicker)
        {
            DelinquentIncome mapTarget = new DelinquentIncome
            {
                PositionId   = mapSource.PositionId,
                InvestorId   = investorId,
                MonthDue     = DateTime.Now.AddMonths(-1).Month.ToString(),
                TickerSymbol = currentTicker
            };

            return(mapTarget);
        }
Пример #3
0
        public bool UpdatePositionPymtDueFlags(List <PositionsForPaymentDueVm> sourcePositionsInfo, bool isPersisted = false)
        {
            // Received sourcePositionsInfo may contain either:
            //  1. data-imported month-end XLSX revenue processed Position Ids, OR
            //  2. selected 'Income Due' Positions marked for pending payment processing; selection(s) may also include * delinquent positions *.
            bool updatesAreOk = false;
            List <Data.Entities.Position> targetPositionsToUpdate = new List <Data.Entities.Position>();
            IList <DelinquentIncome>      delinquentPositions     = new List <DelinquentIncome>();

            int positionsUpdatedCount = 0;

            // Parameter context:
            // isPersisted: false - income received, but not yet recorded/saved, e.g., processing payment(s) via 'Income Due'.
            // isPersisted: true  - income received & recorded/saved, and is now eligible for next receivable cycle, e.g., XLSX via 'Data Import'.
            if (!isPersisted)
            {
                // Any delinquent records will appear first.
                var sourcePositionsInfoSorted = sourcePositionsInfo.OrderBy(p => p.TickerSymbol).ThenBy(p => p.MonthDue);
                foreach (var selectedPosition in sourcePositionsInfoSorted)
                {
                    // If selected Position is overdue, then -> delete from 'DelinquentIncome' table.
                    if (int.Parse(selectedPosition.MonthDue) < DateTime.Now.Month)
                    {
                        DelinquentIncome delinquentIncomeToDelete = new DelinquentIncome
                        {
                            PositionId   = selectedPosition.PositionId,
                            TickerSymbol = selectedPosition.TickerSymbol,
                            MonthDue     = selectedPosition.MonthDue,
                            InvestorId   = FetchInvestorId(selectedPosition.PositionId)
                        };
                        // If we have *duplicate* selected PositionIds, e.g., 1 current & 1 delinquent, then delete the delinquent record
                        // first, so that 'DelinquentIncome' table is updated real-time.
                        int duplicatePositionIdCount = sourcePositionsInfoSorted.Where(di => di.PositionId == selectedPosition.PositionId).Count();
                        if (duplicatePositionIdCount == 1)
                        {
                            delinquentPositions.Add(delinquentIncomeToDelete);
                        }
                        else
                        {
                            IList <DelinquentIncome> tempDelinquentPositions = new List <DelinquentIncome>
                            {
                                delinquentIncomeToDelete
                            };
                            RemoveDelinquency(tempDelinquentPositions);
                        }
                    }
                    else
                    {
                        // Mark Position(s) as paid, if no outstanding delinquencies.
                        IList <DelinquentIncome> delinquentPositionsFound = _ctx.DelinquentIncome.Where(d => d.PositionId == selectedPosition.PositionId).ToList();
                        if (!delinquentPositionsFound.Any())
                        {
                            Data.Entities.Position targetPositionToUpdate = _ctx.Position.Where(p => p.PositionId == selectedPosition.PositionId).First();
                            targetPositionToUpdate.PymtDue    = false;
                            targetPositionToUpdate.LastUpdate = DateTime.Now;

                            targetPositionsToUpdate.Add(targetPositionToUpdate);
                        }
                    }
                }

                if (delinquentPositions.Any())
                {
                    updatesAreOk = RemoveDelinquency(delinquentPositions);
                }

                if (targetPositionsToUpdate.Any())
                {
                    updatesAreOk = UpdateTargetPositions(targetPositionsToUpdate);
                }
            }
            else
            {
                string currentInvestorId = FetchInvestorId(sourcePositionsInfo.First().PositionId);
                delinquentPositions = GetSavedDelinquentRecords(currentInvestorId, "");
                int positionsNotUpdatedCount = 0;

                // Loop thru each XLSX position within the month-end collection & determine if it's eligible for updating its' 'PymtDue' flag.
                // debug -> existing PosId delinquency: 0481727F-737E-4775-870A-A8F20118F977 for PICB
                foreach (PositionsForPaymentDueVm xlsxPosition in sourcePositionsInfo)
                {
                    IList <DelinquentIncome> existingDelinquentPositions = delinquentPositions.Where(p => p.PositionId == xlsxPosition.PositionId).ToList();
                    if (existingDelinquentPositions.Any())
                    {
                        positionsNotUpdatedCount++;
                        continue;
                    }
                    else
                    {
                        Data.Entities.Position positionToUpdate = _ctx.Position.Where(p => p.PositionId == xlsxPosition.PositionId).First();
                        positionToUpdate.PymtDue    = true;
                        positionToUpdate.LastUpdate = DateTime.Now;

                        targetPositionsToUpdate.Add(positionToUpdate);
                    }
                }

                if (targetPositionsToUpdate.Any())
                {
                    _ctx.UpdateRange(targetPositionsToUpdate);
                    positionsUpdatedCount = _ctx.SaveChanges();

                    if (positionsUpdatedCount + positionsNotUpdatedCount == sourcePositionsInfo.Count())
                    {
                        updatesAreOk = true;
                    }
                }
            }

            return(updatesAreOk);
        }