//todo break this method into small methods
        public bool GenerateBill(int tenantId, int pricePerUnit, int currentMeterReading)
        {
            using (var scope = new TransactionScope())
            {
                var meterReadingRepository = new TenantMeterReadingRepository();
                int prevMonthMeterReading = meterReadingRepository.GetPreviousMonthMeterReading(tenantId);

                //create object of meter reading class as per current meter reading
                var tenantMeterReading = new TenantMeterReading
                    {
                        TenantId = tenantId,
                        MeterReading = currentMeterReading,
                        CreatedDate = DateTime.Now
                    };

                //calculate amount payable for current month
                int currentMonthUnitConsumed = tenantMeterReading.MeterReading - prevMonthMeterReading;
                double amountPayable = currentMonthUnitConsumed*pricePerUnit;
                // create object of bill payable class
                var billPayable = new BillPayable
                    {
                        TenantId = tenantId,
                        PricePerUnit = pricePerUnit,
                        UnitConsumed = currentMonthUnitConsumed,
                        AmountPayable = amountPayable,
                        CreatedDate = DateTime.Now
                    };

                //add amount payable class object
                var billPayableRepository = new BillPayableRepository();
                var billPaymentRepository = new BillPaymentRepository();

                meterReadingRepository.Add(tenantMeterReading);
                billPayableRepository.Add(billPayable);

                var lastBillPaid = billPaymentRepository.GetLastBillPaid(tenantId); //todo need both last bill paid amount and date

                var billInvoice = new BillInvoice
                    {
                        TenantId = tenantId,
                        CurrentMonthPayamentAmount = billPayable.AmountPayable,
                        LastBillPaid = (lastBillPaid == null) ? 0.00 : lastBillPaid.AmountPaid,
                        PendingAmount = 0,
                        LastBillPaidDate = DateTime.Now, //todo this will be changed
                        CreatedDate = DateTime.Now
                    };

                var billInvoiceRepository = new BillInvoiceRepository();
                billInvoiceRepository.Add(billInvoice);

                scope.Complete();
            }
            return true;
        }
        public bool Add(BillInvoice billInvoice)
        {
            using (var connection = new SqlConnection(Utility.ConnectionString))
            {
                var cmd =
                    new SqlCommand(
                        "INSERT INTO BillInvoice (tenantId, curentMonthPayableAmount, PendingAmount, LastBillPaidAmount, LastBillPaidDate, createdDate) VALUES (@tenantId, @currentMonthPayableAmount, @PendingAmount, @LastBillPaidAmount, @LastBillPaidDate, @createdDate)")
                        {
                            CommandType = CommandType.Text,
                            Connection = connection
                        };
                cmd.Parameters.AddWithValue("@tenantId", billInvoice.TenantId);
                cmd.Parameters.AddWithValue("@currentMonthPayableAmount", billInvoice.CurrentMonthPayamentAmount);
                cmd.Parameters.AddWithValue("@PendingAmount", billInvoice.PendingAmount);
                cmd.Parameters.AddWithValue("@LastBillPaidAmount", billInvoice.LastBillPaid);
                cmd.Parameters.AddWithValue("@LastBillPaidDate", billInvoice.LastBillPaidDate);
                cmd.Parameters.AddWithValue("@createdDate", billInvoice.CreatedDate);
                connection.Open();
                cmd.ExecuteNonQuery();
            }
            return true;

            return true;
        }