From 7a0609b9f07693048771b888a300de88ea0f6e40 Mon Sep 17 00:00:00 2001
From: Ayonix
Date: Sat, 3 Oct 2020 14:00:55 +0200
Subject: [PATCH 1/2] Allow negative cost_per_unit for geofences
---
lib/teslamate/locations/geo_fence.ex | 1 -
lib/teslamate_web/live/geofence_live/form.html.leex | 2 +-
test/teslamate/locations/geofences_test.exs | 2 --
3 files changed, 1 insertion(+), 4 deletions(-)
diff --git a/lib/teslamate/locations/geo_fence.ex b/lib/teslamate/locations/geo_fence.ex
index 720693d5b9..14be6cd054 100644
--- a/lib/teslamate/locations/geo_fence.ex
+++ b/lib/teslamate/locations/geo_fence.ex
@@ -34,7 +34,6 @@ defmodule TeslaMate.Locations.GeoFence do
])
|> validate_required([:name, :latitude, :longitude, :radius])
|> validate_number(:radius, greater_than: 0, less_than: 5000)
- |> validate_number(:cost_per_unit, greater_than_or_equal_to: 0)
|> validate_number(:session_fee, greater_than_or_equal_to: 0)
end
end
diff --git a/lib/teslamate_web/live/geofence_live/form.html.leex b/lib/teslamate_web/live/geofence_live/form.html.leex
index 6a5032287d..3bab09d729 100644
--- a/lib/teslamate_web/live/geofence_live/form.html.leex
+++ b/lib/teslamate_web/live/geofence_live/form.html.leex
@@ -68,7 +68,7 @@
<%= text_input f, :cost_per_unit, class: "input",
- type: :number, inputmode: :decimal, min: 0.0, step: 0.0001,
+ type: :number, inputmode: :decimal, step: 0.0001,
placeholder: "0.00" %>
<%= if @show_errors do %>
diff --git a/test/teslamate/locations/geofences_test.exs b/test/teslamate/locations/geofences_test.exs
index 145cc8c018..5170090b4e 100644
--- a/test/teslamate/locations/geofences_test.exs
+++ b/test/teslamate/locations/geofences_test.exs
@@ -29,7 +29,6 @@ defmodule TeslaMate.LocationsGeofencesTest do
longitude: nil,
radius: nil,
billing_type: :per_hour,
- cost_per_unit: -0.01,
session_fee: -0.01
}
@@ -67,7 +66,6 @@ defmodule TeslaMate.LocationsGeofencesTest do
name: ["can't be blank"],
radius: ["can't be blank"],
billing_type: ["is invalid"],
- cost_per_unit: ["must be greater than or equal to 0"],
session_fee: ["must be greater than or equal to 0"]
}
From eaf7cd75dad663b3bb03ac725307e87651cdfd14 Mon Sep 17 00:00:00 2001
From: Adrian Kumpf
Date: Sun, 4 Oct 2020 11:13:16 +0200
Subject: [PATCH 2/2] Test cost calculation for negative cost
---
test/teslamate/log/log_charging_test.exs | 27 ++++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/test/teslamate/log/log_charging_test.exs b/test/teslamate/log/log_charging_test.exs
index 40eb027aec..ca3b00bdd3 100644
--- a/test/teslamate/log/log_charging_test.exs
+++ b/test/teslamate/log/log_charging_test.exs
@@ -543,6 +543,33 @@ defmodule TeslaMate.LogChargingTest do
assert cproc.cost == Decimal.new("0.00")
end
+ test "cost per unit can be negative" do
+ car = car_fixture()
+
+ assert %GeoFence{id: id} =
+ geofence_fixture(%{
+ latitude: 50.1121,
+ longitude: 11.597,
+ radius: 50,
+ cost_per_unit: -0.15,
+ session_fee: 0.0
+ })
+
+ assert {:ok, cproc} =
+ log_charging_process(charges_fixture(:phases_nil),
+ car: car,
+ attrs: %{
+ date: DateTime.utc_now(),
+ latitude: 50.112198,
+ longitude: 11.597669
+ }
+ )
+
+ assert cproc.charge_energy_added == Decimal.from_float(12.77)
+ assert cproc.charge_energy_used == Decimal.from_float(12.46)
+ assert cproc.cost == Decimal.new("-1.92")
+ end
+
test "sets charge cost to zero if free supercharging is enabled" do
alias TeslaMate.Settings