/// <summary>
        /// Inserts the account balance.
        /// </summary>
        /// <param name="suTransfer">The su transfer.</param>
        /// <param name="suTransferDetail">The su transfer detail.</param>
        public void InsertAccountBalance(SUTransferEntity suTransfer, SUTransferDetailEntity suTransferDetail)
        {
            //insert AccountBalance for debit account
            var accountBalanceForDebit     = AddAccountBalanceForDebit(suTransfer, suTransferDetail);
            var accountBalanceForDebitExit = AccountBalanceDao.GetExitsAccountBalance(accountBalanceForDebit);

            if (accountBalanceForDebitExit != null)
            {
                UpdateAccountBalance(accountBalanceForDebitExit, accountBalanceForDebit.MovementDebitAmountOC,
                                     accountBalanceForDebit.MovementDebitAmount, true, 1);
            }
            else
            {
                AccountBalanceDao.InsertAccountBalance(accountBalanceForDebit);
            }

            //insert AccountBalance for credit account
            var accountBalanceForCredit     = AddAccountBalanceForCredit(suTransfer, suTransferDetail);
            var accountBalanceForCreditExit = AccountBalanceDao.GetExitsAccountBalance(accountBalanceForCredit);

            if (accountBalanceForCreditExit != null)
            {
                UpdateAccountBalance(accountBalanceForCreditExit, accountBalanceForCredit.MovementCreditAmountOC,
                                     accountBalanceForCredit.MovementCreditAmount, true, 2);
            }
            else
            {
                AccountBalanceDao.InsertAccountBalance(accountBalanceForCredit);
            }
        }
        /// <summary>
        /// Deletes the sUIncrementDecrement.
        /// </summary>
        /// <param name="suTransfer">The su transfer.</param>
        /// <returns>
        /// System.String.
        /// </returns>
        public string DeleteSUTransfer(SUTransferEntity suTransfer)
        {
            const string sql = @"uspDelete_SUTransfer";

            object[] parms = { "@RefID", suTransfer.RefId };
            return(Db.Delete(sql, true, parms));
        }
        /// <summary>
        /// Updates the account balance.
        /// </summary>
        /// <param name="suTransfer">The su transfer.</param>
        /// <returns></returns>
        public string UpdateAccountBalance(SUTransferEntity suTransfer)
        {
            var paymentDetails = SUTransferDetailDao.GetSUTransferDetailsByRefId(suTransfer.RefId);

            foreach (var paymentDetail in paymentDetails)
            {
                string message;
                var    accountBalanceForDebit     = AddAccountBalanceForDebit(suTransfer, paymentDetail);
                var    accountBalanceForDebitExit = AccountBalanceDao.GetExitsAccountBalance(accountBalanceForDebit);
                if (accountBalanceForDebitExit != null)
                {
                    message = UpdateAccountBalance(accountBalanceForDebitExit, accountBalanceForDebit.MovementDebitAmountOC,
                                                   accountBalanceForDebit.MovementDebitAmount, false, 1);
                    if (message != null)
                    {
                        return(message);
                    }
                }

                var accountBalanceForCredit     = AddAccountBalanceForCredit(suTransfer, paymentDetail);
                var accountBalanceForCreditExit = AccountBalanceDao.GetExitsAccountBalance(accountBalanceForCredit);
                if (accountBalanceForCreditExit != null)
                {
                    message = UpdateAccountBalance(accountBalanceForCreditExit, accountBalanceForCredit.MovementCreditAmountOC,
                                                   accountBalanceForCredit.MovementCreditAmount, false, 2);
                    if (message != null)
                    {
                        return(message);
                    }
                }
            }
            return(null);
        }
        /// <summary>
        /// Gets the sUIncrementDecrement by refdate and reftype.
        /// </summary>
        /// <param name="suTransfer">The su transfer.</param>
        /// <returns></returns>
        public SUTransferEntity GetSUTransferByRefdateAndReftype(SUTransferEntity suTransfer)
        {
            const string procedures = @"uspGet_SUTransfer_ByRefdateAndReftype";

            object[] parms =
            {
                "@RefType", suTransfer.RefType, "@RefDate", suTransfer.RefDate, "@RefNo", suTransfer.RefNo
            };
            return(Db.Read(procedures, true, Make, parms));
        }
 /// <summary>
 /// Takes the specified s u increment decrement entity.
 /// </summary>
 /// <param name="suTransferEntity">The su transfer entity.</param>
 /// <returns></returns>
 private static object[] Take(SUTransferEntity suTransferEntity)
 {
     return(new object[]
     {
         "@RefID", suTransferEntity.RefId,
         "@RefType", suTransferEntity.RefType,
         "@RefDate", suTransferEntity.RefDate,
         "@PostedDate", suTransferEntity.PostedDate,
         "@RefNo", suTransferEntity.RefNo,
         "@ParalellRefNo", suTransferEntity.ParalellRefNo,
         "@JournalMemo", suTransferEntity.JournalMemo,
         "@TotalAmount", suTransferEntity.TotalAmount,
         "@EditVersion", suTransferEntity.EditVersion
     });
 }
 /// <summary>
 /// Adds the account balance for debit.
 /// </summary>
 /// <param name="suTransfer">The su transfer.</param>
 /// <param name="suTransferDetail">The su transfer detail.</param>
 /// <returns></returns>
 public AccountBalanceEntity AddAccountBalanceForDebit(SUTransferEntity suTransfer, SUTransferDetailEntity suTransferDetail)
 {
     return(new AccountBalanceEntity
     {
         AccountBalanceId = Guid.NewGuid().ToString(),
         AccountNumber = suTransferDetail.DebitAccount,
         CurrencyCode = "VND",
         ExchangeRate = 1,
         BalanceDate = suTransfer.PostedDate,
         MovementDebitAmountOC = suTransferDetail.Amount,
         MovementDebitAmount = suTransferDetail.Amount,
         MovementCreditAmountOC = 0,
         MovementCreditAmount = 0,
         BudgetChapterCode = suTransferDetail.BudgetChapterCode
     });
 }
        //private List<BankInfo> banks;
        public List <SUTransferEntity> GetSUTransfers(string connectionString)
        {
            List <SUTransferEntity> buentity = new List <SUTransferEntity>();

            using (var context = new MISAEntity(connectionString))
            {
                var querry = context.SUTransferDetails.ToList();
                //var projects = context.Projects.ToList();
                //var currencys = context.CCies.ToList();
                //var budgetsource = context.BudgetSources.ToList();
                var listitems = context.ListItems.ToList();
                //var funds = context.Funds.ToList();
                //var fundstructures = context.FundStructures.ToList();
                //var budgetproviders = context.BudgetProvidences.ToList();
                //var accountingobject = context.AccountingObjects.ToList();
                //var projectexpenses = context.ProjectExpenses.ToList();
                //var activity = context.Activities.ToList();
                //var tasks = context.Tasks.ToList();
                //var stocks = context.Stocks.ToList();
                //var topics = context.Topics.ToList();
                //var fixedassets = context.FixedAssets.ToList();
                var departments = context.Departments.ToList();
                //var purchasepurposes = context.PurchasePurposes.ToList();
                var inventoryitems = context.InventoryItems.ToList();
                //banks = context.BankInfoes.ToList();
                var resultcontext = context.SUTransfers.ToList();
                foreach (var result in resultcontext)
                {
                    var newresult = new SUTransferEntity();
                    newresult.RefId             = result.RefID.ToString();
                    newresult.RefType           = ConvRefType.ConvRefType(result.RefType);
                    newresult.RefDate           = result.RefDate;
                    newresult.PostedDate        = result.PostedDate;
                    newresult.RefNo             = result.RefNo;
                    newresult.ParalellRefNo     = result.ParalellRefNo;
                    newresult.JournalMemo       = result.JournalMemo;
                    newresult.TotalAmount       = result.TotalAmount;
                    newresult.Posted            = result.Posted;
                    newresult.PostVersion       = result.PostVersion;
                    newresult.EditVersion       = result.EditVersion;
                    newresult.SUTransferDetails = result.SUTransferDetails.Count <= 0 ? null : SUTransferDetails(result.SUTransferDetails.ToList(), result.RefID.ToString());
                    buentity.Add(newresult);
                }
            }
            return(buentity);
        }
        /// <summary>
        /// Updates the sUIncrementDecrement.
        /// </summary>
        /// <param name="suTransfer">The su transfer.</param>
        /// <returns>
        /// System.String.
        /// </returns>
        public string UpdateSUTransfer(SUTransferEntity suTransfer)
        {
            const string sql = @"uspUpdate_SUTransfer";

            return(Db.Update(sql, true, Take(suTransfer)));
        }
        /// <summary>
        /// Inserts the sUIncrementDecrement.
        /// </summary>
        /// <param name="suTransfer">The su transfer.</param>
        /// <returns>
        /// System.Int32.
        /// </returns>
        public string InsertSUTransfer(SUTransferEntity suTransfer)
        {
            const string sql = @"uspInsert_SUTransfer";

            return(Db.Insert(sql, true, Take(suTransfer)));
        }
        /// <summary>
        /// Updates the ba deposit.
        /// </summary>
        /// <param name="suTransferEntity">The su transfer entity.</param>
        /// <returns></returns>
        public SUTransferResponse UpdateSUTransfer(SUTransferEntity suTransferEntity)
        {
            var response = new SUTransferResponse {
                Acknowledge = AcknowledgeType.Success
            };

            try
            {
                if (!suTransferEntity.Validate())
                {
                    foreach (var error in suTransferEntity.ValidationErrors)
                    {
                        response.Message += error + Environment.NewLine;
                    }
                    response.Acknowledge = AcknowledgeType.Failure;
                    return(response);
                }
                using (var scope = new TransactionScope())
                {
                    var suTransfer = SUTransferDao.GetSUTransfer(suTransferEntity.RefNo.Trim(), suTransferEntity.PostedDate);
                    if (suTransfer != null && suTransfer.PostedDate.Year == suTransferEntity.PostedDate.Year)
                    {
                        if (suTransfer.RefId != suTransferEntity.RefId)
                        {
                            response.Acknowledge = AcknowledgeType.Failure;
                            response.Message     = @"Số chứng từ " + suTransferEntity.RefNo + @" đã tồn tại !";
                            return(response);
                        }
                    }

                    response.Message = SUTransferDao.UpdateSUTransfer(suTransferEntity);
                    if (!string.IsNullOrEmpty(response.Message))
                    {
                        response.Acknowledge = AcknowledgeType.Failure;
                        return(response);
                    }

                    #region Update account balance
                    //Trừ đi số tiền của chứng từ cũ trước khi cộng thêm số tiền mới

                    UpdateAccountBalance(suTransferEntity);
                    if (response.Message != null)
                    {
                        response.Acknowledge = AcknowledgeType.Failure;
                        scope.Dispose();
                        return(response);
                    }

                    #endregion

                    #region Delete detail and insert detail

                    // Xóa bảng SUTransferDetail
                    response.Message = SUTransferDetailDao.DeleteSUTransferDetailByRefId(suTransferEntity.RefId);
                    if (!string.IsNullOrEmpty(response.Message))
                    {
                        response.Acknowledge = AcknowledgeType.Failure;
                        return(response);
                    }

                    // Xóa bảng OriginalGeneralLedger
                    response.Message = OriginalGeneralLedgerDao.DeleteOriginalGeneralLedger(suTransferEntity.RefId);
                    if (response.Message != null)
                    {
                        response.Acknowledge = AcknowledgeType.Failure;
                        scope.Dispose();
                        return(response);
                    }

                    // Xóa bảng SupplyLedger
                    response.Message = SupplyLedgerDao.DeleteSupplyLedgerByRefId(suTransferEntity.RefId, suTransferEntity.RefType);
                    if (response.Message != null)
                    {
                        response.Acknowledge = AcknowledgeType.Failure;
                        scope.Dispose();
                        return(response);
                    }

                    if (suTransferEntity.SUTransferDetails != null)
                    {
                        foreach (var suTransferDetail in suTransferEntity.SUTransferDetails)
                        {
                            if (suTransferEntity.RefType == (int)BuCA.Enum.RefType.SUTransfer)
                            {
                                AutoMapper(GetUnitsInDepartment(suTransferDetail.InventoryItemId, suTransferDetail.FromDepartmentId, suTransferDetail.Quantity, suTransferDetail.Description), response);
                                if (response.Acknowledge == AcknowledgeType.Failure)
                                {
                                    return(response);
                                }
                            }

                            suTransferDetail.RefDetailId = Guid.NewGuid().ToString();
                            suTransferDetail.RefId       = suTransferEntity.RefId;
                            response.Message             = SUTransferDetailDao.InsertSUTransferDetail(suTransferDetail);
                            if (!string.IsNullOrEmpty(response.Message))
                            {
                                response.Acknowledge = AcknowledgeType.Failure;
                                return(response);
                            }

                            #region Insert into AccountBalance

                            // Cộng thêm số tiền mới sau khi sửa chứng từ
                            InsertAccountBalance(suTransferEntity, suTransferDetail);
                            if (response.Message != null)
                            {
                                response.Acknowledge = AcknowledgeType.Failure;
                                scope.Dispose();
                                return(response);
                            }

                            #endregion

                            #region Insert OriginalGeneralLedger
                            var originalGeneralLedgerEntity = new OriginalGeneralLedgerEntity
                            {
                                OriginalGeneralLedgerId = Guid.NewGuid().ToString(),
                                RefType           = suTransferEntity.RefType,
                                RefId             = suTransferEntity.RefId,
                                RefDetailId       = suTransferDetail.RefDetailId,
                                RefDate           = suTransferEntity.RefDate,
                                RefNo             = suTransferEntity.RefNo,
                                Amount            = suTransferDetail.Amount,
                                BudgetChapterCode = suTransferDetail.BudgetChapterCode,
                                CreditAccount     = suTransferDetail.CreditAccount,
                                DebitAccount      = suTransferDetail.DebitAccount,
                                Description       = suTransferDetail.Description,
                                JournalMemo       = suTransferEntity.JournalMemo,
                                SortOrder         = suTransferDetail.SortOrder,
                                PostedDate        = suTransferEntity.PostedDate,

                                // Không có Currency trong db : mặc định VNĐ và 1
                                CurrencyCode = "VND",
                                ExchangeRate = 1,
                            };
                            response.Message = OriginalGeneralLedgerDao.InsertOriginalGeneralLedger(originalGeneralLedgerEntity);
                            if (!string.IsNullOrEmpty(response.Message))
                            {
                                response.Acknowledge = AcknowledgeType.Failure;
                                return(response);
                            }

                            #endregion

                            #region Insert SupplyLedger
                            if (suTransferDetail.InventoryItemId != null)
                            {
                                var supplyLedgerEntity = new SupplyLedgerEntity
                                {
                                    SupplyLedgerId    = Guid.NewGuid().ToString(),
                                    RefId             = suTransferEntity.RefId,
                                    RefType           = suTransferEntity.RefType,
                                    RefNo             = suTransferEntity.RefNo,
                                    RefDate           = suTransferEntity.RefDate,
                                    PostedDate        = suTransferEntity.PostedDate,
                                    DepartmentId      = suTransferDetail.FromDepartmentId,
                                    InventoryItemId   = suTransferDetail.InventoryItemId,
                                    Unit              = suTransferDetail.Unit,
                                    UnitPrice         = suTransferDetail.UnitPrice,
                                    IncrementQuantity = 0,
                                    DecrementQuantity = suTransferDetail.Quantity,
                                    IncrementAmount   = 0,
                                    DecrementAmount   = suTransferDetail.Amount,
                                    JournalMemo       = suTransferEntity.JournalMemo,
                                    Description       = suTransferDetail.Description,
                                    AccountNumber     = suTransferDetail.DebitAccount,
                                    RefDetailId       = suTransferDetail.RefDetailId
                                };
                                response.Message = SupplyLedgerDao.InsertSupplyLedger(supplyLedgerEntity);
                                if (!string.IsNullOrEmpty(response.Message))
                                {
                                    response.Acknowledge = AcknowledgeType.Failure;
                                    return(response);
                                }

                                //insert lan 2
                                supplyLedgerEntity.SupplyLedgerId    = Guid.NewGuid().ToString();
                                supplyLedgerEntity.AccountNumber     = suTransferDetail.CreditAccount;
                                supplyLedgerEntity.DepartmentId      = suTransferDetail.ToDepartmentId;
                                supplyLedgerEntity.IncrementQuantity = suTransferDetail.Quantity;
                                supplyLedgerEntity.DecrementQuantity = 0;
                                supplyLedgerEntity.IncrementAmount   = suTransferDetail.Amount;
                                supplyLedgerEntity.DecrementAmount   = 0;

                                response.Message = SupplyLedgerDao.InsertSupplyLedger(supplyLedgerEntity);
                                if (!string.IsNullOrEmpty(response.Message))
                                {
                                    response.Acknowledge = AcknowledgeType.Failure;
                                    return(response);
                                }
                            }
                            #endregion
                        }
                    }

                    #endregion

                    scope.Complete();
                }
                response.RefId = suTransferEntity.RefId;
                return(response);
            }
            catch (Exception ex)
            {
                response.Message = ex.Message;
                return(response);
            }
        }