/// <summary>
 /// Adds the account balance for credit.
 /// </summary>
 /// <param name="openingAccountEntryEntity">The opening account entry entity.</param>
 /// <param name="openingAccountEntryDetailEntityy">The opening account entry detail entityy.</param>
 /// <returns></returns>
 public AccountBalanceEntity AddAccountBalanceForCredit(OpeningAccountEntryEntity openingAccountEntryEntity,
                                                        OpeningAccountEntryDetailEntity openingAccountEntryDetailEntityy)
 {
     //credit account
     return(new AccountBalanceEntity
     {
         BalanceDate = openingAccountEntryEntity.PostedDate,
         CurrencyCode = openingAccountEntryDetailEntityy.CurrencyCode,
         ExchangeRate = (decimal)openingAccountEntryDetailEntityy.ExchangeRate,
         AccountNumber = openingAccountEntryEntity.AccountCode,
         MovementCreditAmountOC = openingAccountEntryDetailEntityy.CreditAmountOC,
         MovementCreditAmountExchange = openingAccountEntryDetailEntityy.CreditAmountExchange,
         BudgetSourceCode = openingAccountEntryDetailEntityy.BudgetSourceCode,
         BudgetItemCode = openingAccountEntryDetailEntityy.BudgetItemCode,
         CustomerId = openingAccountEntryDetailEntityy.CustomerId,
         VendorId = openingAccountEntryDetailEntityy.VendorId,
         EmployeeId = openingAccountEntryDetailEntityy.EmployeeId,
         AccountingObjectId = openingAccountEntryDetailEntityy.AccountingObjectId,
         MergerFundId = openingAccountEntryDetailEntityy.MergerFundId,
         BankId = openingAccountEntryDetailEntityy.BankId,
         ProjectId = openingAccountEntryDetailEntityy.ProjectId,
         //InventoryItemId = openingAccountEntryDetailEntityy.InventoryItemId,
         MovementDebitAmountOC = 0,
         MovementDebitAmountExchange = 0
     });
 }
 /// <summary>
 /// Takes the specified opening account entry detail.
 /// </summary>
 /// <param name="openingAccountEntryDetail">The opening account entry detail.</param>
 /// <returns></returns>
 private static object[] Take(OpeningAccountEntryDetailEntity openingAccountEntryDetail)
 {
     return(new object[]
     {
         @"RefDetailID", openingAccountEntryDetail.RefDetailId,
         @"RefID", openingAccountEntryDetail.RefId,
         @"RefTypeID", openingAccountEntryDetail.RefTypeId,
         @"PostedDate", openingAccountEntryDetail.PostedDate,
         @"AccountBeginningDebitAmountOC", openingAccountEntryDetail.AccountBeginningDebitAmountOC,
         @"AccountBeginningCreditAmountOC", openingAccountEntryDetail.AccountBeginningCreditAmountOC,
         @"DebitAmountOC", openingAccountEntryDetail.DebitAmountOC,
         @"CreditAmountOC", openingAccountEntryDetail.CreditAmountOC,
         @"AccountBeginningDebitAmountExchange", openingAccountEntryDetail.AccountBeginningDebitAmountExchange,
         @"AccountBeginningCreditAmountExchange", openingAccountEntryDetail.AccountBeginningCreditAmountExchange,
         @"DebitAmountExchange", openingAccountEntryDetail.DebitAmountExchange,
         @"CreditAmountExchange", openingAccountEntryDetail.CreditAmountExchange,
         @"CurrencyCode", openingAccountEntryDetail.CurrencyCode,
         @"ExchangeRate", openingAccountEntryDetail.ExchangeRate,
         @"BudgetSourceCode", openingAccountEntryDetail.BudgetSourceCode,
         @"BudgetChapterCode", openingAccountEntryDetail.BudgetChapterCode,
         @"BudgetCategoryCode", openingAccountEntryDetail.BudgetCategoryCode,
         @"BudgetGroupItemCode", openingAccountEntryDetail.BudgetGroupItemCode,
         @"BudgetItemCode", openingAccountEntryDetail.BudgetItemCode,
         @"MergerFundID", openingAccountEntryDetail.MergerFundId,
         @"EmployeeID", openingAccountEntryDetail.EmployeeId,
         @"CustomerID", openingAccountEntryDetail.CustomerId,
         @"VendorID", openingAccountEntryDetail.VendorId,
         @"AccountingObjectID", openingAccountEntryDetail.AccountingObjectId,
         @"ProjectID", openingAccountEntryDetail.ProjectId,
         @"BankID", openingAccountEntryDetail.BankId
     });
 }
        /// <summary>
        /// Inserts the account balance.
        /// </summary>
        /// <param name="openingAccountEntryEntity">The opening account entry entity.</param>
        /// <param name="openingAccountEntryDetailEntity">The opening account entry detail entity.</param>
        /// <param name="balanceSide">The balance side.</param>
        public void InsertAccountBalance(OpeningAccountEntryEntity openingAccountEntryEntity, OpeningAccountEntryDetailEntity openingAccountEntryDetailEntity,
                                         int balanceSide)
        {
            //check balance side

            switch (balanceSide)
            {
            case 0:     //ben no
                var accountBalanceForDebit     = AddAccountBalanceForDebit(openingAccountEntryEntity, openingAccountEntryDetailEntity);
                var accountBalanceForDebitExit = AccountBalanceDao.GetExitsAccountBalance(accountBalanceForDebit);
                if (accountBalanceForDebitExit != null)
                {
                    UpdateAccountBalance(accountBalanceForDebitExit, accountBalanceForDebit.MovementDebitAmountOC,
                                         accountBalanceForDebit.MovementDebitAmountExchange, true, 1);
                }
                else
                {
                    AccountBalanceDao.InsertAccountBalance(accountBalanceForDebit);
                }
                break;

            case 1:     //ben co
                var accountBalanceForCredit     = AddAccountBalanceForCredit(openingAccountEntryEntity, openingAccountEntryDetailEntity);
                var accountBalanceForCreditExit = AccountBalanceDao.GetExitsAccountBalance(accountBalanceForCredit);
                if (accountBalanceForCreditExit != null)
                {
                    UpdateAccountBalance(accountBalanceForCreditExit, accountBalanceForCredit.MovementCreditAmountOC,
                                         accountBalanceForCredit.MovementCreditAmountExchange, true, 2);
                }
                else
                {
                    AccountBalanceDao.InsertAccountBalance(accountBalanceForCredit);
                }
                break;

            case 2:
                if (openingAccountEntryDetailEntity.DebitAmountOC == 0)
                {
                    accountBalanceForCredit     = AddAccountBalanceForCredit(openingAccountEntryEntity, openingAccountEntryDetailEntity);
                    accountBalanceForCreditExit = AccountBalanceDao.GetExitsAccountBalance(accountBalanceForCredit);
                    if (accountBalanceForCreditExit != null)
                    {
                        UpdateAccountBalance(accountBalanceForCreditExit, accountBalanceForCredit.MovementCreditAmountOC,
                                             accountBalanceForCredit.MovementCreditAmountExchange, true, 2);
                    }
                    else
                    {
                        AccountBalanceDao.InsertAccountBalance(accountBalanceForCredit);
                    }
                }
                else
                {
                    accountBalanceForDebit     = AddAccountBalanceForDebit(openingAccountEntryEntity, openingAccountEntryDetailEntity);
                    accountBalanceForDebitExit = AccountBalanceDao.GetExitsAccountBalance(accountBalanceForDebit);
                    if (accountBalanceForDebitExit != null)
                    {
                        UpdateAccountBalance(accountBalanceForDebitExit, accountBalanceForDebit.MovementDebitAmountOC,
                                             accountBalanceForDebit.MovementDebitAmountExchange, true, 1);
                    }
                    else
                    {
                        AccountBalanceDao.InsertAccountBalance(accountBalanceForDebit);
                    }
                }
                break;     //luong tinh
            }
        }
        /// <summary>
        /// Adds the journal entry account.
        /// </summary>
        /// <param name="openingAccountEntryEntity">The opening account entry entity.</param>
        /// <param name="openingAccountEntryDetailEntity">The opening account entry detail entity.</param>
        /// <param name="balanceSide">The balance side.</param>
        /// <returns></returns>
        public JournalEntryAccountEntity AddJournalEntryAccount(OpeningAccountEntryEntity openingAccountEntryEntity,
                                                                OpeningAccountEntryDetailEntity openingAccountEntryDetailEntity, int balanceSide)
        {
            decimal amountOC;
            decimal amountExchange;
            int     journalType;

            switch (balanceSide)
            {
            case 0:
                amountOC       = openingAccountEntryDetailEntity.DebitAmountOC;
                amountExchange = openingAccountEntryDetailEntity.DebitAmountExchange;
                journalType    = 1;
                break;

            case 1:
                amountOC       = openingAccountEntryDetailEntity.CreditAmountOC * (-1);
                amountExchange = openingAccountEntryDetailEntity.CreditAmountExchange * (-1);
                journalType    = 2;
                break;

            default:
                if (openingAccountEntryDetailEntity.DebitAmountOC > openingAccountEntryDetailEntity.CreditAmountOC)
                {
                    amountOC       = Math.Abs(openingAccountEntryDetailEntity.DebitAmountOC - openingAccountEntryDetailEntity.CreditAmountOC);
                    amountExchange = Math.Abs(openingAccountEntryDetailEntity.DebitAmountExchange - openingAccountEntryDetailEntity.CreditAmountExchange);
                    journalType    = 1;
                }
                else
                {
                    amountOC       = openingAccountEntryDetailEntity.DebitAmountOC - openingAccountEntryDetailEntity.CreditAmountOC;
                    amountExchange = openingAccountEntryDetailEntity.DebitAmountExchange - openingAccountEntryDetailEntity.CreditAmountExchange;
                    journalType    = 2;
                }
                break;
            }
            return(new JournalEntryAccountEntity
            {
                RefId = openingAccountEntryEntity.RefId,
                RefTypeId = openingAccountEntryEntity.RefTypeId,
                RefNo = "OPN",
                RefDate = openingAccountEntryEntity.PostedDate,
                PostedDate = openingAccountEntryEntity.PostedDate,
                JournalMemo = null,
                CurrencyCode = openingAccountEntryDetailEntity.CurrencyCode,
                ExchangeRate = (decimal)openingAccountEntryDetailEntity.ExchangeRate,
                BankAccount = null,
                RefDetailId = openingAccountEntryDetailEntity.RefDetailId,
                AccountNumber = openingAccountEntryEntity.AccountCode,
                CorrespondingAccountNumber = null,
                AmountOc = amountOC,
                BankId = openingAccountEntryDetailEntity.BankId,
                Description = null,
                JournalType = journalType,
                AmountExchange = amountExchange,
                BudgetSourceCode = openingAccountEntryDetailEntity.BudgetSourceCode,
                BudgetItemCode = openingAccountEntryDetailEntity.BudgetItemCode,
                AccountingObjectId = openingAccountEntryDetailEntity.AccountingObjectId,
                EmployeeId = openingAccountEntryDetailEntity.EmployeeId,
                CustomerId = openingAccountEntryDetailEntity.CustomerId,
                VendorId = openingAccountEntryDetailEntity.VendorId,
                MergerFundId = openingAccountEntryDetailEntity.MergerFundId,
                VoucherTypeId = null,
                ProjectId = openingAccountEntryDetailEntity.ProjectId
            });
        }
        /// <summary>
        /// Inserts the opening account entry detail.
        /// </summary>
        /// <param name="openingAccountEntryDetail">The opening account entry detail.</param>
        /// <returns></returns>
        /// <exception cref="System.NotImplementedException"></exception>
        public int InsertOpeningAccountEntryDetail(OpeningAccountEntryDetailEntity openingAccountEntryDetail)
        {
            const string sql = @"uspInsert_OpeningAccountEntryDetail";

            return(Db.Insert(sql, true, Take(openingAccountEntryDetail)));
        }