예제 #1
0
        public static List <PandLReportDto> PandL(DateTime fromDate, DateTime toDate)
        {
            using (var db = new GLDbContext())
            {
                var debitResults = db.Transactions
                                   .Where(x => x.TranHeader.Date >= fromDate && x.TranHeader.Date <= toDate & !x.DebitAccount.Category.IsBalanceSheet)
                                   .GroupBy(x => x.DebitAccount)
                                   .Select(r => new PandLReportDto
                {
                    Account = r.FirstOrDefault().DebitAccount.Code,
                    Amount  = r.Sum(x => 0 - x.Amount)
                }).ToList();

                var creditResults = db.Transactions
                                    .Where(x => x.TranHeader.Date >= fromDate &&
                                           x.TranHeader.Date <= toDate & !x.CreditAccount.Category.IsBalanceSheet)
                                    .GroupBy(x => x.CreditAccount)
                                    .Select(r => new PandLReportDto
                {
                    Account = r.FirstOrDefault().CreditAccount.Code,
                    Amount  = r.Sum(x => x.Amount)
                }).ToList();

                var results = debitResults;
                results.AddRange(creditResults);

                var refined = results.GroupBy(x => x.Account).Select(r => new PandLReportDto
                {
                    Account = r.First().Account,
                    Amount  = r.Sum(x => x.Amount)
                }).ToList();

                return(refined);
            }
        }
예제 #2
0
        public static decimal GetOpeningBalance(TranHeader header)
        {
            using (var db = new GLDbContext())
            {
                try
                {
                    if (header.LinkedAccount == null)
                    {
                        return(0);
                    }
                    var credits = db.Transactions
                                  .Where(x => x.CreditAccount.Id == header.LinkedAccount.Id &&
                                         x.TranHeader.StatementNumber < header.StatementNumber);

                    var creditTotal = credits.Any() ? credits.Sum(y => y.Amount) : 0;
                    var debits      = db.Transactions
                                      .Where(x => x.DebitAccount.Id == header.LinkedAccount.Id &&
                                             x.TranHeader.StatementNumber < header.StatementNumber);
                    var debitTotal = debits.Any() ? debits.Sum(y => y.Amount) : 0;
                    return(header.LinkedAccount.OpeningBalance + creditTotal - debitTotal);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    throw;
                }
            }
        }
예제 #3
0
        public static List <BalanceSheetDto> BalanceSheet(DateTime AsAtDate)
        {
            var data = new List <BalanceSheetDto>();

            using (var db = new GLDbContext())
            {
                var debitResults = db.Transactions.
                                   Where(x => x.TranHeader.Date <= AsAtDate && x.DebitAccount.Category.IsBalanceSheet)
                                   .GroupBy(x => x.DebitAccount).Select(r => new BalanceSheetDto()
                {
                    Account = r.FirstOrDefault().DebitAccount.Code,
                    Amount  = r.Sum(x => 0 - x.Amount) + r.FirstOrDefault().DebitAccount.OpeningBalance
                }).ToList();

                var creditResults = db.Transactions.
                                    Where(x => x.TranHeader.Date <= AsAtDate && x.CreditAccount.Category.IsBalanceSheet)
                                    .GroupBy(x => x.CreditAccount).Select(r => new BalanceSheetDto()
                {
                    Account = r.FirstOrDefault().DebitAccount.Code,
                    Amount  = r.Sum(x => 0 - x.Amount) + r.FirstOrDefault().CreditAccount.OpeningBalance
                }).ToList();


                var results = debitResults;
                results.AddRange(creditResults);

                var refined = results.GroupBy(x => x.Account).Select(r => new BalanceSheetDto()
                {
                    Account = r.First().Account,
                    Amount  = r.Sum(x => x.Amount)
                }).ToList();

                return(refined);
            }
        }
        public static void Seed(GLDbContext context)
        {
            var balanceSheetGst = context.GstCategories.Add(new GstCategory {
                Code = "N-T", Percent = 0
            });
            var pandlGst = context.GstCategories.Add(new GstCategory {
                Code = "GST", Percent = 10
            });

            for (int i = (int)GLCategoryEnum.Asset; i <= (int)GLCategoryEnum.OtherIncome; i++)
            {
                var IsBalSheet = IsBalanceSheet(i);
                var cat        = context.GLCategories.Add(new GLCategory {
                    Category = i, IsBalanceSheet = IsBalSheet
                });
                var gstCategory = IsBalSheet ? balanceSheetGst : pandlGst;
                var account     = new Account {
                    Code = $"0{i}", Category = cat, GstCategory = gstCategory
                };
                var child1 = new Account {
                    Code = $"0{i}-0100", Category = cat, GstCategory = gstCategory, Parent = account
                };
                account.Children.Add(child1);
                var child2 = new Account {
                    Code = $"0{i}-0200", Category = cat, GstCategory = gstCategory, Parent = account
                };
                account.Children.Add(child2);
                var child3 = new Account {
                    Code = $"0{i}-0300", Category = cat, GstCategory = gstCategory, Parent = account
                };
                account.Children.Add(child3);

                context.Accounts.Add(account);
                context.Accounts.Add(child1);
                context.Accounts.Add(child2);
                context.Accounts.Add(child3);

                for (int j = 0; j < 20; j++)
                {
                    var grandchild = new Account {
                        Code = $"0{i}-gc{j:D2}", Category = cat, GstCategory = gstCategory, Parent = child3
                    };
                    child3.Children.Add(grandchild);
                }
            }

            context.SaveChanges();
        }
 public static void EnsureDatabaseIsCreated()
 {
     try
     {
         using (var db = new GLDbContext())
         {
             var account = db.Accounts.FirstOrDefault();
             if (account == null)
             {
                 HandyDataFunctions.Seed(db);
             }
         }
     }
     catch (Exception e)
     {
         Console.WriteLine(e);
         throw;
     }
 }
예제 #6
0
        private static Setting MakeSetting(string settingName, string defaultValue)
        {
            using (var connect = new GLDbContext())
            {
                var setting = new Setting {
                    Name = settingName, Value = defaultValue
                };
                connect.Settings.Add(setting);
                connect.SaveChanges();

                var newSetting = connect.Settings.SingleOrDefault(x => x.Name == setting.Name);
                if (newSetting == null)
                {
                    throw new Exception("Expected setting to be found");
                }

                return(newSetting);
            }
        }
예제 #7
0
        public static decimal GetNextStatementNumber(Account linkedAccount)
        {
            using (var db = new GLDbContext())
            {
                try
                {
                    var lastStatement = db.TranHeaders.Where(x => x.LinkedAccount.Id == linkedAccount.Id)
                                        .OrderByDescending(x => x.StatementNumber).FirstOrDefault();


                    if (lastStatement == null)
                    {
                        return(1);
                    }

                    return(lastStatement.StatementNumber + 1);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    throw;
                }
            }
        }