public List<BalanceSheetDetailViewModel> RetrieveBalance(int headerId, bool isActiva)
        {
            List<JournalMaster> allJournalMaster = _journalMasterRepository.GetAll().ToList();

            List<BalanceJournalDetailViewModel> mappedResult = base.RetrieveBalanceJournalDetailsByHeaderId(headerId);
            List<BalanceSheetDetailViewModel> formattedResult = new List<BalanceSheetDetailViewModel>();

            Reference catCurrentAssetJournal = _referenceRepository.GetMany(r => r.Code == DbConstant.REF_CAT_JOURNAL_CURRENTASSET).FirstOrDefault();
            Reference catFixedAssetJournal = _referenceRepository.GetMany(r => r.Code == DbConstant.REF_CAT_JOURNAL_FIXEDASSET).FirstOrDefault();
            Reference catObligationJournal = _referenceRepository.GetMany(r => r.Code == DbConstant.REF_CAT_JOURNAL_OBLIGATION).FirstOrDefault();
            Reference catFundJournal = _referenceRepository.GetMany(r => r.Code == DbConstant.REF_CAT_JOURNAL_FUND).FirstOrDefault();

            List<Reference> listCurrentAssetJournal = _referenceRepository.GetMany(r => r.ParentId == catCurrentAssetJournal.Id).ToList();
            List<Reference> listFixedAssetJournal = _referenceRepository.GetMany(r => r.ParentId == catFixedAssetJournal.Id).ToList();
            List<Reference> listObligationJournal = _referenceRepository.GetMany(r => r.ParentId == catObligationJournal.Id).ToList();
            List<Reference> listFundJournal = _referenceRepository.GetMany(r => r.ParentId == catFundJournal.Id).ToList();

            if (isActiva)
            {
                BalanceSheetViewModel headerCurrentAsset = new BalanceSheetViewModel();
                headerCurrentAsset.GroupName = "Aktiva Lancar";

                foreach (var item in listCurrentAssetJournal)
                {
                    BalanceSheetDetailViewModel detail = new BalanceSheetDetailViewModel();
                    detail.Header = headerCurrentAsset;
                    JournalMaster currentJournal = allJournalMaster.Where(j => j.Code == item.Value).FirstOrDefault();
                    detail.Name = currentJournal.Name;

                    List<int> cachedItems = new List<int>();
                    foreach (var itemBalance in mappedResult.Where(m => !m.IsChecked))
                    {
                        if (base.IsCurrentJournalValid(itemBalance.Journal, item.Value))
                        {
                            decimal currentAmount = (itemBalance.LastDebit ?? 0) - (itemBalance.LastCredit ?? 0);
                            detail.Amount += currentAmount;

                            cachedItems.Add(itemBalance.Id);
                        }
                    }

                    foreach (var iCache in cachedItems)
                    {
                        BalanceJournalDetailViewModel current = mappedResult.Where(m => m.Id == iCache).FirstOrDefault();
                        int iCacheIndex = mappedResult.IndexOf(current);
                        current.IsChecked = true;
                        mappedResult[iCacheIndex] = current;
                    }

                    formattedResult.Add(detail);
                }

                BalanceSheetViewModel headerFixedAsset = new BalanceSheetViewModel();
                headerFixedAsset.GroupName = "Aktiva Tetap";

                foreach (var item in listFixedAssetJournal)
                {
                    BalanceSheetDetailViewModel detail = new BalanceSheetDetailViewModel();
                    detail.Header = headerFixedAsset;
                    JournalMaster currentJournal = allJournalMaster.Where(j => j.Code == item.Value).FirstOrDefault();
                    detail.Name = currentJournal.Name;

                    List<int> cachedItems = new List<int>();
                    foreach (var itemBalance in mappedResult.Where(m => !m.IsChecked))
                    {
                        if (base.IsCurrentJournalValid(itemBalance.Journal, item.Value))
                        {
                            decimal currentAmount = (itemBalance.LastDebit ?? 0) - (itemBalance.LastCredit ?? 0);
                            detail.Amount += currentAmount;

                            cachedItems.Add(itemBalance.Id);
                        }
                    }

                    foreach (var iCache in cachedItems)
                    {
                        BalanceJournalDetailViewModel current = mappedResult.Where(m => m.Id == iCache).FirstOrDefault();
                        int iCacheIndex = mappedResult.IndexOf(current);
                        current.IsChecked = true;
                        mappedResult[iCacheIndex] = current;
                    }

                    formattedResult.Add(detail);
                }
            }
            else
            {
                BalanceSheetViewModel headerObligation = new BalanceSheetViewModel();
                headerObligation.GroupName = "Kewajiban";

                foreach (var item in listObligationJournal)
                {
                    BalanceSheetDetailViewModel detail = new BalanceSheetDetailViewModel();
                    detail.Header = headerObligation;
                    JournalMaster currentJournal = allJournalMaster.Where(j => j.Code == item.Value).FirstOrDefault();
                    detail.Name = currentJournal.Name;

                    List<int> cachedItems = new List<int>();
                    foreach (var itemBalance in mappedResult.Where(m => !m.IsChecked))
                    {
                        if (base.IsCurrentJournalValid(itemBalance.Journal, item.Value))
                        {
                            decimal currentAmount = (itemBalance.LastDebit ?? 0) - (itemBalance.LastCredit ?? 0);
                            detail.Amount += Math.Abs(currentAmount);

                            cachedItems.Add(itemBalance.Id);
                        }
                    }

                    foreach (var iCache in cachedItems)
                    {
                        BalanceJournalDetailViewModel current = mappedResult.Where(m => m.Id == iCache).FirstOrDefault();
                        int iCacheIndex = mappedResult.IndexOf(current);
                        current.IsChecked = true;
                        mappedResult[iCacheIndex] = current;
                    }

                    formattedResult.Add(detail);
                }

                BalanceSheetViewModel headerFund = new BalanceSheetViewModel();
                headerFund.GroupName = "Modal";

                foreach (var item in listFundJournal)
                {
                    BalanceSheetDetailViewModel detail = new BalanceSheetDetailViewModel();
                    detail.Header = headerFund;
                    JournalMaster currentJournal = allJournalMaster.Where(j => j.Code == item.Value).FirstOrDefault();
                    detail.Name = currentJournal.Name;

                    List<int> cachedItems = new List<int>();
                    foreach (var itemBalance in mappedResult.Where(m => !m.IsChecked))
                    {
                        if (base.IsCurrentJournalValid(itemBalance.Journal, item.Value))
                        {
                            decimal currentAmount = (itemBalance.LastDebit ?? 0) - (itemBalance.LastCredit ?? 0);
                            detail.Amount += Math.Abs(currentAmount);

                            cachedItems.Add(itemBalance.Id);
                        }
                    }

                    foreach (var iCache in cachedItems)
                    {
                        BalanceJournalDetailViewModel current = mappedResult.Where(m => m.Id == iCache).FirstOrDefault();
                        int iCacheIndex = mappedResult.IndexOf(current);
                        current.IsChecked = true;
                        mappedResult[iCacheIndex] = current;
                    }

                    formattedResult.Add(detail);
                }
            }

            return formattedResult;
        }
        public List<BalanceSheetDetailViewModel> RetrieveProfitLoss(int headerId)
        {
            List<JournalMaster> allJournalMaster = _journalMasterRepository.GetAll().ToList();

            List<BalanceJournalDetailViewModel> mappedResult = base.RetrieveBalanceJournalDetailsByHeaderId(headerId);
            List<BalanceSheetDetailViewModel> formattedResult = new List<BalanceSheetDetailViewModel>();

            Reference catServiceJournal = _referenceRepository.GetMany(r => r.Code == DbConstant.REF_CAT_JOURNAL_SERVICE).FirstOrDefault();
            Reference catCostJournal = _referenceRepository.GetMany(r => r.Code == DbConstant.REF_CAT_JOURNAL_COST).FirstOrDefault();
            Reference catIncomeJournal = _referenceRepository.GetMany(r => r.Code == DbConstant.REF_CAT_JOURNAL_INCOME).FirstOrDefault();

            List<Reference> listServiceJournal = _referenceRepository.GetMany(r => r.ParentId == catServiceJournal.Id).ToList();
            List<Reference> listCostJournal = _referenceRepository.GetMany(r => r.ParentId == catCostJournal.Id).ToList();
            List<Reference> listIncomeJournal = _referenceRepository.GetMany(r => r.ParentId == catIncomeJournal.Id).ToList();

            BalanceSheetViewModel headerService = new BalanceSheetViewModel();
            headerService.GroupName = "1. Penjualan";

            foreach (var item in listServiceJournal)
            {
                BalanceSheetDetailViewModel detail = new BalanceSheetDetailViewModel();
                detail.Header = headerService;
                JournalMaster currentJournal = allJournalMaster.Where(j => j.Code == item.Value).FirstOrDefault();
                detail.Name = currentJournal.Name;

                List<int> cachedItems = new List<int>();
                foreach (var itemBalance in mappedResult.Where(m => !m.IsChecked))
                {
                    if (base.IsCurrentJournalValid(itemBalance.Journal, item.Value))
                    {
                        decimal currentAmount = (itemBalance.LastCredit ?? 0) - (itemBalance.LastDebit ?? 0);
                        detail.Amount += currentAmount;

                        cachedItems.Add(itemBalance.Id);
                    }
                }

                foreach (var iCache in cachedItems)
                {
                    BalanceJournalDetailViewModel current = mappedResult.Where(m => m.Id == iCache).FirstOrDefault();
                    int iCacheIndex = mappedResult.IndexOf(current);
                    current.IsChecked = true;
                    mappedResult[iCacheIndex] = current;
                }

                formattedResult.Add(detail);
            }

            BalanceSheetViewModel headerCost = new BalanceSheetViewModel();
            headerCost.GroupName = "2. Biaya Umum & Administrasi";

            foreach (var item in listCostJournal)
            {
                BalanceSheetDetailViewModel detail = new BalanceSheetDetailViewModel();
                detail.Header = headerCost;
                JournalMaster currentJournal = allJournalMaster.Where(j => j.Code == item.Value).FirstOrDefault();
                detail.Name = currentJournal.Name;

                List<int> cachedItems = new List<int>();
                foreach (var itemBalance in mappedResult.Where(m => !m.IsChecked))
                {
                    if (base.IsCurrentJournalValid(itemBalance.Journal, item.Value))
                    {
                        decimal currentAmount = (itemBalance.LastCredit ?? 0) - (itemBalance.LastDebit ?? 0);
                        detail.Amount += currentAmount;

                        cachedItems.Add(itemBalance.Id);
                    }
                }

                foreach (var iCache in cachedItems)
                {
                    BalanceJournalDetailViewModel current = mappedResult.Where(m => m.Id == iCache).FirstOrDefault();
                    int iCacheIndex = mappedResult.IndexOf(current);
                    current.IsChecked = true;
                    mappedResult[iCacheIndex] = current;
                }

                formattedResult.Add(detail);
            }

            BalanceSheetViewModel headerIncome = new BalanceSheetViewModel();
            headerIncome.GroupName = "3. Pendapatan";

            foreach (var item in listIncomeJournal)
            {
                BalanceSheetDetailViewModel detail = new BalanceSheetDetailViewModel();
                detail.Header = headerIncome;
                JournalMaster currentJournal = allJournalMaster.Where(j => j.Code == item.Value).FirstOrDefault();
                detail.Name = currentJournal.Name;

                List<int> cachedItems = new List<int>();
                foreach (var itemBalance in mappedResult.Where(m => !m.IsChecked))
                {
                    if (base.IsCurrentJournalValid(itemBalance.Journal, item.Value))
                    {
                        decimal currentAmount = (itemBalance.LastCredit ?? 0) - (itemBalance.LastDebit ?? 0);
                        detail.Amount += currentAmount;

                        cachedItems.Add(itemBalance.Id);
                    }
                }

                foreach (var iCache in cachedItems)
                {
                    BalanceJournalDetailViewModel current = mappedResult.Where(m => m.Id == iCache).FirstOrDefault();
                    int iCacheIndex = mappedResult.IndexOf(current);
                    current.IsChecked = true;
                    mappedResult[iCacheIndex] = current;
                }

                formattedResult.Add(detail);
            }

            return formattedResult;
        }