public ActionResult JournalEntry(long? HeaderId)
        {
            LoadAccountHeadList(0);
            LoadJournalBookList(0);
            //LoadAccountBookList(0);
            //var accJournalBookAccHeadId = db.GeneralSettings.FirstOrDefault().PurchaseJournalId;
            //var accBook = db.AccountBooks.Include(x => x.AccountBookTypeId).Where(x => x.AccountBookType.UniqueName.Equals("Journal", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();

            sdtoViewAccJournalEntry obj = new sdtoViewAccJournalEntry() { Date = DateTime.Now };
            obj.Details.Add(new sdtoViewAccJournalEntryDetails() { });

            if (HeaderId != null && HeaderId.Value > 0)
            {
                var header = db.JournalHeader.Find(HeaderId);
                if (header != null)
                {
                    obj = new sdtoViewAccJournalEntry()
                    {
                        Balance = header.VoucherTotal,
                        Book = new sdtoAccountBook() { AccountBookId = header.BookId },
                        Date = header.TransDate.Value,
                        HeaderId = HeaderId.Value,
                        PreviousVoucherTotal = header.VoucherTotal,
                        Voucher = header.VoucherNo
                    };

                    var headerSubList = db.JournalDetails.Where(x => x.IsDeleted == false && x.JournalId == obj.HeaderId);
                    if (headerSubList != null)
                    {
                        foreach (sdtoJournalDetails dtl in headerSubList)
                        {
                            obj.Details.Add(new sdtoViewAccJournalEntryDetails()
                            {
                                AccountHeadId = dtl.AccountId,
                                DebitAmount = -1 * dtl.DrAmount,
                                CreditAmount = -1 * dtl.CrAmount,
                                Narration = dtl.Narration
                            });
                        }
                    }
                }
            }

            return View(obj);
        }
        public ActionResult JournalEntry(sdtoViewAccJournalEntry objCashReceiptPayment)
        {
            if (objCashReceiptPayment.SourceClick == 0)
                objCashReceiptPayment.Details.Add(new sdtoViewAccJournalEntryDetails());
            else
            {
                if (ModelState.IsValid)
                {
                    var cr = objCashReceiptPayment.Details.Sum(x => x.CreditAmount);
                    var dr = objCashReceiptPayment.Details.Sum(x => x.CreditAmount);

                    if (dr + (-1 * cr) > 0)
                        ModelState.AddModelError("", "The voucher credit total and debit total does not balance.");
                    else
                    {

                        bfTransaction objTransaction = new bfTransaction(db);
                        if (objCashReceiptPayment.HeaderId > 0)
                            objTransaction.CancelJournalAccountHeader(objCashReceiptPayment.HeaderId);

                        objTransaction.AddJournalEntry(objCashReceiptPayment);
                        return RedirectToAction("ListJournalEntry");
                    }
                }
            }
            LoadAccountHeadList(0);
            LoadJournalBookList(objCashReceiptPayment.Book != null ? objCashReceiptPayment.Book.AccountBookId : 0);

            return View(objCashReceiptPayment);
        }
        public bool AddJournalEntry(sdtoViewAccJournalEntry objJournalEntry)
        {
            sdtoUser user = UtilityHelper.UserSession.GetSession(UtilityHelper.UserSession.LoggedInUser) as sdtoUser;
            var accBankBook = AppDb.AccountBooks.Where(x => x.AccountBookId == objJournalEntry.Book.AccountBookId).FirstOrDefault();
            if (accBankBook != null)
            {
                sdtoJournalHeader hdrCashReceiptPayment = new sdtoJournalHeader()
                {
                    BookId = accBankBook.AccountBookId,
                    Cancelled = 0,
                    CreatedOn = DateTime.Now,
                    CreatedBy = user.UserID,
                    FinancialYearId = 1,
                    FromModule = 0,
                    IsDeleted = false,
                    TransDate = objJournalEntry.Date,
                    VoucherNo = objJournalEntry.Voucher,
                    VoucherTotal = Convert.ToDecimal((-1 * objJournalEntry.Details.Sum(x => x.CreditAmount)) + objJournalEntry.Details.Sum(x => x.DebitAmount))
                };

                AppDb.JournalHeader.Add(hdrCashReceiptPayment);
                AppDb.SaveChanges();

                hdrCashReceiptPayment.VoucherNo = accBankBook.ReceiptVoucherPrefix + hdrCashReceiptPayment.Id + accBankBook.ReceiptVoucherSuffix;
                AppDb.Entry(hdrCashReceiptPayment).State = EntityState.Modified;
                AppDb.SaveChanges();

                foreach (sdtoViewAccJournalEntryDetails dtl in objJournalEntry.Details)
                {
                    sdtoJournalDetails bankDepositDtlCr = new sdtoJournalDetails()
                    {
                        JournalId = hdrCashReceiptPayment.Id,
                        AccountId = dtl.AccountHeadId,
                        Narration = dtl.Narration,
                        CrAmount = dtl.CreditAmount,
                        DrAmount = dtl.DebitAmount,
                        CreatedBy = user.UserID,
                        CreatedOn = DateTime.Now,
                        IsDeleted = false
                    };

                    UpdateClosingBalance(bankDepositDtlCr.AccountId, CurrentUser.UserSession.FinancialYearId.Value, Convert.ToDecimal(bankDepositDtlCr.CrAmount + bankDepositDtlCr.DrAmount));
                    UpdateDayBookBalance(bankDepositDtlCr.AccountId, CurrentUser.UserSession.FinancialYearId.Value, objJournalEntry.Date, Convert.ToDecimal(bankDepositDtlCr.CrAmount + bankDepositDtlCr.DrAmount), TransactionType.JournalEntry);
                    AppDb.JournalDetails.Add(bankDepositDtlCr);
                }

                AppDb.SaveChanges();

                return true;
            }

            return false;
        }