Calculate mileage based on mileageOption
This commit is contained in:
@@ -25,7 +25,7 @@ func getMileageForVehicle(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
fillups, err := service.GetMileageByVehicleId(searchByIdQuery.Id, model.Since)
|
fillups, err := service.GetMileageByVehicleId(searchByIdQuery.Id, model.Since, model.MileageOption)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(http.StatusUnprocessableEntity, common.NewError("getMileageForVehicle", err))
|
c.JSON(http.StatusUnprocessableEntity, common.NewError("getMileageForVehicle", err))
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ type MileageModel struct {
|
|||||||
FuelQuantity float32 `form:"fuelQuantity" json:"fuelQuantity" binding:"required"`
|
FuelQuantity float32 `form:"fuelQuantity" json:"fuelQuantity" binding:"required"`
|
||||||
PerUnitPrice float32 `form:"perUnitPrice" json:"perUnitPrice" binding:"required"`
|
PerUnitPrice float32 `form:"perUnitPrice" json:"perUnitPrice" binding:"required"`
|
||||||
Currency string `json:"currency"`
|
Currency string `json:"currency"`
|
||||||
|
DistanceUnit db.DistanceUnit `form:"distanceUnit" json:"distanceUnit"`
|
||||||
Mileage float32 `form:"mileage" json:"mileage" binding:"mileage"`
|
Mileage float32 `form:"mileage" json:"mileage" binding:"mileage"`
|
||||||
CostPerMile float32 `form:"costPerMile" json:"costPerMile" binding:"costPerMile"`
|
CostPerMile float32 `form:"costPerMile" json:"costPerMile" binding:"costPerMile"`
|
||||||
OdoReading int `form:"odoReading" json:"odoReading" binding:"odoReading"`
|
OdoReading int `form:"odoReading" json:"odoReading" binding:"odoReading"`
|
||||||
@@ -35,4 +35,5 @@ func (b *MileageModel) MarshalJSON() ([]byte, error) {
|
|||||||
|
|
||||||
type MileageQueryModel struct {
|
type MileageQueryModel struct {
|
||||||
Since time.Time `json:"since" query:"since" form:"since"`
|
Since time.Time `json:"since" query:"since" form:"since"`
|
||||||
|
MileageOption string `json:"mileageOption" query:"mileageOption" form:"mileageOption"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,11 +4,12 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/akhilrex/hammond/common"
|
||||||
"github.com/akhilrex/hammond/db"
|
"github.com/akhilrex/hammond/db"
|
||||||
"github.com/akhilrex/hammond/models"
|
"github.com/akhilrex/hammond/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetMileageByVehicleId(vehicleId string, since time.Time) (mileage []models.MileageModel, err error) {
|
func GetMileageByVehicleId(vehicleId string, since time.Time, mileageOption string) (mileage []models.MileageModel, err error) {
|
||||||
data, err := db.GetFillupsByVehicleIdSince(vehicleId, since)
|
data, err := db.GetFillupsByVehicleIdSince(vehicleId, since)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -36,14 +37,48 @@ func GetMileageByVehicleId(vehicleId string, since time.Time) (mileage []models.
|
|||||||
PerUnitPrice: currentFillup.PerUnitPrice,
|
PerUnitPrice: currentFillup.PerUnitPrice,
|
||||||
OdoReading: currentFillup.OdoReading,
|
OdoReading: currentFillup.OdoReading,
|
||||||
Currency: currentFillup.Currency,
|
Currency: currentFillup.Currency,
|
||||||
|
DistanceUnit: currentFillup.DistanceUnit,
|
||||||
Mileage: 0,
|
Mileage: 0,
|
||||||
CostPerMile: 0,
|
CostPerMile: 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
if currentFillup.IsTankFull != nil && *currentFillup.IsTankFull && (currentFillup.HasMissedFillup == nil || !(*currentFillup.HasMissedFillup)) {
|
if currentFillup.IsTankFull != nil && *currentFillup.IsTankFull && (currentFillup.HasMissedFillup == nil || !(*currentFillup.HasMissedFillup)) {
|
||||||
distance := float32(currentFillup.OdoReading - lastFillup.OdoReading)
|
currentOdoReading := float32(currentFillup.OdoReading);
|
||||||
mileage.Mileage = distance / currentFillup.FuelQuantity
|
lastFillupOdoReading := float32(lastFillup.OdoReading);
|
||||||
mileage.CostPerMile = distance / currentFillup.TotalAmount
|
currentFuelQuantity := float32(currentFillup.FuelQuantity);
|
||||||
|
// If miles per gallon option and distanceUnit is km, convert from km to miles
|
||||||
|
// then check if fuel unit is litres. If it is, convert to gallons
|
||||||
|
if (mileageOption == "mpg" && mileage.DistanceUnit == db.KILOMETERS) {
|
||||||
|
currentOdoReading = common.KmToMiles(currentOdoReading);
|
||||||
|
lastFillupOdoReading = common.KmToMiles(lastFillupOdoReading);
|
||||||
|
if (mileage.FuelUnit == db.LITRE) {
|
||||||
|
currentFuelQuantity = common.LitreToGallon(currentFuelQuantity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If km_litre option or litre per 100km and distanceUnit is miles, convert from miles to km
|
||||||
|
// then check if fuel unit is not litres. If it isn't, convert to litres
|
||||||
|
|
||||||
|
if ((mileageOption == "km_litre" || mileageOption == "litre_100km") && mileage.DistanceUnit == db.MILES) {
|
||||||
|
currentOdoReading = common.MilesToKm(currentOdoReading);
|
||||||
|
lastFillupOdoReading = common.MilesToKm(lastFillupOdoReading);
|
||||||
|
|
||||||
|
if (mileage.FuelUnit == db.US_GALLON) {
|
||||||
|
currentFuelQuantity = common.GallonToLitre(currentFuelQuantity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
distance := float32(currentOdoReading - lastFillupOdoReading);
|
||||||
|
if (mileageOption == "litre_100km") {
|
||||||
|
mileage.Mileage = currentFuelQuantity / distance * 100;
|
||||||
|
} else {
|
||||||
|
mileage.Mileage = distance / currentFuelQuantity;
|
||||||
|
}
|
||||||
|
|
||||||
|
mileage.CostPerMile = distance / currentFillup.TotalAmount;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user