private void btnCancelled_Click(object sender, RoutedEventArgs e) { if (!CanModify) { MessageWindow.AlertRecordIsLocked(); return; } if (MessageWindow.ConfirmCancelVoucher() != MessageBoxResult.Yes) { return; } JournalVoucher.DeleteAll(_voucherNumber); var cancelledJournalVoucher = new JournalVoucher { MemberCode = "CANCEL", MemberName = "CANCELLED", AccountCode = "CANCEL", AccountTitle = "CANCELLED", Debit = 0m, Credit = 0m, VoucherDate = _voucherDate, VoucherNo = _voucherNumber, VoucherType = _voucherType }; cancelledJournalVoucher.Create(); Find(_voucherNumber); }
private Result PostCashOnHand() { // post cash on hand credit side var member = Nfmb.FindByCode(_accountDetail.MemberCode); var accountCode = GlobalSettings.CodeOfCashOnHand; if (string.IsNullOrWhiteSpace(accountCode)) { return(new Result(false, GenerateCodeOfAccountNotSetMessage("Cash on Hand"))); } var account = Account.FindByCode(accountCode); var amount = _accountDetail.EndingBalance + _accountDetail.TimeDepositDetails.CalculateInterestEarned(_voucherDocument.VoucherDate) - _accountDetail.TimeDepositDetails.CalculateServiceFee(_voucherDocument.VoucherDate); var cv = new JournalVoucher { MemberCode = member.MemberCode, MemberName = member.MemberName, AccountCode = account.AccountCode, AccountTitle = account.AccountTitle, Credit = amount, VoucherDate = _voucherDocument.VoucherDate, VoucherNo = _voucherDocument.VoucherNo, Explanation = "Withdrawal of Time Deposit", AmountInWords = Converter.AmountToWords(amount), }; var postResult = cv.Create(); if (!postResult.Success) { Rollback(); } return(postResult); }
private Result PostServiceFee() { // post service fee credit side var member = Nfmb.FindByCode(_accountDetail.MemberCode); var accountCode = GlobalSettings.CodeOfServiceFee; if (string.IsNullOrWhiteSpace(accountCode)) { return(new Result(false, GenerateCodeOfAccountNotSetMessage("Service Fee"))); } var account = Account.FindByCode(accountCode); var jv = new JournalVoucher { MemberCode = member.MemberCode, MemberName = member.MemberName, AccountCode = account.AccountCode, AccountTitle = account.AccountTitle, Credit = _accountDetail.TimeDepositDetails.CalculateServiceFee(_voucherDocument.VoucherDate), VoucherDate = _voucherDocument.VoucherDate, VoucherNo = _voucherDocument.VoucherNo, }; var postResult = jv.Create(); if (!postResult.Success) { Rollback(); } return(postResult); }
public void Process() { var transactionDate = MainController.LoggedUser.TransactionDate; var previousYear = transactionDate.Year - 1; var montlyEndBalances = GetMontlyEndBalance(previousYear, ShareCapitalCode); if (!montlyEndBalances.Any()) { MessageWindow.ShowAlertMessage(string.Format("No transactions were found having account {0}.", _shareCapitalAccount.AccountTitle)); return; } // total monthly average var filteredMonthlyEndBalances = (from meb in montlyEndBalances where meb.Average >= _maintainingBalance select meb).ToList(); var totalMonthlyAverage = filteredMonthlyEndBalances.Sum(item => item.Average); // rate var rate = AmountAllocated / totalMonthlyAverage; foreach (var item in filteredMonthlyEndBalances) { if (item.Average <= 0) { continue; } var jvCredit = new JournalVoucher { MemberCode = item.MemberCode, MemberName = item.MemberName, AccountCode = _shareCapitalAccount.AccountCode, AccountTitle = _shareCapitalAccount.AccountTitle, Credit = item.Average * rate, VoucherDate = transactionDate, VoucherNo = JournalVoucherNumber, IsPosted = true }; jvCredit.Create(); } var jvDebit = new JournalVoucher { MemberCode = _cooperative.MemberCode, MemberName = _cooperative.MemberName, AccountCode = _interestOnShareCapitalAccount.AccountCode, AccountTitle = _interestOnShareCapitalAccount.AccountTitle, Debit = _amountAllocated, VoucherDate = transactionDate, VoucherNo = JournalVoucherNumber, IsPosted = true, Explanation = "Posting Dividend Distribution" }; jvDebit.Create(); }
private Result PostInterestExpense() { // post interest expense debit side var interestEarned = _accountDetail.TimeDepositDetails.CalculateInterestEarned(_voucherDocument.VoucherDate); if (interestEarned == 0) { return(new Result(true, "No interest earned.")); } var member = Nfmb.FindByCode(_accountDetail.MemberCode); var accountCode = GlobalSettings.CodeOfInterestExpenseOnTimeDeposit; if (string.IsNullOrWhiteSpace(accountCode)) { return(new Result(false, GenerateCodeOfAccountNotSetMessage("Interest Expense On Time Deposit"))); } var account = Account.FindByCode(accountCode); var jv = new JournalVoucher { MemberCode = member.MemberCode, MemberName = member.MemberName, AccountCode = account.AccountCode, AccountTitle = account.AccountTitle, Debit = interestEarned, VoucherDate = _voucherDocument.VoucherDate, VoucherNo = _voucherDocument.VoucherNo, }; var postResult = jv.Create(); if (!postResult.Success) { Rollback(); } return(postResult); }
private Result PostTimeDepositInterestEarned() { // post time desposit interest earned credit side var member = Nfmb.FindByCode(_accountDetail.MemberCode); var account = Account.FindByCode(_accountDetail.AccountCode); var previousDetail = _accountDetail.TimeDepositDetails; var asOf = GlobalSettings.DateOfOpenTransaction; var interestEarned = previousDetail.CalculateInterestEarned(asOf) - previousDetail.CalculateServiceFee(asOf); var tdDetails = SetNewTimeDepositDetails(); if (tdDetails == null) { return(new Result(false, "Time deposit details not set.")); } var jv = new JournalVoucher { MemberCode = member.MemberCode, MemberName = member.MemberName, AccountCode = account.AccountCode, AccountTitle = account.AccountTitle, Credit = interestEarned, VoucherDate = _voucherDocument.VoucherDate, VoucherNo = _voucherDocument.VoucherNo, TimeDepositDetails = tdDetails, }; var postResult = jv.Create(); if (!postResult.Success) { Rollback(); } return(postResult); }
private void btnPost_Click(object sender, EventArgs e) { var collection = JournalVoucher.WhereDocumentNumberIs(_journalVoucher.VoucherNo); if (collection.Count > 0) { MessageWindow.ShowAlertMessage("JV No. already in use."); return; } try { btnPost.Content = "Posting, please wait..."; JournalVoucher jv; foreach (var item in _viewModel.Collection) { jv = new JournalVoucher(); jv.MemberCode = item.MemberCode; jv.MemberName = item.MemberName; jv.AccountCode = item.AccountCode; jv.AccountTitle = item.AccountTitle; jv.Credit = item.Credit; jv.VoucherDate = _journalVoucher.VoucherDate; jv.VoucherNo = _journalVoucher.VoucherNo; jv.VoucherType = VoucherTypes.JV; jv.IsPosted = true; jv.Create(); } // closing jv = new JournalVoucher(); var coop = Nfmb.FindByCode(GlobalSettings.CodeOfCompany); jv.MemberCode = coop.MemberCode; jv.MemberName = coop.MemberName; var intExpense = _viewModel.InterestExpenseOnSavingsDepositAccount; jv.AccountCode = intExpense.AccountCode; jv.AccountTitle = intExpense.AccountTitle; jv.Debit = _viewModel.Collection.Sum(voucher => voucher.Credit); jv.VoucherDate = _journalVoucher.VoucherDate; jv.VoucherNo = _journalVoucher.VoucherNo; jv.VoucherType = VoucherTypes.JV; jv.Explanation = "Savings Deposit interest posting"; jv.IsPosted = true; jv.Create(); #region --- Voucher Log --- var voucherLog = new VoucherLog(); voucherLog.Find("JV", _journalVoucher.VoucherNo); voucherLog.Date = _journalVoucher.VoucherDate; voucherLog.Initials = MainController.LoggedUser.Initials; voucherLog.Save(); #endregion btnPost.Content = string.Format("Posting Complete"); MessageWindow.ShowNotifyMessage("Interest on Savings Deposit succesfully posted!"); DialogResult = true; Close(); } catch (Exception exception) { MessageWindow.ShowAlertMessage(exception.Message); } }
private Result PostToVoucher() { var postingDetails = new LoanPostingDetails { VoucherType = VoucherTypes.CV, VoucherDate = GlobalSettings.DateOfOpenTransaction }; postingDetails.VoucherNumber = Voucher.LastDocumentNo(postingDetails.VoucherType) + 1; postingDetails.ReleaseNumber = ModelController.Releases.MaxReleaseNumber() + 1; postingDetails.ReleaseDate = postingDetails.VoucherDate; // 1. ask user to enter voucher information var postingWindow = new LoanPostingWindow(postingDetails); if (postingWindow.ShowDialog() != true) { return(new Result(false, "Posting was cancelled by user.")); } // 1.1 Must be open transaction if (postingDetails.VoucherDate != GlobalSettings.DateOfOpenTransaction) { return(new Result(false, "Voucher date is locked!")); } if (postingDetails.VoucherDate != MainController.LoggedUser.TransactionDate) { return(new Result(false, "Transaction Date is not valid or not set!")); } // 2. inform user if voucher information already exist, ask if to overwrite if (postingDetails.VoucherType == VoucherTypes.CV) { ObservableCollection <CashVoucher> cvEntries = CashVoucher.WhereDocumentNumberIs(postingDetails.VoucherNumber); if (cvEntries.Count > 0) { return(new Result(false, string.Format("{0} #{1} already exist!", postingDetails.VoucherType, postingDetails.VoucherNumber))); } } if (postingDetails.VoucherType == VoucherTypes.JV) { ObservableCollection <JournalVoucher> jvEntries = JournalVoucher.WhereDocumentNumberIs(postingDetails.VoucherNumber); if (jvEntries.Count > 0) { return(new Result(false, string.Format("{0} #{1} already exist!", postingDetails.VoucherType, postingDetails.VoucherNumber))); } } // 3. post transaction details _loanDetails.ReleaseNo = postingDetails.ReleaseNumber; _loanDetails.DateReleased = postingDetails.ReleaseDate; //TODO: Loan Application Information //loanDetails.ThisMonth //loanDetails.DateApplied = _loanDetail.DateGranted; //loanDetails.DateApproved //loanDetails.DateCancelled; //loanDetails.DateReleased // net proceeds var netProceeds = new ComputationDetail { AccountCode = _loanComputation.NetProceedsCode, AccountTitle = _loanComputation.NetProceedsTitle, Amount = _loanComputation.NetProceedsAmount }; if (postingDetails.VoucherType == VoucherTypes.JV) { #region --- Add entry for Cash On Hand --- var net = new JournalVoucher { MemberCode = _loanDetails.MemberCode, MemberName = _loanDetails.MemberName, AccountCode = netProceeds.AccountCode, AccountTitle = netProceeds.AccountTitle, Credit = netProceeds.Amount, VoucherDate = postingDetails.VoucherDate, VoucherNo = postingDetails.VoucherNumber, }; net.Amount = net.Credit; net.AmountInWords = Converter.AmountToWords(net.Amount); Result postResult = net.Create(); if (!postResult.Success) { JournalVoucher.DeleteAll(postingDetails.VoucherNumber); return(postResult); } #endregion #region --- Add entries for Charges --- foreach (ComputationDetail computationDetail in _loanComputation.Charges) { if (string.IsNullOrEmpty(computationDetail.AccountCode) || computationDetail.Amount == 0) { continue; } var charges = new JournalVoucher { MemberCode = _loanDetails.MemberCode, MemberName = _loanDetails.MemberName, AccountCode = computationDetail.AccountCode, AccountTitle = computationDetail.AccountTitle, Credit = computationDetail.Amount, VoucherDate = postingDetails.VoucherDate, VoucherNo = postingDetails.VoucherNumber }; postResult = charges.Create(); if (postResult.Success) { continue; } JournalVoucher.DeleteAll(postingDetails.VoucherNumber); return(postResult); } #endregion #region --- Add entries for Deductions --- foreach (ComputationDetail computationDetail in _loanComputation.Deductions) { if (string.IsNullOrEmpty(computationDetail.AccountCode) || computationDetail.Amount == 0) { continue; } var deductions = new JournalVoucher { MemberCode = _loanDetails.MemberCode, MemberName = _loanDetails.MemberName, AccountCode = computationDetail.AccountCode, AccountTitle = computationDetail.AccountTitle, Credit = computationDetail.Amount, VoucherDate = postingDetails.VoucherDate, VoucherNo = postingDetails.VoucherNumber }; postResult = deductions.Create(); if (postResult.Success) { continue; } JournalVoucher.DeleteAll(postingDetails.VoucherNumber); return(postResult); } #endregion #region --- Add entry for Unearned Income --- Account ui = Account.FindByCode(GlobalSettings.CodeOfUnearnedIncome); var unearnedIncome = new JournalVoucher { MemberCode = _loanDetails.MemberCode, MemberName = _loanDetails.MemberName, AccountCode = ui.AccountCode, AccountTitle = ui.AccountTitle, Credit = _loanAmortizationHeader.PaymentSchedules.Sum(sched => sched.Interest), VoucherDate = postingDetails.VoucherDate, VoucherNo = postingDetails.VoucherNumber }; postResult = unearnedIncome.Create(); if (!postResult.Success) { JournalVoucher.DeleteAll(postingDetails.VoucherNumber); return(postResult); } #endregion #region --- Add entry for Capital Build-Up --- Account cbu = Account.FindByCode(GlobalSettings.CodeOfCapitalBuildUp); var capitalBuildUp = new JournalVoucher { MemberCode = _loanDetails.MemberCode, MemberName = _loanDetails.MemberName, AccountCode = cbu.AccountCode, AccountTitle = cbu.AccountTitle, Credit = _loanAmortizationHeader.PaymentSchedules.Sum(sched => sched.CapitalBuildUp), VoucherDate = postingDetails.VoucherDate, VoucherNo = postingDetails.VoucherNumber }; postResult = capitalBuildUp.Create(); if (!postResult.Success) { JournalVoucher.DeleteAll(postingDetails.VoucherNumber); return(postResult); } #endregion #region --- Finally add entry for the loan applied --- var loanVoucherEntry = new JournalVoucher { MemberCode = _loanDetails.MemberCode, MemberName = _loanDetails.MemberName, AccountCode = _loanDetails.AccountCode, AccountTitle = _loanDetails.AccountTitle, Debit = _loanDetails.LoanAmount + unearnedIncome.Credit + capitalBuildUp.Credit, VoucherDate = postingDetails.VoucherDate, VoucherNo = postingDetails.VoucherNumber, LoanDetails = _loanDetails, Explanation = _loanDetails.GenerateExplanation() }; postResult = loanVoucherEntry.Create(); if (!postResult.Success) { JournalVoucher.DeleteAll(postingDetails.VoucherNumber); return(postResult); } #endregion } else { #region --- Add entry for Cash On Hand --- var net = new CashVoucher { MemberCode = _loanDetails.MemberCode, MemberName = _loanDetails.MemberName, AccountCode = netProceeds.AccountCode, AccountTitle = netProceeds.AccountTitle, Credit = netProceeds.Amount, VoucherDate = postingDetails.VoucherDate, VoucherNo = postingDetails.VoucherNumber, }; net.Amount = net.Credit; net.AmountInWords = Converter.AmountToWords(net.Amount); Result postResult = net.Create(); if (!postResult.Success) { CashVoucher.DeleteAll(postingDetails.VoucherNumber); return(postResult); } #endregion #region --- Add entries for Charges --- foreach (ComputationDetail computationDetail in _loanComputation.Charges) { if (string.IsNullOrEmpty(computationDetail.AccountCode) || computationDetail.Amount == 0) { continue; } var charges = new CashVoucher { MemberCode = _loanDetails.MemberCode, MemberName = _loanDetails.MemberName, AccountCode = computationDetail.AccountCode, AccountTitle = computationDetail.AccountTitle, Credit = computationDetail.Amount, VoucherDate = postingDetails.VoucherDate, VoucherNo = postingDetails.VoucherNumber }; postResult = charges.Create(); if (postResult.Success) { continue; } CashVoucher.DeleteAll(postingDetails.VoucherNumber); return(postResult); } #endregion #region --- Add entries for Deductions --- foreach (ComputationDetail computationDetail in _loanComputation.Deductions) { if (string.IsNullOrEmpty(computationDetail.AccountCode) || computationDetail.Amount == 0) { continue; } var deductions = new CashVoucher { MemberCode = _loanDetails.MemberCode, MemberName = _loanDetails.MemberName, AccountCode = computationDetail.AccountCode, AccountTitle = computationDetail.AccountTitle, Credit = computationDetail.Amount, VoucherDate = postingDetails.VoucherDate, VoucherNo = postingDetails.VoucherNumber }; postResult = deductions.Create(); if (postResult.Success) { continue; } CashVoucher.DeleteAll(postingDetails.VoucherNumber); return(postResult); } #endregion #region --- Add entry for Unearned Income --- Account ui = Account.FindByCode(GlobalSettings.CodeOfUnearnedIncome); var unearnedIncome = new CashVoucher { MemberCode = _loanDetails.MemberCode, MemberName = _loanDetails.MemberName, AccountCode = ui.AccountCode, AccountTitle = ui.AccountTitle, Credit = _loanAmortizationHeader.PaymentSchedules.Sum(sched => sched.Interest), VoucherDate = postingDetails.VoucherDate, VoucherNo = postingDetails.VoucherNumber }; postResult = unearnedIncome.Create(); if (!postResult.Success) { CashVoucher.DeleteAll(postingDetails.VoucherNumber); return(postResult); } #endregion #region --- Add entry for Capital Build-Up --- Account cbu = Account.FindByCode(GlobalSettings.CodeOfCapitalBuildUp); var capitalBuildUp = new CashVoucher { MemberCode = _loanDetails.MemberCode, MemberName = _loanDetails.MemberName, AccountCode = cbu.AccountCode, AccountTitle = cbu.AccountTitle, Credit = _loanAmortizationHeader.PaymentSchedules.Sum(sched => sched.CapitalBuildUp), VoucherDate = postingDetails.VoucherDate, VoucherNo = postingDetails.VoucherNumber }; postResult = capitalBuildUp.Create(); if (!postResult.Success) { CashVoucher.DeleteAll(postingDetails.VoucherNumber); return(postResult); } #endregion #region --- Finally add entry for the loan applied --- var loanVoucherEntry = new CashVoucher { MemberCode = _loanDetails.MemberCode, MemberName = _loanDetails.MemberName, AccountCode = _loanDetails.AccountCode, AccountTitle = _loanDetails.AccountTitle, Debit = _loanDetails.LoanAmount + unearnedIncome.Credit + capitalBuildUp.Credit, VoucherDate = postingDetails.VoucherDate, VoucherNo = postingDetails.VoucherNumber, LoanDetails = _loanDetails, Explanation = _loanDetails.GenerateExplanation() }; postResult = loanVoucherEntry.Create(); if (!postResult.Success) { CashVoucher.DeleteAll(postingDetails.VoucherNumber); return(postResult); } #endregion } #region --- Voucher Log --- var voucherLog = new VoucherLog(); voucherLog.Find(postingDetails.VoucherType.ToString(), postingDetails.VoucherNumber); voucherLog.Date = postingDetails.VoucherDate; voucherLog.Initials = MainController.LoggedUser.Initials; voucherLog.Save(); #endregion return(new Result(true, string.Format("A loan has been created! Please check {0} #{1}.", postingDetails.VoucherType, postingDetails.VoucherNumber))); }
public void Process() { var transactionDate = MainController.LoggedUser.TransactionDate; var previousYear = transactionDate.Year - 1; var interestOnLoans = GetMontlyEndBalance(previousYear, InterestOnLoanCode); var interestRebates = GetMontlyEndBalance(previousYear, InterestRebateCode); // loop each interest on loans, subtract any interest rebates per member var endBalances = new List <Tuple <string, decimal> >(); foreach (var item in interestOnLoans) { var realBalance = item.December - item.Beginning; if (realBalance > 0) { var rebate = interestRebates.SingleOrDefault(t => t.MemberCode.Trim() == item.MemberCode.Trim()); var totalRebate = 0m; if (rebate != null) { totalRebate = rebate.December - rebate.Beginning; } var endBalance = realBalance - totalRebate; if (endBalance > 0) { endBalances.Add(new Tuple <string, decimal>(item.MemberCode, endBalance)); } } } var totalInterestFromLoans = endBalances.Sum(t => t.Item2); var rate = _amountAllocated / totalInterestFromLoans; foreach (var eb in endBalances) { var item = interestOnLoans.SingleOrDefault(t => t.MemberCode.Trim() == eb.Item1.Trim()); if (item == null) { Console.WriteLine(@"This must not happen!!!"); continue; } var jvCredit = new JournalVoucher { MemberCode = item.MemberCode, MemberName = item.MemberName, AccountCode = _shareCapitalAccount.AccountCode, AccountTitle = _shareCapitalAccount.AccountTitle, Credit = eb.Item2 * rate, VoucherDate = transactionDate, VoucherNo = JournalVoucherNumber, IsPosted = true }; jvCredit.Create(); } var jvDebit = new JournalVoucher { MemberCode = _cooperative.MemberCode, MemberName = _cooperative.MemberName, AccountCode = _patronageRefundAccount.AccountCode, AccountTitle = _patronageRefundAccount.AccountTitle, Debit = _amountAllocated, VoucherDate = transactionDate, VoucherNo = JournalVoucherNumber, IsPosted = true, Explanation = "Posting Patronage Refund" }; jvDebit.Create(); }