@@ -10,6 +10,7 @@ import (
1010 "strconv"
1111 "strings"
1212 "time"
13+ "unicode"
1314
1415 "github.com/DIMO-Network/shared/pkg/logfields"
1516
@@ -37,15 +38,17 @@ type vinDecodingService struct {
3738 DATGroupAPIService gateways.DATGroupAPIService
3839 japan17VINAPI gateways.Japan17VINAPI
3940 carvxAPI gateways.CarVxVINAPI
41+ elevaAPI gateways.ElevaAPI
4042 onChainSvc gateways.DeviceDefinitionOnChainService
4143 dbs func () * db.ReaderWriter
4244}
4345
4446func NewVINDecodingService (drivlyAPISvc gateways.DrivlyAPIService , vincarioAPISvc gateways.VincarioAPIService , autoIso gateways.AutoIsoAPIService , logger * zerolog.Logger ,
4547 onChainSvc gateways.DeviceDefinitionOnChainService , datGroupAPIService gateways.DATGroupAPIService , dbs func () * db.ReaderWriter ,
46- japan17VINAPI gateways.Japan17VINAPI , carvxAPI gateways.CarVxVINAPI ) VINDecodingService {
48+ japan17VINAPI gateways.Japan17VINAPI , carvxAPI gateways.CarVxVINAPI , elevaAPI gateways. ElevaAPI ) VINDecodingService {
4749 return & vinDecodingService {drivlyAPISvc : drivlyAPISvc , vincarioAPISvc : vincarioAPISvc , autoIsoAPIService : autoIso ,
48- japan17VINAPI : japan17VINAPI , carvxAPI : carvxAPI , logger : logger , onChainSvc : onChainSvc , DATGroupAPIService : datGroupAPIService , dbs : dbs }
50+ japan17VINAPI : japan17VINAPI , carvxAPI : carvxAPI , logger : logger , onChainSvc : onChainSvc ,
51+ DATGroupAPIService : datGroupAPIService , dbs : dbs , elevaAPI : elevaAPI }
4952}
5053
5154func (c vinDecodingService ) GetVIN (ctx context.Context , vin string , provider coremodels.DecodeProviderEnum , country string ) (* coremodels.VINDecodingInfoData , * coremodels.VINDecodingVendorExtra , error ) {
@@ -56,7 +59,10 @@ func (c vinDecodingService) GetVIN(ctx context.Context, vin string, provider cor
5659 vin = strings .ToUpper (strings .TrimSpace (vin ))
5760 providersToTry := make ([]coremodels.DecodeProviderEnum , 0 )
5861 // check for japan chasis if all providers
59- if provider == coremodels .AllProviders && ((len (vin ) < 17 && len (vin ) > 10 ) || country == "JPN" ) {
62+ if country == "CHL" {
63+ providersToTry = append (providersToTry , coremodels .ElevaKaufmannProvider )
64+ providersToTry = append (providersToTry , coremodels .VincarioProvider ) // sometimes works in latam as backup
65+ } else if provider == coremodels .AllProviders && ((len (vin ) < 17 && len (vin ) > 10 ) || country == "JPN" ) {
6066 providersToTry = append (providersToTry , coremodels .CarVXVIN )
6167 providersToTry = append (providersToTry , coremodels .Japan17VIN )
6268 } else if ! ValidateVIN (vin ) {
@@ -227,6 +233,33 @@ func (c vinDecodingService) GetVIN(ctx context.Context, vin string, provider cor
227233 continue
228234 }
229235 return result , resultVendorExtra , nil
236+ case coremodels .ElevaKaufmannProvider :
237+ resultVendorExtra .VendorsTried = append (resultVendorExtra .VendorsTried , string (coremodels .ElevaKaufmannProvider ))
238+ localLog .Info ().Msgf ("trying to decode VIN: %s with eleva" , vin )
239+
240+ vinInfo , err := c .elevaAPI .GetVINInfo (vin )
241+ if err != nil {
242+ errFinal = errors .Wrapf (err , "unable to decode vin: %s with eleva" , vin )
243+ continue
244+ }
245+ vinObj := vinutil .VIN (vin )
246+ yr := vinObj .Year ()
247+ if yr < 2018 {
248+ yr = time .Now ().Year () - 1
249+ localLog .Info ().Msgf ("vin year is less than 2019 for eleva kaufmann, using %d instead" , yr )
250+ }
251+
252+ result = & coremodels.VINDecodingInfoData {
253+ VIN : vin ,
254+ Make : titleCase (vinInfo .Data .Vehicle .Brand ), // MERCEDES-BENZ to Mercedes-Benz
255+ Model : vinInfo .Data .Vehicle .Model ,
256+ SubModel : "" ,
257+ Year : int32 (yr ),
258+ StyleName : "" ,
259+ Source : coremodels .ElevaKaufmannProvider ,
260+ Raw : nil ,
261+ }
262+ return result , resultVendorExtra , nil
230263 case coremodels .AllProviders :
231264 // this should never hit
232265 errFinal = fmt .Errorf ("all providers - invalid option reached" )
@@ -395,3 +428,20 @@ func validateVinDecoding(vdi *coremodels.VINDecodingInfoData) error {
395428
396429 return nil
397430}
431+
432+ func titleCase (s string ) string {
433+ parts := strings .Split (s , "-" )
434+
435+ for i , part := range parts {
436+ if len (part ) == 0 {
437+ continue
438+ }
439+ part = strings .ToLower (part )
440+
441+ runes := []rune (part )
442+ runes [0 ] = unicode .ToUpper (runes [0 ])
443+
444+ parts [i ] = string (runes )
445+ }
446+ return strings .Join (parts , "-" )
447+ }
0 commit comments