private void PayInstallmentsButton_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            ViewModels.InstallmentViewModel oViewModel = InstallmentPerLoanGridControl.SelectedItem as ViewModels.InstallmentViewModel;

            if (oViewModel != null)
            {
                DAL.UnitOfWork oUnitOfWork = null;

                try
                {
                    oUnitOfWork = new DAL.UnitOfWork();

                    Models.Installment oInstallment = oUnitOfWork.InstallmentRepository
                                                      .GetById(oViewModel.Id);

                    var varList = oUnitOfWork.InstallmentRepository
                                  .Get()
                                  .Where(current => current.LoanId == oInstallment.LoanId)
                                  .Where(current => current.IsPayed == false)
                                  .Where(current => current.InstallmentDate < oInstallment.InstallmentDate)
                                  .OrderBy(current => current.InstallmentDate)
                                  .ToList();

                    if (varList.Count != 0)
                    {
                        Infrastructure.MessageBox.Show
                        (
                            caption: Infrastructure.MessageBox.Caption.Error,
                            text: string.Format("ابتدا بایست قسط تاریخ {0} پرداخت شود.", varList.Select(current => current.InstallmentDate).FirstOrDefault().ToPersianDate())
                        );

                        return;
                    }

                    oInstallment.IsPayed     = true;
                    oInstallment.PaymentDate = System.DateTime.Now;

                    oUnitOfWork.InstallmentRepository.Update(oInstallment);

                    Models.Member oMember = oUnitOfWork.MemberRepository
                                            .GetById(oInstallment.Loan.Member.Id);

                    oMember.Balance -= oInstallment.PaymentAmount;

                    oUnitOfWork.MemberRepository.Update(oMember);

                    Models.Fund oFund = oUnitOfWork.FundRepository
                                        .GetById(Utility.CurrentFund.Id);

                    oFund.Balance += oInstallment.PaymentAmount;

                    oUnitOfWork.FundRepository.Update(oFund);

                    Utility.CurrentFund = oFund;

                    Models.Transaction oTransaction = new Models.Transaction();

                    oTransaction.Amount          = oInstallment.PaymentAmount;
                    oTransaction.Balance         = oFund.Balance;
                    oTransaction.Date            = System.DateTime.Now;
                    oTransaction.Description     = string.Format("پرداخت قسط به مبلغ {0} ریال از {1}", oInstallment.PaymentAmount, oInstallment.Loan.Member.FullName);
                    oTransaction.TransactionType = Models.TransactionType.Installment;
                    oTransaction.MemberId        = oInstallment.Loan.Member.Id;
                    oTransaction.FundId          = oFund.Id;
                    oTransaction.InstallmentId   = oInstallment.Id;

                    oUnitOfWork.TransactionRepository.Insert(oTransaction);

                    Models.Reminder oReminder = oUnitOfWork.RemainderRepository
                                                .Get()
                                                .Where(current => current.InstallmentId == oInstallment.Id)
                                                .FirstOrDefault();

                    if (oReminder != null)
                    {
                        oUnitOfWork.RemainderRepository.Delete(oReminder);
                    }

                    oUnitOfWork.Save();

                    Models.Loan oLoan = oUnitOfWork.LoanRepository
                                        .Get()
                                        .Where(current => current.Id == oInstallment.LoanId)
                                        .Where(current => current.Installments.All(installment => installment.IsPayed == true))
                                        .FirstOrDefault();

                    if (oLoan != null)
                    {
                        oLoan.IsPayed  = true;
                        oLoan.IsActive = false;

                        oUnitOfWork.LoanRepository.Update(oLoan);

                        oUnitOfWork.Save();
                    }

                    Utility.MainWindow.RefreshUserInterface();
                    (Utility.MainWindow.SthPanel.Children[0] as MainPanelContentUserControl).MiniPersianSchedulerReminder.RefreshMonth();
                    (Utility.MainWindow.SthPanel.Children[0] as MainPanelContentUserControl).RefreshSchedulerListBox();
                }
                catch (System.Exception ex)
                {
                    Infrastructure.MessageBox.Show(ex.Message);;
                }
                finally
                {
                    if (oUnitOfWork != null)
                    {
                        oUnitOfWork.Dispose();
                        oUnitOfWork = null;
                    }
                }

                RefreshInstallmentGridControl();
            }
        }
Exemple #2
0
        private void OBackgroundWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            DAL.UnitOfWork oUnitOfWork = null;

            oUnitOfWork = new DAL.UnitOfWork();

            Models.Member oMember = oUnitOfWork.MemberRepository
                .GetById(Utility.CurrentMember.Id);

            Models.Fund oFund = oUnitOfWork.FundRepository
                .GetById(Utility.CurrentFund.Id);

            Models.Loan oLoan = new Models.Loan();

            this.Dispatcher.Invoke(() =>
            {
                oLoan.LoanAmount = LoanAmountTextBox.Text.StringToMoney();
                oLoan.IsActive = true;
                oLoan.IsPayed = false;
                oLoan.MemberId = Utility.CurrentMember.Id;
                oLoan.InstallmentsCount = System.Convert.ToInt32(InstallmentsCountTextBox.Text.Trim());
                oLoan.RefundAmount = LoanAmountTextBox.Text.StringToMoney();
                oLoan.StartDate = LoanDateTimeDatePicker.SelectedDateTime;
                oLoan.EndDate = LoanDateTimeDatePicker.SelectedDateTime;
                oLoan.Description = DescriptionTextBox.Text.Trim();
            });

            oUnitOfWork.LoanRepository.Insert(oLoan);

            oFund.Balance -= oLoan.LoanAmount;

            oUnitOfWork.FundRepository.Update(oFund);

            oUnitOfWork.Save();

            Utility.CurrentFund = oFund;

            Models.Transaction oTransaction = new Models.Transaction();

            oTransaction.Amount = oLoan.LoanAmount;
            oTransaction.Balance = oFund.Balance;
            oTransaction.Date = System.DateTime.Now;
            oTransaction.Description = string.Format("پرداخت وام به مبلغ {0} ریال به {1}", oLoan.LoanAmount, Utility.CurrentMember.FullName);
            oTransaction.FundId = Utility.CurrentFund.Id;
            oTransaction.TransactionType = Models.TransactionType.Loan;
            oTransaction.MemberId = Utility.CurrentMember.Id;
            oTransaction.LoanId = oLoan.Id;

            oUnitOfWork.TransactionRepository.Insert(oTransaction);

            int percent = 0;

            this.Dispatcher.Invoke(() =>
            {
                percent = (CalculatePercentCheckBox.IsChecked == true) ? Utility.CurrentFund.Percent : 0;
            });

            ViewModels.CreateLoanViewModel oCreateLoanViewModel = CalculateLoanParameters(oLoan.LoanAmount, oLoan.InstallmentsCount, percent);

            for (int index = 0; index < oLoan.InstallmentsCount; index++)
            {
                int progressBarPercent = System.Convert.ToInt32(((double)(index + 1) / oLoan.InstallmentsCount) * 100);

                Models.Installment oInstallment = new Models.Installment();

                oInstallment.PaymentAmount = oCreateLoanViewModel.Installments.ElementAt(index);
                oInstallment.IsPayed = false;
                oInstallment.InstallmentDate = oLoan.StartDate.AddMonths(index + 1);
                oInstallment.PaymentDate = null;
                oInstallment.LoanId = oLoan.Id;

                oUnitOfWork.InstallmentRepository.Insert(oInstallment);

                Models.Reminder oReminder = new Models.Reminder();

                FarsiLibrary.Utils.PersianDate oPersianDate = new FarsiLibrary.Utils.PersianDate(oInstallment.InstallmentDate);

                oReminder.DateTime = oInstallment.InstallmentDate;
                oReminder.PersianDate.Year = oPersianDate.Year;
                oReminder.PersianDate.Month = oPersianDate.Month;
                oReminder.PersianDate.Day = oPersianDate.Day;
                oReminder.EventType = Models.Event.Installment;
                oReminder.Description = string.Format("قسط {0} وام {1} به مبلغ {2}",
                    FarsiLibrary.Utils.ToWords.ToString(index + 1), Utility.CurrentMember.FullName, oInstallment.PaymentAmount.ToRialStringFormat());
                oReminder.InstallmentId = oInstallment.Id;
                oReminder.FundId = Utility.CurrentFund.Id;

                oUnitOfWork.RemainderRepository.Insert(oReminder);

                if (index == oLoan.InstallmentsCount - 1)
                {
                    oLoan.EndDate = oInstallment.InstallmentDate;
                    oLoan.RefundAmount = oCreateLoanViewModel.RefundAmount;
                    oUnitOfWork.LoanRepository.Update(oLoan);
                }

                oUnitOfWork.Save();

                (sender as System.ComponentModel.BackgroundWorker).ReportProgress(progressBarPercent);

            }

            Utility.CurrentLoan = oLoan;

            oMember.Balance += oLoan.LoanAmount;

            oUnitOfWork.MemberRepository.Update(oMember);

            oUnitOfWork.Save();
        }