protected override void btnDelete_Click(object sender, EventArgs e)
        {
            try
            {
                base.btnDelete_Click(sender, e);

                using (ThanhVanTranSysEntities context = new ThanhVanTranSysEntities())
                {
                    RevenueDetail revenueDetail = context.RevenueDetails.SingleOrDefault(i => i.id == tbId.Text.Trim());
                    AppLogger.logInfo("btnSave_Click", "DELETE", revenueDetail);

                    if (revenueDetail != null)
                    {
                        return;
                    }

                    context.RevenueDetails.DeleteObject(revenueDetail);
                }

                LoadExpenseDetail();
            }
            catch (Exception exc)
            {
                AppLogger.logError("btnDelete_Click", exc);
            }
        }
        protected override void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                string errorMessage = ValidInput();
                if (string.IsNullOrEmpty(errorMessage) == false)
                {
                    MessageBox.Show(errorMessage, "Cảnh báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                if (MessageBox.Show("Thay đổi thông tin chi tiết của Doanh thu có thể làm thay đổi tổng doanh thu.\r\n Bạn có chắc chắn muốn thay đổi không?"
                                    , "Chú ý"
                                    , MessageBoxButtons.YesNo
                                    , MessageBoxIcon.Warning
                                    , MessageBoxDefaultButton.Button2) == System.Windows.Forms.DialogResult.No)
                {
                    return;
                }

                base.btnSave_Click(sender, e);

                using (ThanhVanTranSysEntities context = new ThanhVanTranSysEntities())
                {
                    RevenueDetail expenseDetail = _isUpdating ? context.RevenueDetails.SingleOrDefault(i => i.id == tbId.Text.Trim())
                            : new RevenueDetail();

                    expenseDetail.id           = IsUpdating ? tbId.Text : IDGenerator.ExpenseId();
                    expenseDetail.object_id    = tbObjectId.Text;
                    expenseDetail.revenue_id   = _revenueId;
                    expenseDetail.amount       = CurrencyUtil.ToDecimal(tbAmount.Text);
                    expenseDetail.created_by   = _isUpdating ? expenseDetail.created_by : SystemParam.CurrentUser.id;
                    expenseDetail.created_date = _isUpdating ? expenseDetail.created_date : dtpCreateDate.Value;
                    expenseDetail.description  = tbRemark.Text;
                    expenseDetail.type         = cbType.SelectedValue.ToString();
                    expenseDetail.title        = string.Empty;

                    AppLogger.logInfo("btnSave_Click", IsUpdating ? "UPDATE" : "INSERT", expenseDetail);

                    if (IsUpdating == false)
                    {
                        context.RevenueDetails.AddObject(expenseDetail);
                    }

                    context.SaveChanges();

                    ChangeViewStatus(false);
                }

                UpdateExpenseAmount();

                LoadExpenseDetail();
            }
            catch (Exception exc)
            {
                AppLogger.logError("btnSave_Click", exc);
            }
        }
        private void btnOK_Click(object sender, EventArgs e)
        {
            try
            {
                if (ValidateInput() &&
                    MessageBox.Show("Quyết toán những hóa đơn đã chọn?", Constants.Messages.CONFIRMATION_CAPTION, MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
                {
                    // TO DO: add order info to Revenue
                    var selectedOrders = new Collection<IrregularOrder>();
                    decimal totalPayment = 0;

                    Revenue revenue = new Revenue();
                    revenue.id = IDGenerator.RevenueId();
                    revenue.type = Constants.RevenueType.IrregularOrder.ToString();
                    revenue.name = Constants.RevenueType.IrregularOrder.GetDescription();
                    revenue.description = string.Empty;
                    revenue.created_date = DateTime.Now;
                    revenue.created_by = SystemParam.CurrentUser.id;

                    List<RevenueDetail> revenueDetails = new List<RevenueDetail>();
                    foreach (DataGridViewRow row in _checkedRows)
                    {
                        string id = row.Cells["IDColumn"].Value.ToString();
                        var order = _orders.FirstOrDefault(o => o.id.Equals(id));
                        if (order != null)
                        {
                            order.order_status = Constants.DeliveryStatus.Closed.ToString();
                            selectedOrders.Add(order);

                            RevenueDetail detail = new RevenueDetail();
                            detail.id = IDGenerator.RevenueDetailId();
                            detail.revenue_id = revenue.id;
                            detail.object_id = order.id;
                            detail.title = Constants.RevenueType.IrregularOrder.GetDescription();
                            detail.type = Constants.RevenueType.IrregularOrder.ToString();
                            detail.amount = order.total_cost;
                            totalPayment += order.total_cost;
                            detail.description = string.Empty;
                            detail.created_date = DateTime.Now;
                            detail.created_by = SystemParam.CurrentUser.id;
                            revenueDetails.Add(detail);
                        }
                    }
                    revenue.amount = totalPayment;
                    if (selectedOrders.Count > 0)
                    {
                        string result = _business.Update(selectedOrders);
                        if (string.IsNullOrEmpty(result))
                        {
                            result = _revenueBusiness.Insert(revenue, revenueDetails);
                            if (string.IsNullOrEmpty(result))
                            {
                                MessageBox.Show("Quyết toán đơn hàng thành công.");
                                DataBind();
                            }
                            else
                            {
                                MessageBox.Show(result, Constants.Messages.ERROR_CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                        }
                        else
                        {
                            MessageBox.Show(result, Constants.Messages.ERROR_CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                AppLogger.logError(this.ToString(), ex);
            }
        }
        private string CompleteTickets(List <Ticket> tickets)
        {
            string  result           = string.Empty;
            decimal totalPayment     = 0;
            decimal totalExpense     = CurrencyUtil.ToDecimal(tbExpense.Text);
            decimal adjustment       = CurrencyUtil.ToDecimal(tbAdjustmentAmount.Text);
            string  adjustmentReason = tbAdjustmentReason.Text;

            Revenue revenue = new Revenue();

            revenue.id           = IDGenerator.RevenueId();
            revenue.type         = Constants.RevenueType.Ticket.ToString();
            revenue.name         = "Bán vé";
            revenue.description  = string.Empty;
            revenue.created_date = DateTime.Now;
            revenue.created_by   = SystemParam.CurrentUser.id;
            List <RevenueDetail> revenueDetails = new List <RevenueDetail>();

            foreach (var ticket in tickets)
            {
                ticket.status = Constants.TicketStatus.Closed.ToString();

                // Updates tickets
                result = _ticketBusiness.CompleteTicket(ticket.id);

                RevenueDetail detail = new RevenueDetail();
                detail.id           = IDGenerator.RevenueDetailId();
                detail.revenue_id   = revenue.id;
                detail.object_id    = ticket.id;
                detail.title        = "Bán vé";
                detail.type         = Constants.RevenueType.Ticket.ToString();
                detail.amount       = ticket.cost;
                totalPayment       += ticket.cost;
                detail.description  = string.Empty;
                detail.created_date = DateTime.Now;
                detail.created_by   = SystemParam.CurrentUser.id;
                revenueDetails.Add(detail);
            }
            revenue.amount = totalPayment;

            // Inserts revenue & details
            if (string.IsNullOrEmpty(result))
            {
                result = _revenueBusiness.Insert(revenue, revenueDetails);
            }
            // Inserts expense
            if (string.IsNullOrEmpty(result))
            {
                if (totalExpense != 0)
                {
                    Expense expense = new Expense();
                    expense.id           = IDGenerator.RevenueId();
                    expense.type         = Constants.RevenueType.Ticket.ToString();
                    expense.name         = "Bán vé";
                    expense.amount       = totalExpense;
                    expense.description  = string.Empty;
                    expense.created_date = DateTime.Now;
                    expense.created_by   = SystemParam.CurrentUser.id;
                    result = _expenseBusiness.Insert(expense);
                }
            }
            // Inserts adjustment
            if (string.IsNullOrEmpty(result))
            {
                if (adjustment > 0)
                {
                    Revenue adjustmentRevenue = new Revenue();
                    adjustmentRevenue.id           = IDGenerator.RevenueId();
                    adjustmentRevenue.type         = Constants.RevenueType.Adjustment.ToString();
                    adjustmentRevenue.name         = "Điều chỉnh - Bán vé";
                    adjustmentRevenue.amount       = Math.Abs(adjustment);
                    adjustmentRevenue.description  = adjustmentReason;
                    adjustmentRevenue.created_date = DateTime.Now;
                    adjustmentRevenue.created_by   = SystemParam.CurrentUser.id;
                    result = _revenueBusiness.Insert(adjustmentRevenue);
                }
                else if (adjustment < 0)
                {
                    Expense adjustmentExpense = new Expense();
                    adjustmentExpense.id           = IDGenerator.RevenueId();
                    adjustmentExpense.type         = Constants.RevenueType.Adjustment.ToString();
                    adjustmentExpense.name         = "Điều chỉnh - Bán vé";
                    adjustmentExpense.amount       = Math.Abs(adjustment);
                    adjustmentExpense.description  = adjustmentReason;
                    adjustmentExpense.created_date = DateTime.Now;
                    adjustmentExpense.created_by   = SystemParam.CurrentUser.id;
                    result = _expenseBusiness.Insert(adjustmentExpense);
                }
            }
            return(result);
        }