package service import ( "time" "wails-app/internal/dao" "wails-app/internal/global" ) // CalculateFee is the shared parking-fee calculation used by vehicle exit // flows and the digital-ticket live preview. func CalculateFee(vehicle *dao.Vehicle, stayTime int64) float64 { if vehicle == nil || global.GVA_DB == nil { return 0 } var feeConfig dao.FeeConfig if err := global.GVA_DB.Where("vehicle_type_id = ?", vehicle.VehicleTypeID).First(&feeConfig).Error; err != nil { return float64(stayTime) * 0.1 } if feeConfig.UnitFee == 0 && feeConfig.StartFee == 0 && feeConfig.DailyMaxFee == 0 { return float64(stayTime) * 0.1 } if feeConfig.UnitTime <= 0 { return feeConfig.StartFee } isVIP := false if vehicle.OwnerId != nil { var owner dao.Owner if err := global.GVA_DB.First(&owner, *vehicle.OwnerId).Error; err == nil { now := time.Now() isVIP = owner.IsVip && !owner.VipExpireTime.IsZero() && owner.VipExpireTime.After(now) } } if isVIP && feeConfig.IsVIPFree { return 0 } if stayTime <= int64(feeConfig.StartTime) { return 0 } extraTime := stayTime - int64(feeConfig.StartTime) extraUnits := extraTime / int64(feeConfig.UnitTime) if extraTime%int64(feeConfig.UnitTime) > 0 { extraUnits++ } fee := feeConfig.StartFee + float64(extraUnits)*feeConfig.UnitFee if feeConfig.DailyMaxFee > 0 && fee > feeConfig.DailyMaxFee { fee = feeConfig.DailyMaxFee } if isVIP { fee *= feeConfig.VIPDiscount } return fee }