protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (!IsValidSession())
                {
                    string str = Request.QueryString.ToString();
                    if (str == string.Empty)
                        Response.Redirect("LogIn.aspx?refPage=default.aspx");
                    else
                        Response.Redirect("LogIn.aspx?refPage=default.aspx?" + str);
                }

                if (!IsPostBack)
                {
                    userId = 1;
                    isNewEntry = true;

                    this.Clear();
                    this.LoadMonthDropDown();
                    this.LoadMarketDropDown();

                    if (Request.QueryString["tid"] != null)
                    {
                        int tenantid = int.Parse(Request.QueryString["tid"].ToString());

                        if (tenantid > 0)
                        {
                            Tenant tenant= new Tenant().GetTenantById(tenantid);

                            lblTenantId.Text = tenant.Id.ToString();
                            txtTenantName.Text = tenant.TenantName;
                            txtTotalDue.Text = tenant.OutstandingAmount.ToString();

                            DataTable dtShop = new ShopeMapping().GetShopeMappingByTenantId(tenantid);
                            if (dtShop.Rows.Count > 0)
                            {
                                ddlMarket.SelectedValue = dtShop.Rows[0]["MarketId"].ToString();
                                lblShopId.Text = dtShop.Rows[0]["ShopeId"].ToString();
                                txtShopNo.Text = new Shop().GetShopById(int.Parse(lblShopId.Text)).ShopNo;
                                txtServiceCharge.Text = dtShop.Rows[0]["ServiceCharge"].ToString();
                                txtMonthlyRent.Text = dtShop.Rows[0]["MonthlyRent"].ToString();
                                txtMiscBill.Text = dtShop.Rows[0]["MiscBill"].ToString();

                                isNewEntry = true;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {

                Alert.Show(ex.Message);
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        private void ShowTenantDetails(int id)
        {
            Tenant tenant = new Tenant().GetTenantById(id);

            lblId.Text = tenant.Id.ToString();
            txtName.Text = tenant.TenantName;
            txtAddress.Text = tenant.Address;
            txtContactNo.Text = tenant.ContactNo;
            txtFatherName.Text = tenant.FathersNames;

            tenantDetails = new List<TenantDetails>();

            DataTable dtMapping = new ShopeMapping().GetShopeMappingByTenantId(tenant.Id);
            if (dtMapping.Rows.Count > 0)
            {
                foreach (DataRow row in dtMapping.Rows)
                {
                    TenantDetails _tenantDetails = new TenantDetails();
                    _tenantDetails.Id = int.Parse(row["Id"].ToString());
                    _tenantDetails.marketId = int.Parse(row["marketId"].ToString());
                    _tenantDetails.marketName = row["marketName"].ToString();
                    this.LoadShopDropDown(_tenantDetails.marketId);
                    _tenantDetails.ShopNo = row["shopNo"].ToString();
                    _tenantDetails.advance = (row["Advance"] == DBNull.Value) ? 0 : decimal.Parse(row["Advance"].ToString());
                    _tenantDetails.contractDate = DateTime.Parse(row["contractDate"].ToString());
                    _tenantDetails.contractValidYear = (row["ContractValidYear"] == DBNull.Value) ? 0 : int.Parse(row["ContractValidYear"].ToString());
                    _tenantDetails.monthlyRent = (row["monthlyRent"] == DBNull.Value) ? 0 : decimal.Parse(row["monthlyRent"].ToString());
                    _tenantDetails.previousDue = (row["PreviousDue"] == DBNull.Value) ? 0 : decimal.Parse(row["PreviousDue"].ToString());
                    _tenantDetails.serviceCharge = (row["serviceCharge"] == DBNull.Value) ? 0 : decimal.Parse(row["serviceCharge"].ToString());
                    _tenantDetails.shopId = int.Parse(row["shopeId"].ToString());
                    _tenantDetails.miscBill = (row["miscBill"] == DBNull.Value) ? 0 : decimal.Parse(row["miscBill"].ToString());

                    tenantDetails.Add(_tenantDetails);
                }

                if (tenantDetails.Count == 1)
                {
                    TenantDetails details = tenantDetails[0];
                    ddlMarket.SelectedValue = details.marketId.ToString();
                    this.LoadShopDropDown(int.Parse(ddlMarket.SelectedValue));
                    ddlShop.SelectedValue = details.shopId.ToString();
                    txtMonthlyRent.Text = details.monthlyRent.ToString();
                    txtAdvance.Text = details.advance.ToString();
                    txtServiceCharge.Text = details.serviceCharge.ToString();
                    dtpContractDate.SelectedDate = details.contractDate;
                    txtContractYear.Text = details.contractValidYear.ToString();
                    txtPrevDue.Text = details.previousDue.ToString();
                    txtMiscBill.Text = details.miscBill.ToString();

                    isNewDetailEntry = false;
                    btnAddDetail.Visible = false;
                }
                else
                {
                    btnAddDetail.Visible = true;
                }
            }
            else
            {
                tenantDetails.Add(new TenantDetails());
            }

            this.LoadGridView();
        }
        protected void btnGenerate_Click(object sender, EventArgs e)
        {
            StringBuilder strSuccess=new StringBuilder();
            StringBuilder strFailure = new StringBuilder();

            strSuccess.Append("<strong>Success</strong><br>");
            strFailure.Append("<strong>Failure</strong><br>");

            try
            {
                if (ddlMarket.SelectedIndex <= 0)
                {
                    Alert.Show("Please select a market first.");
                    ddlMarket.Focus();
                    return;
                }

                int marketId = int.Parse(ddlMarket.SelectedValue);
                List<Shop> shopList = new Shop().GetAllShopByMarketId(marketId);
                BillMaster billMaster = new BillMaster();
                BillDetail billDetail = new BillDetail();

                foreach (ListItem li in cbListShops.Items)
                {
                    if (!li.Selected) continue;

                    int shopId = int.Parse(li.Value);

                    Shop shop = shopList.Find(x => x.Id == shopId);
                    try
                    {
                        #region process bill master data

                        string monthYearText = ddlMonth.SelectedItem.Text;
                        string monthYearVal = ddlMonth.SelectedValue;

                        ShopeMapping shopeMapping = new ShopeMapping().GetAllShopeMappingByShopId(shop.Id);

                        billMaster.BilGeneratelDate = DateTime.Parse(txtDate.Text);
                        billMaster.BillMonth = monthYearText.Substring(5);
                        billMaster.BillYear = int.Parse(monthYearText.Substring(0, 4));
                        billMaster.TenantId = shopeMapping.TenantId;

                        billMaster.BillNo = billMaster.BillYear + "-" + monthYearVal.Substring(5) + "-" +
                                            shop.Id + "-" + shopeMapping.TenantId;

                        billMaster.GenerateBy = 1;
                        billMaster.ApprovedBy = 0;
                        billMaster.TotalAmount = 0;
                        billMaster.TotalPayment = 0;
                        billMaster.LastPaymentDate = (DateTime) dtpLastDate.SelectedDate;

                        string MonthVal = ddlMonth.SelectedValue.Substring(5);
                        billMaster.BillMonthId = int.Parse(MonthVal);
                        int success = 0;

                        int billId = billMaster.CheckExistanceByBillNo(billMaster.BillNo);
                        if (billId > 0)
                        {
                            if (!chkUpdateExisting.Checked)
                            {
                                strFailure.Append("Bill already generated for the shop: " + shop.ShopNo + "<br>");
                                continue;
                            }

                            billMaster.Id = billId;
                            success = billMaster.UpdateBillMaster();
                        }
                        else
                        {
                            success = billMaster.InsertBillMaster();
                            billMaster.Id = new BillMaster().GetLastId();
                        }

                    #endregion

                        #region process bill detail data

                        if (success > 0)
                        {
                            billDetail = new BillDetail();
                            billDetail.BillMasterId = billMaster.Id;
                            billDetail.MarketId = int.Parse(ddlMarket.SelectedValue);
                            billDetail.ShopId = shop.Id;
                            billDetail.MonthlyRent = shopeMapping.MonthlyRent;
                            billDetail.ServiceCharge = shopeMapping.ServiceCharge;
                            billDetail.MiscBills = shopeMapping.MiscBill;

                            if (chkPrevDue.Checked)
                            {
                                DueInstallment installment = new DueInstallment().GetDueInstallmentByTenant(billMaster.TenantId);
                                if (installment.Id != 0)
                                {
                                    billDetail.PreviousDue = installment.InstallmentAmount;
                                    if (installment.DueAmount < installment.InstallmentAmount)
                                        billDetail.PreviousDue = installment.DueAmount;
                                }
                                else
                                {
                                    if (billDetail.CheckBillExistenceByTenant(billMaster.TenantId, shop.Id) > 0)
                                        billDetail.PreviousDue = billDetail.GetLastDueTenantAndShopWise(billMaster.TenantId, shop.Id);
                                    else
                                        billDetail.PreviousDue = new ShopeMapping().GetAllShopeMappingByShopId(shop.Id).PreviousDue;
                                }

                            }
                            else
                                billDetail.PreviousDue = 0;

                            billDetail.LateFee = Math.Round((shopeMapping.MonthlyRent*5)/100,0);
                            billDetail.Payment = 0;
                            billDetail.IsClosed = false;
                            billDetail.ClosedBy = 0;

                            if (billId > 0)
                            {
                                int billDetailId = billDetail.GetBillDetailIdByMasterId(billId);
                                if (billDetailId > 0)
                                {
                                    billDetail.Id = billDetailId;
                                    success = billDetail.UpdateBillDetail();
                                }
                                else
                                    success = billDetail.InsertBillDetail();
                            }
                            else
                                success = billDetail.InsertBillDetail();

                            //update total amount in master table
                            if (success > 0)
                            {
                                decimal totalAmount = (billDetail.MonthlyRent + billDetail.ServiceCharge +
                                                       billDetail.MiscBills +
                                                       billDetail.PreviousDue);

                                billMaster.UpdateTotalAmount(billMaster.Id, totalAmount);

                                strSuccess.Append("Bill generated for Shop: " + shop.ShopNo + "<br>");
                            }
                        }

                        #endregion

                    }

                    catch (Exception ex)
                    {
                        strFailure.Append("Bill generate failed for Shop " + shop.ShopNo + ". Error: " + ex.Message +
                                          "<br>");
                        continue;
                    }
                }

                strFailure.Append("<br><br>");

                ltrStatus.Text = strFailure.ToString() + strSuccess.ToString();
            }
            catch (Exception ex)
            {

                Alert.Show(ex.Message);
            }
        }
        protected void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                if (txtName.Text == string.Empty)
                {
                    lblMessage.Text = "Please enter the tenant name.";
                    txtName.Focus();
                    return;
                }
                //if (txtFatherName.Text == string.Empty)
                //{
                //    lblMessage.Text = "Please enter the tenant name.";
                //    txtFatherName.Focus();
                //    return;
                //}

                Tenant obj = new Tenant();

                obj.TenantName = txtName.Text;
                obj.FathersNames = txtFatherName.Text;
                obj.Address = txtAddress.Text;
                obj.ContactNo = txtContactNo.Text;
                obj.IsActive = true;
                obj.OutstandingAmount = 0;
                obj.NoOfShops = tenantDetails.Count;

                int success = 0;

                if (isNewEntry)
                {
                    obj.Id = new Tenant().GetMaxTenantId();
                    obj.Id = obj.Id + 1;
                    success = obj.InsertTenant();
                }
                else
                {
                    obj.Id = int.Parse(lblId.Text);
                    success = obj.UpdateTenant();
                }

                if (success == 1)
                {

                    if (tenantDetails.Count == 1)
                    {
                        //convert unicode to decimal
                        string strMonthlyRent = Encode.HtmlEncode(txtMonthlyRent.Text);
                        decimal decMonthlyRent = 0;
                        try
                        {
                            decMonthlyRent = decimal.Parse(strMonthlyRent);
                        }
                        catch (Exception ex)
                        {
                            Alert.Show("দয়া করে সার্ভিস চার্জ ফিল্ডে শুধুমাত্র নাম্বার প্রবেশ করুন।");
                            txtMonthlyRent.Focus();
                            return;
                        }

                        string strServcieCharge = Encode.HtmlEncode(txtServiceCharge.Text);
                        decimal decServiceCharge = 0;
                        try
                        {
                            decServiceCharge = decimal.Parse(strServcieCharge);
                        }
                        catch (Exception ex)
                        {
                            Alert.Show("দয়া করে সার্ভিস চার্জ ফিল্ডে শুধুমাত্র নাম্বার প্রবেশ করুন।");
                            txtServiceCharge.Focus();
                            return;
                        }

                        string strMiscBill = Encode.HtmlEncode(txtMiscBill.Text);
                        decimal decMiscBill = 0;
                        try
                        {
                            decMiscBill = decimal.Parse(strMiscBill);
                        }
                        catch (Exception ex)
                        {
                            Alert.Show("দয়া করে বিবিধ বিল ফিল্ডে শুধুমাত্র নাম্বার প্রবেশ করুন।");
                            txtMiscBill.Focus();
                            return;
                        }
                        string strAdvance = Encode.HtmlEncode(txtAdvance.Text);
                        decimal decAdvance = 0;
                        try
                        {
                            decAdvance = decimal.Parse(strAdvance);
                        }
                        catch (Exception ex)
                        {
                            Alert.Show("দয়া করে অগ্রিম ফিল্ডে শুধুমাত্র নাম্বার প্রবেশ করুন।");
                            txtAdvance.Focus();
                            return;
                        }
                        string strPrevDue = Encode.HtmlEncode(txtPrevDue.Text);
                        decimal decPrevDue = 0;
                        try
                        {
                            decPrevDue = decimal.Parse(strPrevDue);
                        }
                        catch (Exception ex)
                        {
                            Alert.Show("দয়া করে পূর্ববর্তী বকেয়া ফিল্ডে শুধুমাত্র নাম্বার প্রবেশ করুন।");
                            txtPrevDue.Focus();
                            return;
                        }
                        string strYear = Encode.HtmlEncode(txtContractYear.Text);
                        int decYear = 0;
                        try
                        {
                            decYear = int.Parse(strYear);
                        }
                        catch (Exception ex)
                        {
                            Alert.Show("দয়া করে চুক্তির মেয়াদ ফিল্ডে শুধুমাত্র নাম্বার প্রবেশ করুন।");
                            txtContractYear.Focus();
                            return;
                        }

                        TenantDetails objDetails = tenantDetails.Find(x => x.marketId == int.Parse(ddlMarket.SelectedValue) &&
                           x.shopId == int.Parse(ddlShop.SelectedValue));
                        if (objDetails.marketId == 0)
                            objDetails = new TenantDetails();
                        else
                            tenantDetails.Remove(objDetails);

                        objDetails.marketId = int.Parse(ddlMarket.SelectedValue);
                        objDetails.shopId = int.Parse(ddlShop.SelectedValue);
                        objDetails.marketName = ddlMarket.Text;
                        objDetails.ShopNo = ddlShop.SelectedText;
                        objDetails.contractValidYear = decYear;
                        objDetails.previousDue = decPrevDue;
                        objDetails.monthlyRent = decMonthlyRent;
                        objDetails.serviceCharge = decServiceCharge;
                        objDetails.advance = decAdvance;
                        objDetails.miscBill = decMiscBill;
                        objDetails.contractDate = dtpContractDate.SelectedDate ?? DateTime.Today;
                        if (tenantDetails.Count == 0 || tenantDetails[0].shopId == 0)
                            tenantDetails = new List<TenantDetails>();

                        tenantDetails.Add(objDetails);

                    }
                    //obj = obj.GetTenantById(obj.Id);

                    foreach (TenantDetails tenantDetail in tenantDetails)
                    {
                        ShopeMapping objMapping=new ShopeMapping();
                        objMapping.TenantId = obj.Id;
                        objMapping.MarketId = tenantDetail.marketId;
                        objMapping.ShopeId = tenantDetail.shopId;
                        objMapping.MonthlyRent = tenantDetail.monthlyRent;
                        objMapping.ServiceCharge = tenantDetail.serviceCharge;
                        objMapping.Advance = tenantDetail.advance;
                        objMapping.MiscBill = tenantDetail.miscBill;
                        objMapping.ContractDate = (DateTime) tenantDetail.contractDate;
                        objMapping.ContractValidYear = tenantDetail.contractValidYear;
                        objMapping.PreviousDue = tenantDetail.previousDue;

                        objMapping.Id = new ShopeMapping().GetId(objMapping.TenantId, objMapping.ShopeId);

                        if (objMapping.Id == 0)
                            success = objMapping.InsertShopeMapping();
                        else
                            success = objMapping.UpdateShopeMapping();

                        if (success == 0)
                        {
                            lblMessage.Text ="The tenant information saved successfully, but failed to save shop mapping.";
                            lblMessage.ForeColor = Color.Red;
                            return;
                        }

                    }

                    Alert.Show("Data saved successfully.");

                    lblId.Text = obj.Id.ToString();

                    isNewEntry = false;

                }
            }
            catch (Exception ex)
            {

                Alert.Show(ex.Message);
            }
        }