protected Trancode_Info GetTrancodeByID(string code) { return(_dalTrancode.GetOneTranCode(code)); }
public xml_response Retail(string trancode, string accountId, decimal amount, string descript) { try { _res = new xml_response(); _res.function_name = this.ToString() + string.Format(".Retail({0}, {1}, {2},{3})", trancode, accountId, amount, descript); if (logger.IsDebugEnabled) { logger.Debug(string.Format("Start function: {0}", _res.function_name)); } // kiểm tra trancode Trancode_Info trancodeInfo = _dalTrancode.GetOneTranCode(trancode); if (trancodeInfo == null) { _res.SetError("99", string.Format("Trancode Id: {0} not found", trancode)); if (logger.IsErrorEnabled) { logger.Error(string.Format("{0}\t{1}", _res.error_code, _res.error_msg)); } return(_res); } if (trancodeInfo.CodeType == CodeType.FundTransfer) { _res.SetError("99", string.Format("Trancode Id: {0} invalid code type", trancode)); if (logger.IsErrorEnabled) { logger.Error(string.Format("{0}\t{1}", _res.error_code, _res.error_msg)); } return(_res); } Tranday_Info trandayInfo = new Tranday_Info(); _transdate = BaseParameters.ToDay().TransDate; trandayInfo.DocID = GenerateDocId(); // tạo số chứng từ mới trandayInfo.Trace = trandayInfo.DocID; trandayInfo.TransDate = _transdate; trandayInfo.ValueDate = _transdate; trandayInfo.Status = TransactionStatus.Approved; trandayInfo.Branch_ID = _channel.Branch; trandayInfo.AllowReverse = trancodeInfo.AllowReverse; if (string.IsNullOrEmpty(descript)) { trandayInfo.Descript = string.Format("Retail: {0} with amount={1}", accountId, amount); } else { trandayInfo.Descript = descript; } trandayInfo.NextDocId = ""; trandayInfo.OtherRef = ""; trandayInfo.TranCode = trancode; trandayInfo.UserCreate = _channel.UserLogin; trandayInfo.Verified = true; trandayInfo.Verified_User = _channel.UserLogin; _dalTranday.CreateOneTranday(trandayInfo); // lấy mã giao dịch được định nghĩa cách hạch toán List <TranCodeDetail_Info> list = _dalTrancode.GetTranCodeDetailByCode(trancode); if (list == null) { _res.SetError("30", string.Format("Can't load trancodedetail: {0}", trancode)); if (logger.IsErrorEnabled) { logger.Error(string.Format("{0}\t{1}", _res.error_code, _res.error_msg)); } _dalTranday.ClearCommand(); return(_res); } D_Account dalAc = new D_Account(); TrandayDetail_Info tid; List <Account_Info> AcList; Account_Info tmpAc; D_TrandayDetail trand = new D_TrandayDetail(); decimal remain_amnt = 0; // số tiền còn lại decimal db_amnt; decimal cr_amnt; decimal sum_db_amnt = 0; decimal sum_cr_amnt = 0; bool find_ac = false; tmpAc = dalAc.GetOneAccount(accountId); if (tmpAc == null) { _res.SetError("11", string.Format("{0} does not exists", accountId)); if (logger.IsErrorEnabled) { logger.Error(string.Format("{0}\t{1}", _res.error_code, _res.error_msg)); } _dalTranday.ClearCommand(); return(_res); } #region Build Trandaydetail foreach (TranCodeDetail_Info tcdi in list) { AcList = new List <Account_Info>(); tid = new TrandayDetail_Info(); db_amnt = 0; cr_amnt = 0; #region Find Account_ID if (tcdi.Is_Account_Cust) { // là tài khoản khách hàng AcList = dalAc.GetListAccountLike(tcdi.Account_ID); foreach (Account_Info acInfo in AcList) { if (accountId == acInfo.Account_ID) { find_ac = true; break; } } if (find_ac == false) { // không xác định được nhóm tài khoản khách hàng _res.SetError("31", string.Format("{0} not in group {1}", accountId, tcdi.Account_ID)); if (logger.IsErrorEnabled) { logger.Error(string.Format("{0}\t{1}", _res.error_code, _res.error_msg)); } _dalTranday.ClearCommand(); return(_res); } } else { // là tài khoản đã được định danh chi tiết AcList = dalAc.GetListAccountLike(tcdi.Account_ID); if (AcList.Count > 1) { // nếu xác định được nhiều tài khoản thì lỗi _res.SetError("31", string.Format("{0} does too many accounts", tcdi.Account_ID)); if (logger.IsErrorEnabled) { logger.Error(string.Format("{0}\t{1}", _res.error_code, _res.error_msg)); } _dalTranday.ClearCommand(); return(_res); } if (AcList.Count == 0) { // không xác định được tài khoản _res.SetError("31", string.Format("{0} Invalid account id", tcdi.Account_ID)); if (logger.IsErrorEnabled) { logger.Error(string.Format("{0}\t{1}", _res.error_code, _res.error_msg)); } _dalTranday.ClearCommand(); return(_res); } tmpAc = AcList[0]; } #endregion tid.Account_ID = tmpAc.Account_ID; tid.Ccy = tmpAc.Ccy; tid.SEQ = tcdi.SEQ; if (!tcdi.Master) { switch (tcdi.NumberType) { case NumberType.FixAmount: // Kiểm tra số dư fix if ((decimal)tcdi.NumberValue > amount - remain_amnt) { _res.SetError("", string.Format("fix amount is {0} greater than {1}", tcdi.NumberValue, amount - remain_amnt)); if (logger.IsErrorEnabled) { logger.Error(string.Format("{0}\t{1}", _res.error_code, _res.error_msg)); } _dalTranday.ClearCommand(); return(_res); } if (tcdi.CreditDebit == CreditDebit.DB) { db_amnt = (decimal)tcdi.NumberValue; } else { cr_amnt = (decimal)tcdi.NumberValue; } break; case NumberType.Percentage: if (tcdi.CreditDebit == CreditDebit.DB) { db_amnt = amount * (decimal)tcdi.NumberValue; } else { cr_amnt = amount * (decimal)tcdi.NumberValue; } break; default: if (tcdi.CreditDebit == CreditDebit.DB) { db_amnt = amount - remain_amnt; } else { cr_amnt = amount - remain_amnt; } break; } if (tcdi.CreditDebit == CreditDebit.DB) { remain_amnt += db_amnt; } else { remain_amnt += cr_amnt; } } else { if (tcdi.CreditDebit == CreditDebit.DB) { db_amnt = amount; } else { cr_amnt = amount; } } tid.DB_Amount = db_amnt; tid.CR_Amount = cr_amnt; tid.DocID = trandayInfo.DocID; // =============================== // kiểm tra điều kiện hạch toán == // =============================== decimal temp_amnt = 0; if (tcdi.CreditDebit == CreditDebit.DB) { temp_amnt = tid.DB_Amount; } else { temp_amnt = tid.CR_Amount; } if (!CheckAccountRules(tmpAc, tcdi.CreditDebit, temp_amnt)) { _res.SetError("15", _msgRule); if (logger.IsErrorEnabled) { logger.Error(string.Format("{0}\t{1}", _res.error_code, _res.error_msg)); } _dalTranday.ClearCommand(); return(_res); } // =============================== // ghi nợ tài khoản tmpAc.d_Debit += tid.DB_Amount; tmpAc.w_Debit += tid.DB_Amount; tmpAc.m_Debit += tid.DB_Amount; tmpAc.q_Debit += tid.DB_Amount; tmpAc.y_Debit += tid.DB_Amount; // ghi có tài khoản. tmpAc.d_Credit += tid.CR_Amount; tmpAc.w_Credit += tid.CR_Amount; tmpAc.m_Credit += tid.CR_Amount; tmpAc.q_Credit += tid.CR_Amount; tmpAc.y_Credit += tid.CR_Amount; tmpAc.Last_Date = DateTime.Now; // Cập nhật số dư mới tid.BalanceAvaiable = tmpAc.BalanceAvaiable; // thực hiện câu lệnh // Kiểm tra điều kiện số dư hạch toán nợ/có if ((tid.DB_Amount == 0) && (tid.CR_Amount == 0)) { break; } else { _dalTranday.AddCommand(trand.CreateOneTrandayDetail(tid)); _dalTranday.AddCommand(dalAc.EditOneAccount(tmpAc)); // ghi nhận tổng nợ và tổng có sum_db_amnt += db_amnt; sum_cr_amnt += cr_amnt; } } // end forearch #endregion // với bút toán nhiều chân thì kiểm tra cân đối tổng nợ và tổng có if (list.Count > 1) { if (sum_cr_amnt != sum_db_amnt) { // không cân đối giữa tổng nợ và tổng có _res.SetError("52", string.Format("total debit ({0}) and total credit ({1}) is difference", sum_db_amnt, sum_cr_amnt)); if (logger.IsErrorEnabled) { logger.Error(string.Format("{0}\t{1}", _res.error_code, _res.error_msg)); } _dalTranday.ClearCommand(); return(_res); } } if (string.IsNullOrEmpty(_docId)) { _docId = trandayInfo.DocID; } if (!string.IsNullOrEmpty(trancodeInfo.NextCode)) { Retail(trancodeInfo.NextCode, accountId, amount, descript); } else // ghi nhận hạch toán if (_dalTranday.Execute()) // Lấy thông tin giao dịch { _res.Transactions = base.GetTrandayById(_docId).RenderXML(); _docId = String.Empty; } else { _res.SetError("99", _dalTranday.GetException.Message); if (logger.IsErrorEnabled) { logger.Error(string.Format("{0}\t{1}", _res.error_code, _res.error_msg)); } _docId = String.Empty; _dalTranday.ClearCommand(); } } catch (Exception ex) { _res.SetError("99", ex.Message); if (logger.IsErrorEnabled) { logger.Error(ex); } _docId = String.Empty; _dalTranday.ClearCommand(); } return(_res); }