public ActionResult Create(TariffViewModel tariffViewModel)
        {
            string fuel = tariffViewModel.fuel;
            int meterId = tariffViewModel.meterId;
            int propertyId = tariffViewModel.BelongsToProperty;

            try
            {
                if (ModelState.IsValid)
                {
                    Tariff tariff = TariffConverter.createTariffFromViewModel(tariffViewModel);

                    EMResponse response = JsonConvert.DeserializeObject<EMResponse>(emAPI.createTariff(tariff.SCValue, tariff.StartDate.ToString(),
                                                                                tariff.SCPeriod.Id, tariff.BandPeriod.Id, tariffViewModel.meterId));

                    if (response.status == EMResponse.OK)
                    {
                        int tariffId = JsonConvert.DeserializeObject<int>(response.data);

                        foreach (TariffBand band in tariff.Bands)
                        {
                            EMResponse bandResponse = JsonConvert.DeserializeObject<EMResponse>(emAPI.createTariffBand(band.UpperkWhLimit,
                                                                                                                        band.LowerkWhLimit,
                                                                                                                        band.UnitRate, tariffId));
                            if (bandResponse.status != EMResponse.OK)
                            {
                                return View("Error");
                            }

                        }

                        return RedirectToAction("Home", "Meter", new { meterId = tariffViewModel.meterId, propertyId = tariffViewModel.BelongsToProperty, type = tariffViewModel.fuel });
                    }
                }
                else
                {
                    return View(tariffViewModel);
                }

                return View(tariffViewModel);
            }
            catch
            {
                return View("Error");
            }
        }
        //
        // GET: /Tariff/Create
        public ActionResult Create(int meterId, int propertyId, string fuel)
        {
            try
            {
                TariffViewModel model = new TariffViewModel();
                model.fuel = fuel;
                model.meterId = meterId;
                model.BelongsToProperty = propertyId;
                model.MinimumStartDate = Convert.ToDateTime(ResponseReader.convertTo<string>(emAPI.getMinimumTariffDate(meterId)));
                model.StartDate = model.MinimumStartDate;

                ///cannot convert from JSON to a List<Period>, despite JSON being valid.  Therefore SCPeriods is populated on ViewModel creation, see TariffViewModel.cs.
                return View(model);
            }
            catch
            {
                return View("Error");
            }
        }
        //
        // GET: /Tariff/Edit/5
        public ActionResult Edit(int tariffId, int meterId, int propertyId, string type)
        {
            try
            {
                TariffViewModel model = new TariffViewModel();

                Tariff tariff = ResponseReader.convertTo<Tariff>(emAPI.getTariff(tariffId));
                model = TariffConverter.createTariffViewFromTariff(tariff, true);
                TimeSpan oneDay = new TimeSpan(1, 0, 0, 0);
                model.MinimumStartDate = Convert.ToDateTime(ResponseReader.convertTo<string>(emAPI.getMinimumTariffDateForEdit(meterId)));
                model.StartDate = model.MinimumStartDate + oneDay;
                model.meterId = meterId;
                model.BelongsToProperty = propertyId;
                model.fuel = type;

                return View(model);
            }
            catch
            {
                return View("Error");
            }
        }
        public ActionResult Edit(int id, TariffViewModel model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    Tariff updatedTariff = TariffConverter.createTariffFromViewModel(model);
                    string updatedTariffJSON = JsonConvert.SerializeObject(updatedTariff);

                    EMResponse response = JsonConvert.DeserializeObject<EMResponse>(emAPI.editTariff(id, updatedTariffJSON));

                    if (response.status == EMResponse.OK)
                    {
                        return RedirectToAction("Home", "Meter", new { meterId = model.meterId, propertyId = model.BelongsToProperty, type = model.fuel });
                    }
                    else
                    {
                        return View("Error");
                    }
                }

                return View(model);
            }
            catch
            {
                return View("Error");
            }
        }
 public ActionResult Delete(TariffViewModel model)
 {
     try
     {
         EMResponse response = JsonConvert.DeserializeObject<EMResponse>(emAPI.deleteTariff(model.Id));
         if (response.status == EMResponse.OK)
         {
             return RedirectToAction("Home", "Meter", new { meterId = model.meterId, propertyId = model.BelongsToProperty, type = model.fuel });
         }
         else
         {
             return View("Error");
         }
     }
     catch
     {
         return View("Error");
     }
 }
        public MeterViewModel(Meter m)
        {
            ///populate fiel specific properties
            ///

            ElectricityMeter elecMeter = m as ElectricityMeter;
            GasMeter         gasMeter  = m as GasMeter;

            if (elecMeter != null)
            {
                this.ScalingFactor = elecMeter.ScalingFactor;
            }
            else if (gasMeter != null)
            {
                this.MeterCoefficient = gasMeter.MeterCoefficient;
                this.CorrectionFactor = gasMeter.CorrectionFactor;
                this.CalorificValue   = gasMeter.CalorificValue;

                if (gasMeter.MeterCoefficient == 0.028316846)
                {
                    this.MeterUnits = "cubic feet";
                }
                if (gasMeter.MeterCoefficient == 0.28316846)
                {
                    this.MeterUnits = "10s of cubic feet";
                }
                if (gasMeter.MeterCoefficient == 2.8316846)
                {
                    this.MeterUnits = "100s of cubic feet";
                }
                if (gasMeter.MeterCoefficient == 1)
                {
                    this.MeterUnits = "cubic meters";
                }
            }


            ///load tariff view model with data from meter
            ///

            Meter  = m;
            Tariff = new TariffViewModel();

            if (Meter.Tariffs.Count == 0)
            {
                ///no tariff set yet
                ///
                Tariff = null;
            }
            else
            {
                ///get most recent tariff
                ///
                Meter.Tariffs = Meter.Tariffs.OrderByDescending(t => t.StartDate).ToList();

                Tariff currentTariff = Meter.Tariffs.ElementAt(0);
                currentTariff.Bands = Meter.Tariffs.ElementAt(0).Bands.ToList();

                ///convert model to viewModel
                ///

                Tariff = TariffConverter.createTariffViewFromTariff(currentTariff, false);
            }
        }
        public MeterViewModel(Meter m)
        {
            ///populate fiel specific properties
            ///

            ElectricityMeter elecMeter = m as ElectricityMeter;
            GasMeter gasMeter = m as GasMeter;

            if (elecMeter != null)
            {
                this.ScalingFactor = elecMeter.ScalingFactor;
            }
            else if ( gasMeter != null)
            {
                this.MeterCoefficient = gasMeter.MeterCoefficient;
                this.CorrectionFactor = gasMeter.CorrectionFactor;
                this.CalorificValue = gasMeter.CalorificValue;

                if (gasMeter.MeterCoefficient == 0.028316846)
                {
                    this.MeterUnits = "cubic feet";
                }
                if (gasMeter.MeterCoefficient == 0.28316846)
                {
                    this.MeterUnits = "10s of cubic feet";
                }
                if (gasMeter.MeterCoefficient == 2.8316846)
                {
                    this.MeterUnits = "100s of cubic feet";
                }
                if (gasMeter.MeterCoefficient == 1)
                {
                    this.MeterUnits = "cubic meters";
                }
            }

            ///load tariff view model with data from meter
            ///

            Meter = m;
            Tariff = new TariffViewModel();

            if (Meter.Tariffs.Count == 0)
            {
                ///no tariff set yet
                ///
                Tariff = null;
            }
            else
            {
                ///get most recent tariff
                ///
                Meter.Tariffs = Meter.Tariffs.OrderByDescending(t => t.StartDate).ToList();

                Tariff currentTariff = Meter.Tariffs.ElementAt(0);
                currentTariff.Bands = Meter.Tariffs.ElementAt(0).Bands.ToList();

                ///convert model to viewModel
                ///

                Tariff = TariffConverter.createTariffViewFromTariff(currentTariff, false);
            }
        }
        public static Tariff createTariffFromViewModel(TariffViewModel tariffViewModel)
        {
            Tariff tariff = new Tariff();

            if (tariffViewModel.Id != 0)
            {
                tariff.Id = tariffViewModel.Id;
            }

            tariff.SCPeriod = new Period { Id = tariffViewModel.SCPeriodId };
            tariff.BandPeriod = new Period { Id = tariffViewModel.BandPeriodId };
            tariff.SCValue = tariffViewModel.SCValue;
            tariff.StartDate = tariffViewModel.StartDate;
            tariff.Bands = new List<TariffBand>();

            TariffBand newBand = new TariffBand();
            newBand.LowerkWhLimit = (int)tariffViewModel.LowerLimit1;
            newBand.UnitRate = (int)tariffViewModel.Rate1;
            newBand.Id = tariffViewModel.Band1Id;

            ///isBanded is determined during conversion to tariffViewModel when the tariff object is retreived in the HTTP GET Edit method
            ///of the TariffController.  It is preserved to HTTP POST Edit via hidden fields in the Edit.cshtml view.

            ///isbanded should be determined at each conversion since the user may want to edit an existing tariff to include additional / fewer bands
            ///

            tariffViewModel.IsBanded = !((tariffViewModel.LowerLimit1 == 0 | tariffViewModel.LowerLimit1 == null) &&
                                        (tariffViewModel.UpperLimit1 == 0 | tariffViewModel.UpperLimit1 == null));

            if (!tariffViewModel.IsBanded)
            {
                ///no upper limit and therefore no subsequent bands

                newBand.UpperkWhLimit = 0;
                tariff.Bands.Add(newBand);
            }
            else
            {
                ///get upperLimit for first band & save to tariff model object
                newBand.UpperkWhLimit = (int)tariffViewModel.UpperLimit1;
                tariff.Bands.Add(newBand);

                ///follow same pattern for second band
                TariffBand newBand2 = new TariffBand();
                newBand2.LowerkWhLimit = (int)tariffViewModel.LowerLimit2;
                newBand2.UnitRate = tariffViewModel.Rate2;
                newBand2.Id = tariffViewModel.Band2Id;

                if ((tariffViewModel.UpperLimit2 == null | tariffViewModel.UpperLimit2 == 0) && (tariffViewModel.LowerLimit2 == 0 | tariffViewModel.LowerLimit2 == null))
                {
                    ///there is no band if lower is null/zero AND upper is null/zero
                    newBand2.UpperkWhLimit = -1; ///no band
                }
                else
                {
                    ///there is a band...
                    if (tariffViewModel.UpperLimit2 != 0)
                    {
                        ///with an upper limit
                        newBand2.UpperkWhLimit = (int)tariffViewModel.UpperLimit2;
                    }
                    else
                    {
                        ///without an upper limit
                        newBand2.UpperkWhLimit = 0;
                    }
                }

                tariff.Bands.Add(newBand2);

                TariffBand newBand3 = new TariffBand();
                newBand3.LowerkWhLimit = (int)tariffViewModel.LowerLimit3;
                newBand3.UnitRate = tariffViewModel.Rate3;
                newBand3.Id = tariffViewModel.Band3Id;

                if ((tariffViewModel.UpperLimit3 == null | tariffViewModel.UpperLimit3 == 0) && (tariffViewModel.LowerLimit3 == 0 | tariffViewModel.LowerLimit3 == null))
                {
                    ///there is no band if lower is null/zero and upper is null/zero
                    newBand3.UpperkWhLimit = -1; ///no band
                }
                else
                {
                    ///there is a band...
                    if (tariffViewModel.UpperLimit3 != 0)
                    {
                        ///with an upper limit
                        newBand3.UpperkWhLimit = (int)tariffViewModel.UpperLimit3;
                    }
                    else
                    {
                        ///without an upper limit
                        newBand3.UpperkWhLimit = 0;
                    }
                }

                tariff.Bands.Add(newBand3);
            }

            return tariff;
        }
        public static TariffViewModel createTariffViewFromTariff(Tariff tariffModel, bool forEditing)
        {
            TariffViewModel tariffView = new TariffViewModel();

            tariffView.Id = tariffModel.Id;
            tariffView.StartDate = tariffModel.StartDate;
            tariffView.SCPeriodId = tariffModel.SCPeriod.Id;
            tariffView.SCValue = tariffModel.SCValue;
            tariffView.BandPeriodId = tariffModel.BandPeriod.Id;

            if (tariffModel.Bands.Count == 0)
            {
                ///there are no bands so we can just return now
                return tariffView;
            }

            else if (tariffModel.Bands.ElementAt(0) != null)
            {
                tariffView.IsBanded = (tariffModel.Bands.ElementAt(0).UpperkWhLimit > 0);
            }
            else
            {
                tariffView.IsBanded = false;
            }

            for (int i = 0; i < tariffModel.Bands.Count; i++)
            {
                TariffBand band = tariffModel.Bands.ElementAt(i);
                if (i == 0)
                {

                    tariffView.LowerLimit1 = band.LowerkWhLimit;
                    tariffView.UpperLimit1 = band.UpperkWhLimit;
                    tariffView.Rate1 = band.UnitRate;
                    tariffView.Band1Id = band.Id;
                }

                if (i == 1)
                {
                    tariffView.LowerLimit2 = band.LowerkWhLimit;
                    tariffView.UpperLimit2 = band.UpperkWhLimit;
                    tariffView.Rate2 = band.UnitRate;
                    tariffView.Band2Id = band.Id;
                }

                if (i == 2)
                {
                    tariffView.LowerLimit3 = band.LowerkWhLimit;
                    tariffView.UpperLimit3 = band.UpperkWhLimit;
                    tariffView.Rate3 = band.UnitRate;
                    tariffView.Band3Id = band.Id;
                }
            }

            if (forEditing)
            {
                if (tariffView.UpperLimit2 == -1)
                    tariffView.UpperLimit2 = 0;

                if (tariffView.UpperLimit3 == -1)
                    tariffView.UpperLimit3 = 0;
            }

            return tariffView;
        }