public async Task <ApiResponse> AddEditTransactionList([FromBody] AddEditTransactionListCommand model)
        {
            var userId = User.FindFirst(ClaimTypes.NameIdentifier).Value;

            model.ModifiedById = userId;
            model.ModifiedDate = DateTime.UtcNow;

            return(await _mediator.Send(model));
        }
        public async Task <ApiResponse> Handle(ExchangeGainLossVoucherDetailsCommand model, CancellationToken cancellationToken)
        {
            ApiResponse response = new ApiResponse();

            try
            {
                #region "Generate Voucher"
                AddVoucherDetailCommand voucherModel = new AddVoucherDetailCommand
                {
                    VoucherNo                 = model.VoucherNo,
                    CurrencyId                = model.CurrencyId,
                    Description               = model.Description,
                    JournalCode               = model.JournalId,
                    VoucherTypeId             = model.VoucherType,
                    OfficeId                  = model.OfficeId,
                    ProjectId                 = model.ProjectId,
                    BudgetLineId              = model.BudgetLineId,
                    IsExchangeGainLossVoucher = true,
                    TimezoneOffset            = model.TimezoneOffset,
                };

                var responseVoucher = await _iAccountingServices.AddVoucherDetail(voucherModel);

                #endregion

                #region "Generate Transaction"

                if (responseVoucher != null)
                {
                    List <VoucherTransactionsModel> transactions = new List <VoucherTransactionsModel>();

                    // Credit
                    transactions.Add(new VoucherTransactionsModel
                    {
                        TransactionId = 0,
                        VoucherNo     = responseVoucher.VoucherNo,
                        AccountNo     = model.CreditAccount,
                        Debit         = 0,
                        Credit        = Math.Abs(model.Amount),
                        Description   = "Gain-Loss-Voucher-Credit",
                        IsDeleted     = false
                    });

                    // Debit
                    transactions.Add(new VoucherTransactionsModel
                    {
                        TransactionId = 0,
                        VoucherNo     = responseVoucher.VoucherNo,
                        AccountNo     = model.DebitAccount,
                        Debit         = Math.Abs(model.Amount),
                        Credit        = 0,
                        Description   = "Gain-Loss-Voucher-Debit",
                        IsDeleted     = false
                    });

                    AddEditTransactionListCommand transactionVoucherDetail = new AddEditTransactionListCommand
                    {
                        VoucherNo           = responseVoucher.VoucherNo,
                        VoucherTransactions = transactions
                    };

                    bool isTransactionSaved = _iAccountingServices.AddEditTransactionList(transactionVoucherDetail);

                    if (isTransactionSaved)
                    {
                        string journalName = _dbContext.VoucherDetail.FirstOrDefault(x => x.JournalCode == responseVoucher.JournalCode)?.JournalDetails.JournalName;

                        response.data.GainLossVoucherDetail = new GainLossVoucherListModel
                        {
                            VoucherId   = responseVoucher.VoucherNo,
                            JournalName = string.IsNullOrEmpty(journalName) ? journalName : "",
                            VoucherName = responseVoucher.ReferenceNo,
                            VoucherDate = responseVoucher.VoucherDate
                        };
                    }
                    else
                    {
                        throw new Exception(StaticResource.TransactionsNotSaved);
                    }

                    response.StatusCode = StaticResource.successStatusCode;
                    response.Message    = StaticResource.SuccessText;
                }
                else
                {
                    response.StatusCode = StaticResource.failStatusCode;
                    response.Message    = StaticResource.VoucherNotSaved;
                }

                #endregion
            }
            catch (Exception ex)
            {
                response.StatusCode = StaticResource.failStatusCode;
                response.Message    = ex.Message;
            }
            return(response);
        }
        /// <summary>
        /// Add/Edit Transaction
        /// </summary>
        /// <param name="request"></param>
        /// <param name="_dbContext"></param>
        /// <returns>true/Exception</returns>
        public bool AddEditTransactionList(AddEditTransactionListCommand request)
        {
            List <VoucherTransactions> transactionsListAdd  = new List <VoucherTransactions>();
            List <VoucherTransactions> transactionsListEdit = new List <VoucherTransactions>();

            try
            {
                if (!request.VoucherTransactions.Any())
                {
                    throw new Exception(StaticResource.NoTransactionToUpDate);
                }

                var editList = request.VoucherTransactions.Where(w => w.TransactionId != 0)
                               .Select(s => s.TransactionId);

                var editTransactionList = _dbContext.VoucherTransactions
                                          .Where(x => editList.Contains(x.TransactionId))
                                          .ToList();

                var voucherDetail = _dbContext.VoucherDetail.FirstOrDefault(x => x.IsDeleted == false && x.VoucherNo == request.VoucherNo);

                if (voucherDetail == null)
                {
                    throw new Exception(StaticResource.VoucherNotPresent);
                }

                foreach (VoucherTransactionsModel item in request.VoucherTransactions)
                {
                    // Add
                    if (item.TransactionId == 0 && item.IsDeleted == false)
                    {
                        //new voucher transaction object
                        VoucherTransactions transaction = new VoucherTransactions();

                        transaction.ChartOfAccountNewId = item.AccountNo;
                        transaction.Debit           = item.Debit;
                        transaction.Credit          = item.Credit;
                        transaction.Description     = item.Description;
                        transaction.BudgetLineId    = item.BudgetLineId;
                        transaction.ProjectId       = item.ProjectId;
                        transaction.CreatedById     = request.ModifiedById;
                        transaction.CreatedDate     = DateTime.UtcNow;
                        transaction.IsDeleted       = false;
                        transaction.VoucherNo       = item.VoucherNo;
                        transaction.CurrencyId      = voucherDetail.CurrencyId;
                        transaction.TransactionDate = voucherDetail.VoucherDate;
                        transaction.JobId           = item.JobId == 0 ? null : item.JobId;

                        transactionsListAdd.Add(transaction);
                    }
                    // edit
                    else
                    {
                        VoucherTransactions transaction = editTransactionList.FirstOrDefault(x => x.TransactionId == item.TransactionId);

                        if (transaction != null)
                        {
                            if (item.IsDeleted == false)
                            {
                                transaction.IsDeleted = false;
                            }
                            else
                            {
                                transaction.IsDeleted = true;
                            }
                            transaction.TransactionId       = item.TransactionId;
                            transaction.ChartOfAccountNewId = item.AccountNo;
                            transaction.Debit           = item.Debit;
                            transaction.Credit          = item.Credit;
                            transaction.Description     = item.Description;
                            transaction.BudgetLineId    = item.BudgetLineId;
                            transaction.ProjectId       = item.ProjectId;
                            transaction.JobId           = item.JobId == 0 ? null : item.JobId;
                            transaction.CurrencyId      = voucherDetail.CurrencyId;
                            transaction.TransactionDate = voucherDetail.VoucherDate;
                            transaction.ModifiedById    = request.ModifiedById;
                            transaction.ModifiedDate    = DateTime.UtcNow;

                            transactionsListEdit.Add(transaction);
                        }
                    }
                }

                using (IDbContextTransaction tran = _dbContext.Database.BeginTransaction())
                {
                    try
                    {
                        _dbContext.VoucherTransactions.AddRange(transactionsListAdd);
                        _dbContext.VoucherTransactions.UpdateRange(transactionsListEdit);

                        _dbContext.SaveChanges();
                        tran.Commit();
                    }

                    catch (Exception ex)
                    {
                        tran.Rollback();

                        throw new Exception(ex.Message);
                    }
                }

                return(true);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }