haikal/inventory/haikalna.py
2025-06-22 13:25:54 +03:00

1870 lines
44 KiB
Python

import re
def vin_year(vin_char: str) -> int:
YEAR_MAPPING = {
"A": 1980,
"B": 1981,
"C": 1982,
"D": 1983,
"E": 1984,
"F": 1985,
"G": 1986,
"H": 1987,
"J": 1988,
"K": 1989,
"L": 1990,
"M": 1991,
"N": 1992,
"P": 1993,
"R": 1994,
"S": 1995,
"T": 1996,
"V": 1997,
"W": 1998,
"X": 1999,
"Y": 2000,
"1": 2001,
"2": 2002,
"3": 2003,
"4": 2004,
"5": 2005,
"6": 2006,
"7": 2007,
"8": 2008,
"9": 2009,
"A": 2010,
"B": 2011,
"C": 2012,
"D": 2013,
"E": 2014,
"F": 2015,
"G": 2016,
"H": 2017,
"J": 2018,
"K": 2019,
"L": 2020,
"M": 2021,
"N": 2022,
"P": 2023,
"R": 2024,
"S": 2025,
"T": 2026,
"V": 2027,
"W": 2028,
"X": 2029,
"Y": 2030,
}
# Normalize the input character to uppercase
vin_char = vin_char.upper()
# Check if the character is valid
if vin_char not in YEAR_MAPPING:
raise ValueError(
f"Invalid year character: '{vin_char}'. Expected one of {list(YEAR_MAPPING.keys())}."
)
# Return the corresponding year
return YEAR_MAPPING[vin_char]
wmi_manufacturer_mapping = {
"AAA": "Audi",
"AAK": "FAW",
"AAM": "MAN",
"AAV": "Volkswagen",
"ABJ": "Mitsubishi",
"ABM": "BMW",
"ACV": "Isuzu",
"AC5": "Hyundai",
"ADM": "GM",
"ADN": "Nissan",
"ADR": "Renault",
"ADX": "Tata",
"AFA": "Ford",
"AFB": "Mazda",
"AHH": "Hino",
"AHM": "Honda",
"AHT": "Toyota",
"BR1": "Mercedes-Benz",
"HA0": "Wuxi",
"HA6": "Niu",
"HES": "smart",
"HL4": "Morini",
"HRV": "Henrey",
"JAA": "Isuzu",
"JAB": "Isuzu",
"JAC": "Isuzu",
"JAE": "Acura",
"JAL": "Isuzu",
"JA3": "Mitsubishi",
"JA4": "Mitsubishi",
"JA7": "Mitsubishi",
"JB3": "Dodge",
"JB4": "Dodge",
"JB7": "Dodge",
"JC0": "Ford",
"JC1": "Fiat",
"JC2": "Ford",
"JDA": "Daihatsu",
"JD1": "Daihatsu",
"JD2": "Daihatsu",
"JD4": "Daihatsu",
"JE3": "Eagle",
"JE4": "Mitsubishi",
"JF1": "Subaru",
"JF2": "Subaru",
"JF3": "Subaru",
"JF4": "Saab",
"JG1": "Chevrolet",
"JG7": "Pontiac",
"JGC": "Chevrolet",
"JGT": "GMC",
"JHA": "Hino",
"JHD": "Hino",
"JHF": "Honda",
"JHZ": "Honda",
"JHN": "Honda",
"JHL": "Honda",
"JHG": "Honda",
"JH5": "Honda",
"JH1": "Honda",
"JHM": "Honda",
"JH3": "Honda",
"JH4": "Acura",
"JJ3": "Chrysler",
"JLF": "Mitsubishi",
"JLS": "Sterling",
"JL5": "Mitsubishi",
"JL6": "Mitsubishi",
"JMA": "Mitsubishi",
"JMB": "Mitsubishi",
"JMF": "Mitsubishi",
"JMP": "Mitsubishi",
"JMR": "Mitsubishi",
"JMY": "Mitsubishi",
"JMZ": "Mazda",
"JM0": "Mazda",
"JM1": "Mazda",
"JM2": "Mazda",
"JM3": "Mazda",
"JM4": "Mazda",
"JM6": "Mazda",
"JM7": "Mazda",
"JNC": "Nissan",
"JNE": "Nissan",
"JNK": "Infiniti",
"JNR": "Infiniti",
"JN1": "Nissan",
"JN6": "Nissan",
"JN8": "Nissan",
"JPC": "Nissan",
"JP3": "Plymouth",
"JP4": "Plymouth",
"JP7": "Plymouth",
"JR2": "Isuzu",
"JST": "Suzuki",
"JS2": "Suzuki",
"JS3": "Suzuki",
"JS4": "Suzuki",
"JTB": "Toyota",
"JTD": "Toyota",
"JTE": "Toyota",
"JTF": "Toyota",
"JTG": "Toyota",
"JTH": "Lexus",
"JTJ": "Lexus",
"JTK": "Toyota",
"JTL": "Toyota",
"JTM": "Toyota",
"JTN": "Toyota",
"JTP": "Toyota",
"JT1": "Toyota",
"JT2": "Toyota",
"JT3": "Toyota",
"JT4": "Toyota",
"JT6": "Lexus",
"JT8": "Lexus",
"JW6": "Mitsubishi",
"J81": "Chevrolet",
"J87": "Pontiac",
"J8C": "Chevrolet",
"J8T": "GMC",
"J8Z": "Chevrolet",
"KF3": "Merkavim",
"KL": "Daewoo",
"KLA": "Daewoo",
"KLP": "CT&T United",
"KLT": "Tata Daewoo",
"KLU": "Tata Daewoo",
"KLY": "Daewoo",
"KL1": "Daewoo",
"KL2": "Daewoo",
"KL3": "Daewoo",
"KL4": "Daewoo",
"KL5": "Daewoo",
"KL6": "Daewoo",
"KL7": "Daewoo",
"KL8": "Daewoo",
"KM": "Hyundai",
"KMC": "Hyundai",
"KME": "Hyundai",
"KMF": "Hyundai",
"KMH": "Hyundai",
"KMJ": "Hyundai",
"KMT": "Genesis",
"KMU": "Genesis",
"KM8": "Hyundai",
"KNA": "Kia",
"KNC": "Kia",
"KND": "Kia",
"KNE": "Kia",
"KNF": "Kia",
"KNG": "Kia",
"KNJ": "Ford",
"KNM": "Renault",
"KN1": "Asia Motors",
"KN2": "Asia Motors",
"KPA": "SsangYong",
"KPB": "SsangYong",
"KPH": "Mitsubishi",
"KPT": "SsangYong",
"LA6": "King Long",
"LC0": "BYD",
"LBE": "Hyundai Shouwang",
"LBM": "Zongshen Piaggio",
"LBV": "BMW",
"LB1": "Fujian Benz",
"LB3": "Geely",
"LCR": "Gonow",
"LC2": "Kwang Yang",
"LDC": "Dongfeng",
"LDD": "Dandong Huanghai",
"LDK": "FAW Bus",
"LDN": "Soueast",
"LDP": "Voyah",
"LDY": "Zhongtong Bus,",
"LEF": "Jiangling",
"LET": "Jiangling Isuzu",
"LE4": "Beijing Benz",
"LFB": "FAW",
"LFF": "Wangye",
"LFM": "FAW Toyota",
"LFN": "FAW",
"LFP": "FAW",
"LFT": "FAW",
"LFV": "FAW Volkswagen,",
"LFW": "FAW JieFang,",
"LFZ": "Leapmotor",
"LGA": "Dongfeng",
"LGB": "Dongfeng",
"LGD": "Dongfeng",
"LGG": "Dongfeng",
"LGJ": "Dongfeng",
"LGL": "Guilin Daewoo",
"LGW": "Great Wall",
"LGX": "BYD",
"LHA": "Shuanghuan",
"LHB": "BAIC",
"LHG": "Guangzhou Honda",
"LH1": "FAW",
"LJC": "Jincheng",
"LJD": "Yueda Kia",
"LJN": "Zhengzhou Nissan",
"LJS": "Yaxing Coach",
"LJU": "Lotus Geely",
"LJX": "JMC Ford",
"LJ1": "JAC",
"LJ8": "Zotye",
"LKC": "Changhe",
"LKL": "Higer Bus",
"LKT": "Lifan",
"LLC": "Loncin",
"LLN": "Qoros",
"LLV": "Lifan",
"LL3": "Golden Dragon",
"LL6": "GAC Mitsubishi",
"LL8": "Linhai Yamaha",
"LME": "Skyworth",
"LMG": "GAC",
"LMV": "XPeng",
"LMW": "GAC",
"LM6": "SWM",
"LM8": "Seres",
"LNA": "GAC",
"LNB": "BAIC",
"LND": "JMEV",
"LNP": "NAC MG",
"LNY": "Yuejin",
"LMX": "Dongfeng Forthing",
"LPA": "Changan",
"LPE": "BYD",
"LPS": "Polestar",
"LRB": "SAIC Buick",
"LRD": "Foton",
"LRE": "SAIC Cadillac",
"LRW": "Tesla",
"LSC": "Changan",
"LSF": "SAIC Maxus",
"LSG": "SAIC Chevrolet",
"LSH": "SAIC Maxus",
"LSJ": "SAIC MG",
"LSK": "SAIC Maxus",
"LSV": "SAIC Volkswagen",
"LSY": "Brilliance",
"LS1": "Hyundai",
"LS4": "Changan",
"LS5": "Changan",
"LS6": "Changan",
"LS7": "JMC",
"LTA": "ZX Auto",
"LTN": "Soueast",
"LTV": "FAW Toyota",
"LUC": "Honda",
"LUD": "Dongfeng",
"LUX": "Dongfeng",
"LUZ": "Hozon",
"LVA": "Foton",
"LVB": "Foton",
"LVC": "Foton",
"LVF": "Changhe Suzuki",
"LVG": "GAC Toyota",
"LVH": "Dongfeng",
"LVM": "Chery",
"LVP": "Dongfeng",
"LVR": "Changan Mazda",
"LVS": "Changan Ford",
"LVT": "Chery",
"LVU": "Chery",
"LVV": "Chery",
"LVX": "Aiways",
"LVY": "Volvo",
"LVZ": "Dongfeng",
"LWG": "Chongqing",
"LWL": "Isuzu",
"LWV": "GAC",
"LW4": "Li Auto",
"LXV": "Borgward",
"LYB": "Yaxing",
"LYV": "Volvo",
"LZE": "Isuzu",
"LZF": "SAIC",
"LZG": "Shaanxi",
"LZK": "Huanghe",
"LZM": "MAN",
"LZS": "Meccanica",
"LZU": "Isuzu Bus",
"LZW": "SAIC",
"LZY": "Yutong",
"LZZ": "Sinotruk",
"LZ4": "Shangyang",
"L1N": "XPeng",
"L2C": "Chery",
"L3H": "Victory",
"L4F": "Suzhou Eagle",
"L5C": "KangDi",
"L5K": "Yongkang",
"L6T": "Lynk & Co",
"L82": "Baotian",
"L85": "Yongkang Huabao",
"L9N": "Taotao",
"MAH": "Fiat",
"MAJ": "Ford",
"MAK": "Honda",
"MAL": "Hyundai",
"MAT": "Tata",
"MA3": "Suzuki",
"MA6": "GM",
"MA7": "Hindustan",
"MBF": "Royal Enfield",
"MBH": "Suzuki & Nissan",
"MBJ": "Toyota",
"MBK": "MAN",
"MBL": "Hero MotoCorp",
"MBR": "Mercedes-Benz",
"MBU": "Swaraj",
"MBV": "Premier",
"MBX": "Piaggio",
"MBY": "Asia Motors",
"MB1": "Ashok Leyland",
"MCB": "GM",
"MCG": "Atul",
"MC1": "Force",
"MC2": "Eicher",
"MDH": "Nissan",
"MD6": "TVS",
"MD9": "Shuttles",
"MEC": "Daimler",
"MEE": "Renault",
"MEG": "Harley-Davidson",
"MER": "Benelli",
"MET": "Piaggio",
"MEX": "Škoda",
"ME1": "Yamaha",
"MZB": "Kia",
"MZZ": "Citroën",
"MZ7": "MG",
"M3G": "Isuzu",
"MF3": "Hyundai",
"MHD": "Suzuki",
"MHF": "Toyota",
"MHK": "Daihatsu",
"MHL": "Mercedes-Benz",
"MHR": "Honda",
"MLB": "Siam Yamaha Co",
"ML3": "Mitsubishi",
"MMA": "Mitsubishi",
"MMB": "Mitsubishi",
"MMC": "Mitsubishi",
"MMD": "Mitsubishi",
"MMF": "BMW",
"MML": "MG",
"MMM": "Chevrolet",
"MMR": "Subaru",
"MMS": "Suzuki",
"MMT": "Mitsubishi",
"MMU": "Holden",
"MNB": "Ford",
"MNK": "Hino",
"MNT": "Nissan",
"MNU": "Great Wall",
"MPA": "Isuzu",
"MPB": "Ford",
"MP1": "Isuzu",
"MP2": "Mazda Isuzu",
"MP5": "Foton",
"MRH": "Honda",
"MRT": "Neta",
"MR0": "Toyota",
"MR1": "Toyota",
"MR2": "Toyota",
"MR3": "Toyota",
"MXL": "Yutong",
"MX3": "Hyundai",
"NAA": "Iran Khodro",
"NAC": "Mammut",
"NAD": "Škoda",
"NAP": "Pars Khodro",
"NC9": "VIRA Diesel",
"NFB": "Honda",
"NG3": "Lucky Motors",
"NLA": "Honda",
"NLE": "Mercedes-Benz",
"NLH": "Hyundai",
"NLJ": "Hyundai",
"NLN": "Karsan",
"NLR": "Otokar",
"NLT": "Temsa",
"NL1": "TOGG",
"NMA": "MAN",
"NMB": "Mercedes-Benz",
"NMC": "BMC",
"NMT": "Toyota",
"NM0": "Ford",
"NM1": "Renault",
"NM4": "Tofa",
"NNA": "Anadolu Isuzu",
"NNN": "Gépébus Oréos 4X",
"NRE": "Bozankaya",
"NSA": "SamAvto",
"NS2": "JV MAN Auto",
"PAB": "Isuzu",
"PAD": "Honda",
"PE1": "Ford",
"PE3": "Mazda",
"PFD": "Hyundai",
"PL1": "Proton",
"PL8": "Inokom Hyundai",
"PLP": "Subaru",
"PLZ": "Isuzu",
"PMH": "Honda",
"PML": "Hicom",
"PMN": "Modenas",
"PM1": "BMW Mini",
"PM2": "Perodua",
"PM9/": "Bufori",
"PNA": "Stellantis",
"PNV": "Volvo",
"PN1": "UMW Toyota",
"PN2": "UMW Toyota",
"PN8": "Nissan",
"PPP": "Suzuki",
"PPV": "Volkswagen",
"PP1": "Mazda",
"PP3": "Hyundai",
"PRA": "Sinotruk",
"PRH": "Chery",
"PRX": "Kia",
"PR8": "Ford",
"RA1": "Steyr",
"LFA": "Ford Lio Hon",
"RFB": "Kymco",
"RFC": "Taiwan Golden Bee",
"RFD": "Tai Ling",
"RFG": "Sanyang",
"RFL": "Adly",
"RFT": "CPI",
"RF3": "Aeon Motor",
"RF5": "Yulon Motor",
"RGS": "Kawasaki",
"RHA": "Ford Lio Ho",
"RKJ": "Prince ",
"RKL": "Kuozui",
"RKM": "CMC",
"RKR": "Yamaha",
"RKT": "Honda",
"RK7": "Kawasaki",
"RLA": "Mitsubishi",
"RLC": "Yamaha Motor",
"RLE": "Isuzu",
"RLH": "Honda",
"RLL": "VinFast",
"RLM": "Mercedes-Benz",
"RLN": "VinFast",
"RL0": "Ford",
"RL4": "Toyota",
"RP8": "Piaggio",
"R3M": "Mangosteen",
"R4N": "Elyx",
"SAA": "Austin",
"SAB": "Optare",
"SAD": "Jaguar",
"SAF": "ERF",
"SAH": "Honda",
"SAJ": "Jaguar",
"SAL": "Land Rover",
"SAM": "Morris",
"SAR": "Rover MG",
"SAT": "Triumph",
"SAX": "Austin-Rover",
"SAZ": "Freight Rover",
"SA9/": "OX Global",
"SBB": "Leyland",
"SBC": "Iveco Ford",
"SBJ": "Leyland",
"SBL": "Leyland",
"SBM": "McLaren",
"SBS": "Scammell",
"SB1": "Toyota",
"SCA": "Rolls Royce",
"SCB": "Bentley",
"SCC": "Lotus",
"SCD": "Reliant",
"SCE": "DeLorean",
"SCF": "Aston Martin",
"SC5": "Wrightbus",
"SC6": "INEOS",
"SDB": "Talbot",
"SDF": "Dodge",
"SDG": "Renault",
"SDK": "Caterham",
"SDL": "TVR",
"SDP": "MG",
"SD7": "Aston Martin",
"SFA": "Ford",
"SFN": "Foden",
"SFZ": "Tesla",
"SGA": "Avondale",
"SGB": "Bailey",
"SGD": "Swift",
"SGE": "Elddis",
"SGL": "Lunaravans",
"SG4": "Coachman",
"SHH": "Honda",
"SHS": "Honda",
"SH7": "INEOS",
"SJA": "Bentley",
"SJK": "Infiniti",
"SJN": "Nissan",
"SJ1": "Ree",
"SKA": "Vauxhall",
"SKB": "Kel-Berg",
"SKF": "Bedford",
"SLA": "Rolls Royce",
"SLP": "JC Bamford",
"SNE": "Wartburg",
"SNT": "Trabant",
"SWH": "Temared",
"TLJ": "Jawa Moto",
"TMA": "Hyundai",
"TMB": "Škoda",
"TMC": "Hyundai",
"TMK": "Karosa",
"TMP": "Škoda",
"TMT": "Tatra",
"TNA": "Avia",
"TNE": "TAZ",
"TNT": "Tatra",
"TNU": "Tatra",
"TN9": "Karosa",
"TRA": "Ikarus Bus",
"TRC": "Csepel",
"TRU": "Audi",
"TSB": "Ikarus Bus",
"TSE": "Ikarus,",
"TSF": "Alfabusz",
"TSM": "Suzuki Fiat",
"TWG": "Ceatano Bus",
"TW1": "Toyota",
"TW2": "Ford",
"TW6": "Citroën",
"TW7": "Mini",
"TX5": "Mini",
"TYA": "Mitsubishi",
"TYB": "Mitsubishi",
"UN1": "Ford",
"UU1": "Dacia",
"UU2": "Oltcit",
"UU3": "ARO",
"UU4": "Roman",
"UU5": "Rocar",
"UU6": "Daewoo",
"UU7": "Euro Bus",
"UU9": "Astra Bus",
"UV9": "ATP Bus",
"UWR": "Robus",
"UZT": "UTB",
"U1A": "Sanos",
"U5Y": "Kia",
"U6Y": "Kia",
"VAG": "Steyr Daimler",
"VA4": "KSR",
"VBK": "KTM",
"VCF": "Fisker",
"VFA": "Renault",
"VFN": "Trailor",
"VF1": "Renault",
"VF2": "Renault",
"VF3": "Peugeot",
"VF4": "Talbot",
"VF5": "Iveco Unic",
"VF6": "Renault",
"VF7": "Citroën",
"VF8": "Matra",
"VGY": "Lohr",
"VG6": "Renault",
"VG7": "Renault",
"VG8": "Renault",
"VJR": "Ligier",
"VJY": "Gruau",
"VJ1": "Heuliez Bus",
"VJ2": "Mia Electric",
"VK1": "SEG",
"VK2": "Grandin",
"VK8": "Venturi",
"VLG": "Aixam-Mega",
"VLU": "Scania",
"VL4": "Citroën",
"VMK": "Renault",
"VM3": "Lamberet",
"VN1": "Renault",
"VN4": "Voxan",
"VNE": "Iveco",
"VNK": "Toyota",
"VNV": "Nissan",
"VRW": "Goupil",
"VR1": "DS",
"VR3": "Peugeot",
"VR7": "Citroën",
"VXE": "Opel",
"VXF": "Fiat",
"VXK": "Opel",
"VYF": "Fiat",
"VSA": "Mercedes-Benz",
"VSC": "Talbot",
"VSE": "Santana Suzuki",
"VSF": "Santana",
"VSK": "Nissan",
"VSR": "Leciñena",
"VSS": "SEAT",
"VSX": "Opel",
"VSY": "Renault",
"VS1": "Pegaso",
"VS5": "Renault",
"VS6": "Ford",
"VS7": "Citroën",
"VS8": "Peugeot",
"VTR": "Gas Gas",
"VVC": "SOR Ibrica",
"VV1": "Lecitrailer",
"VWA": "Nissan",
"VWF": "Guillén",
"VWV": "Volkswagen",
"WAC": "Audi",
"WAG": "Neoplan",
"WAP": "Alpina",
"WAU": "Audi",
"WA1": "Audi",
"WBA": "BMW",
"WBJ": "Bitters",
"WBS": "BMW",
"WBU": "Bürstner",
"WBX": "BMW",
"WBY": "BMW",
"WB1": "BMW",
"WB5": "BMW",
"WCD": "Freightliner",
"WDB": "Mercedes-Benz Maybach",
"WDC": "Mercedes-Benz",
"WDD": "Mercedes-Benz",
"WDF": "Mercedes-Benz",
"WDR": "Freightliner",
"WDT": "Dethleffs",
"WDW": "Dodge",
"WDY": "Freightliner",
"WDZ": "Mercedes-Benz",
"WD0": "Dodge",
"WD2": "Freightliner",
"WD3": "Mercedes-Benz",
"WD4": "Mercedes-Benz",
"WD5": "Freightliner",
"WD6": "Freightliner",
"WD8": "Dodge",
"WEB": "Evobus GmbH",
"WFC": "Fendt",
"WFD": "Fliegl Trailer",
"WF0": "Ford",
"WF1": "Merkur",
"WHB": "Hobby",
"WHY": "Hymer",
"WJM": "Iveco",
"WJR": "Irmscher",
"WKE": "Krone",
"WKK": "Setra",
"WKN": "Knaus",
"WK0": "Kögel",
"WLA": "Langendorf",
"WMA": "MAN & Bus",
"WME": "smart",
"WMW": "MINI",
"WMX": "Mercedes-Benz",
"WMZ": "MINI",
"WNA": "Next.e.GO Mobile SE",
"WP0": "Porsche",
"WP1": "Porsche",
"WSK": "Schmitz-Cargobull",
"WSM": "Schmitz-Cargobull",
"WSV": "Aebi Schmidt",
"WS5": "StreetScooter",
"WS7": "Sono",
"WTA": "Tabbert",
"WUA": "Audi",
"WU1": "Audi",
"WVG": "Volkswagen",
"WVP": "Viseon Bus",
"WVW": "Volkswagen",
"WV1": "Volkswagen",
"WV2": "Volkswagen",
"WV3": "Volkswagen",
"WV4": "Volkswagen",
"WZ1": "Toyota",
"W0L": "Opel",
"W0V": "Opel",
"W04": "Buick",
"W06": "Cadillac",
"W08": "Saturn Astra",
"W1A": "smart",
"W1K": "Mercedes-Benz",
"W1N": "Mercedes-Benz",
"W1T": "Mercedes-Benz",
"W1V": "Mercedes-Benz",
"W1W": "Mercedes-Benz",
"W1Y": "Mercedes-Benz",
"W1Z": "Mercedes-Benz",
"W2W": "Freightliner",
"W2Y": "Freightliner",
"W2Z": "Freightliner",
"XLA": "DAF Bus",
"XLB": "Volvo.",
"XLC": "Ford",
"XLD": "Pacton",
"XLE": "Scania",
"XLK": "Burg",
"XLR": "DAF",
"XLV": "DAF",
"XL3": "Ebusco",
"XL4": "Lightyear",
"XMC": "Mitsubishi",
"XMD": "Mitsubishi",
"XMG": "VDL Bus",
"XMR": "Nooteboom",
"XM4": "RAVO Holding",
"XNB": "Mitsubishi",
"XNC": "Mitsubishi",
"XP7": "Tesla",
"XTA": "Lada",
"XTB": "Moskvitch",
"XTC": "KAMAZ",
"XTE": "ZAZ",
"XTF": "GolAZ",
"XTH": "GAZ",
"XTK": "IzhAvto",
"XTP": "Ural",
"XTT": "UAZ",
"XTU": "Trolza",
"XTW": "LAZ",
"XTY": "LiAZ",
"XTZ": "ZiL",
"XUF": "General",
"XUU": "AvtoTor",
"XW7": "Toyota",
"XW8": "Volkswagen",
"XWB": "Daewoo",
"XWE": "AvtoTor",
"XWF": "AvtoTor",
"XX3": "Ujet",
"XZG": "Great Wall",
"X1E": "KAvZ",
"X1F": "NefAZ",
"X1M": "PAZ",
"X4X": "AvtoTor",
"X7L": "Renault",
"X7M": "Hyundai Vortex",
"X8U": "Scania",
"X96": "GAZ",
"X9F": "Ford",
"X9L": "GM",
"X9P": "Volvo",
"X9X": "Great Wall",
"YAF": "Faymonville",
"YAR": "Toyota",
"YBW": "Volkswagen",
"YB1": "Volvo",
"YB2": "Volvo",
"YB6": "Jonckheere",
"YE2": "Van Hool",
"YH1": "Solifer",
"YH2": "BRP",
"YH4": "Fisker",
"YK1": "Saab",
"YSC": "Cadillac",
"YSM": "Polestars",
"YSP": "Volta AB",
"YSR": "Polestar",
"YS2": "Scania",
"YS3": "Saabs",
"YS4": "Scania",
"YTN": "Saab",
"YT7": "Kabe",
"YV1": "Volvo",
"YV2": "Volvo",
"YV3": "Volvos",
"YV4": "Volvo",
"YYC": "Think Nordic",
"Y3M": "MAZ",
"Y4F": "Ford",
"Y4K": "Geely",
"Y6D": "ZAZ",
"Y6J": "Bogdan",
"Y6L": "Hyundai",
"Y6U": "Škoda",
"Y7B": "Bogdan",
"Y7C": "Great Wall",
"Y7F": "Boryspil Bus",
"Y8A": "LAZ",
"Y9H": "LAZ",
"ZAA": "Autobianchi",
"ZAC": "Jeep Dodge",
"ZAM": "Maserati",
"ZAP": "Piaggio",
"ZAR": "Alfa Romeo",
"ZAS": "Alfa Romeo",
"ZBB": "Bertone",
"ZBN": "Benelli",
"ZBW": "Rayton-Fissore",
"ZCB": "Bartoletti",
"ZCF": "Iveco",
"ZCG": "Cagiva",
"ZCM": "Menarinibus",
"ZC2": "Chrysler",
"ZDC": "Honda",
"ZDF": "Ferrari",
"ZDM": "Ducati",
"ZDT": "De Tomaso",
"ZDY": "Cacciamali",
"ZD0": "Yamaha",
"ZD3": "Beta Motor",
"ZD4": "Aprilia",
"ZES": "Bimota",
"ZFA": "Fiat",
"ZFB": "Fiat",
"ZFC": "Fiat",
"ZFF": "Ferrari",
"ZFM": "Fantic",
"ZFR": "Pininfarina",
"ZF4": "Qvale",
"ZGA": "Iveco Bus",
"ZGU": "Moto Guzzi",
"ZHW": "Lamborghini",
"ZJM": "Malaguti",
"ZJN": "Innocenti",
"ZJT": "Italjet",
"ZLA": "Lancia",
"ZLF": "Tazzari",
"ZLM": "Moto Morini",
"ZLV": "Laverda",
"ZNN": "Energica",
"ZN3": "Iveco Defence",
"ZN6": "Maserati",
"ZPB": "Lamborghini",
"ZPY": "DR",
"ZRG": "Tazzari",
"ZSG": "Ferrari",
"ZY1": "Adria",
"Z6F": "Ford",
"Z76": "SEMAZ",
"Z8M": "Marussia",
"Z8N": "Nissan",
"Z8T": "PCMA",
"Z9M": "Mercedes-Benz",
"Z94": "Hyundai",
"1B3": "Dodge",
"1B4": "Dodge",
"1B7": "Dodge",
"1BA": "Blue Bird",
"1BB": "Blue Bird",
"1BL": "Balko",
"1C3": "Chrysler",
"1C4": "Chrysler",
"1C6": "Chrysler",
"1C8": "Chrysler",
"1CM": "Checker",
"1CU": "Cushman Haulster",
"1CY": "Cranerier",
"1D3": "Dodge",
"1D4": "Dodge",
"1D7": "Dodge",
"1D8": "Dodge",
"1FA": "Ford",
"1FB": "Ford",
"1FC": "Ford",
"1FM": "Ford",
"1FT": "Ford",
"1FU": "Freightliner",
"1FV": "Freightliner",
"1F1": "Ford",
"1F6": "Ford",
"1G": "GM",
"1G0": "Opel",
"1G1": "Chevrolet",
"1G2": "Pontiac",
"1G3": "Oldsmobile",
"1G4": "Buick",
"1G5": "GMC",
"1G6": "Cadillac",
"1G7": "Pontiac",
"1G8": "Saturn",
"1GA": "Chevrolet",
"1GC": "Chevrolet",
"1GF": "Flxible",
"1GG": "Isuzu",
"1GH": "Holden",
"1GJ": "GMC",
"1GK": "GMC",
"1GM": "Pontiac",
"1GN": "Chevrolet",
"1GT": "GMC",
"1GY": "Cadillac",
"1HD": "Harley-Davidson",
"1HG": "Honda",
"1HS": "Caterpillar",
"1JC": "Jeep",
"1JT": "Jeep",
"1JU": "Marmon",
"1J4": "Jeep",
"1J7": "Jeep",
"1J8": "Jeep",
"1LN": "Lincoln",
"1L1": "Lincoln",
"1MB": "Mercedes-Benz",
"1ME": "Mercury",
"1MR": "Continental",
"1M0": "John Deere Gator",
"1M1": "Mack USA",
"1M2": "Mack USA",
"1M3": "Mack USA",
"1M4": "Mack USA",
"1N4": "Nissan",
"1N6": "Nissan",
"1NX": "Toyota",
"1P3": "Plymouth",
"1P4": "Plymouth",
"1PY": "John Deere",
"1TC": "Coachmen",
"1UJ": "Jayco",
"1UT": "Jeep",
"1VH": "Orion Bus",
"1VW": "Volkswagen",
"1V1": "Volkswagen",
"1V2": "Volkswagen",
"1WT": "Winnebago",
"1WU": "White Motor",
"1XA": "Excalibur",
"1XK": "Kenworth",
"1XM": "Renault",
"1XP": "Peterbilt",
"1Y1": "Chevrolet",
"1YJ": "Rokon",
"1YV": "Mazda",
"1ZV": "Ford",
"1ZW": "Mercury",
"10T": "Oshkosh",
"12A": "Avanti",
"137": "Hummer",
"16X": "Vixen",
"19U": "Acura",
"19V": "Acura",
"19X": "Honda",
"2A3": "Imperial",
"2BC": "Jeep",
"2BP": "Ski-Doo",
"2B1": "Orion Bus",
"2B3": "Dodge",
"2B4": "Dodge",
"2B5": "Dodge",
"2B7": "Dodge",
"2C1": "Chevrolet",
"2C3": "Chrysler",
"2C4": "Chrysler",
"2C7": "Pontiac",
"2C8": "Chrysler",
"2CC": "American Corporation",
"2CG": "Pontiac",
"2CK": "Pontiac",
"2CM": "American Corporation",
"2CN": "Chevrolet",
"2CT": "GMC",
"2D4": "Dodge",
"2D7": "Dodge",
"2D8": "Dodge",
"2EZ": "Electra Meccanica",
"2FA": "Ford",
"2FH": "Zenn",
"2FM": "Ford",
"2FT": "Ford",
"2FU": "Freightliner",
"2FV": "Freightliner",
"2FW": "Sterling",
"2FY": "New Flyer",
"2Gx": "GM",
"2G0": "GMC",
"2G1": "Chevrolet",
"2G2": "Pontiac",
"2G3": "Oldsmobile",
"2G4": "Buick",
"2G5": "GMC",
"2G6": "Cadillac",
"2G7": "Pontiac",
"2G8": "Chevrolet",
"2GA": "Chevrolet",
"2GC": "Chevrolet",
"2GH": "GMC",
"2GJ": "GMC",
"2GK": "GMC",
"2GN": "Chevrolet",
"2GT": "GMC",
"2HG": "Honda",
"2HH": "Acura",
"2HJ": "Honda",
"2HK": "Honda",
"2HM": "Hyundai",
"2HN": "Acura",
"2HS": "International Trucks",
"2J4": "Jeep",
"2LM": "Lincoln",
"2LN": "Lincoln",
"2M1": "Mack",
"2M2": "Mack",
"2ME": "Mercury",
"2MG": "Motor Coach Industries",
"2MR": "Mercury",
"2NV": "Nova Bus",
"2P3": "Plymouth",
"2P4": "Plymouth",
"2P5": "Plymouth",
"2PC": "Prevost",
"2S2": "Suzuki",
"2S3": "Suzuki",
"2T1": "Toyota",
"2T2": "Lexus",
"2T3": "Toyota",
"2V4": "Volkswagen",
"2V8": "Volkswagen",
"2WK": "WWestern Star Truck",
"2XK": "Kenworth",
"2XM": "Eagle Premier",
"2XP": "Peterbilt Truck",
"3AK": "Freightliner",
"3AL": "Freightliner",
"3AX": "Scania",
"3BE": "Scania",
"3BJ": "Western Star",
"3B3": "Dodge",
"3B4": "Dodge",
"3B7": "Dodge",
"3C3": "Chrysler",
"3C4": "Chrysler",
"3C6": "Chrysler",
"3C8": "Chrysler",
"3CE": "Volvo",
"3CZ": "Honda",
"3D3": "Dodge",
"3D4": "Dodge",
"3D7": "Dodge",
"3FA": "Ford",
"3FC": "Ford",
"3FE": "Ford",
"3FM": "Ford",
"3FN": "Ford",
"3FT": "Ford",
"3F6": "Sterling Bullet",
"3G": "GM",
"3G0": "Holden",
"3G1": "Chevrolet",
"3G2": "Pontiac",
"3G4": "Buick",
"3G5": "Buick",
"3G7": "Pontiac",
"3GC": "Chevrolet",
"3GK": "GMC",
"3GM": "Holden",
"3GN": "Chevrolet",
"3GP": "Honda",
"3GS": "Saturn",
"3GT": "GMC",
"3GY": "Cadillac",
"3H3": "Hyundai",
"3HC": "International Trucks",
"3HG": "Honda",
"3HS": "International Trucks & Caterpillar",
"3JB": "BRP",
"3KP": "Kia Hyundai",
"3LN": "Lincoln",
"3MA": "Mercury",
"3MD": "Mazda",
"3ME": "Mercury",
"3MF": "BMW",
"3MV": "Mazda",
"3MW": "BMW",
"3MY": "Toyota",
"3MZ": "Mazda",
"3N1": "Nissan",
"3N6": "Nissan Chevrolet",
"3N8": "Nissan",
"3NS": "Polaris",
"3NE": "Polaris",
"3P3": "Plymouth",
"3PC": "Infiniti",
"3TM": "Toyota",
"3TY": "Toyota",
"3VV": "Volkswagen",
"3VW": "Volkswagen",
"3WK": "Kenworth",
"3WP": "Peterbilt Truck",
"4A3": "Mitsubishi",
"4A4": "Mitsubishi",
"4B3": "Dodge",
"4C3": "Chrysler",
"4DR": "IC Bus",
"4EN": "E-ONE",
"4F2": "Mazda",
"4F4": "Mazda",
"4G1": "Chevrolet",
"4G2": "Pontiac",
"4G3": "Toyota",
"4G5": "GM",
"4GD": "Opel",
"4JG": "Mercedes-Benz",
"4KL": "Isuzu",
"4M2": "Mercury",
"4ML": "Oshkosh Trailer",
"4N2": "Nissan",
"4NU": "Isuzu",
"4P1": "Pierce",
"4P3": "Mitsubishi",
"4RK": "Nova Bus",
"4S1": "Isuzu",
"4S2": "Isuzu",
"4S3": "Subaru",
"4S4": "Subaru",
"4S6": "Honda",
"4TA": "Toyota",
"4T1": "Toyota",
"4T3": "Toyota",
"4T4": "Toyota",
"4UF": "Arctic Cat",
"4US": "BMW",
"4UZ": "Freightliner",
"4V1": "WhiteGMC Truck",
"4V3": "Volvo",
"4V4": "Volvo",
"4V6": "Volvo",
"4VA": "Volvo",
"4VG": "Volvo",
"4W5": "Acura",
"4XA": "Polaris",
"4X4": "Forest River",
"4YM": "Carry-On Trailer, Inc.",
"4Z3": "American LaFrance",
"43C": "Consulier",
"478": "Honda",
"480": "Sterling",
"5AS": "Global Electric Motorcars",
"5BP": "Solectria",
"5BZ": "Nissan",
"5CX": "Shelby",
"5DF": "Thomas Dennis",
"5FC": "Columbia Vehicle",
"5FN": "Honda",
"5FP": "Honda",
"5FR": "Acura",
"5FY": "New Flyer",
"5GA": "Buick",
"5GD": "Daewoo",
"5GN": "Hummer",
"5GR": "Hummer",
"5GT": "Hummer",
"5GZ": "Saturn",
"5G8": "Holden",
"5HD": "Harley-Davidson",
"5J6": "Honda",
"5J8": "Acura",
"5KB": "Honda",
"5KJ": "Western Star",
"5KK": "Western Star",
"5L1": "Lincoln",
"5LM": "Lincoln",
"5LT": "Lincoln",
"5N1": "Nissan Infiniti",
"5N3": "Infiniti",
"5NH": "Forest River",
"5NM": "Hyundai",
"5NP": "Hyundai",
"5NT": "Hyundai",
"5S3": "Saab",
"5SA": "Suzuki",
"5TB": "Toyota",
"5TD": "Toyota",
"5TE": "Toyota",
"5TF": "Toyota",
"5UM": "BMW",
"5UX": "BMW",
"5VF": "American Electric Vehicle Company",
"5XX": "Kia",
"5XY": "Kia Hyundai",
"5YF": "Toyota",
"5YJ": "Tesla",
"5YM": "BMW ",
"5YN": "Cruise",
"5Y2": "Pontiac",
"5ZT": "Forest River",
"5Z6": "Suzuki",
"50E": "Lucid",
"50G": "Karma Automotive",
"516": "Autocar",
"523": "VPG",
"52C": "GEM",
"53G": "Coda Automotive",
"53T": "Think North America in Elkhart, IN",
"546": "EBR",
"54C": "Winnebago",
"54D": "Chevrolet",
"55S": "Mercedes-Benz",
"57W": "Mobility Ventures",
"57X": "Polaris Slingshot",
"58A": "Lexus",
"6AB": "MAN",
"6AM": "Jayco",
"6F1": "Ford",
"6F2": "Iveco",
"6F4": "Nissan",
"6F5": "Kenworth",
"6FM": "Mack",
"6FP": "Ford",
"6G1": "GM",
"6G2": "Pontiac",
"6G3": "GM",
"6H8": "GM",
"6MM": "Mitsubishi",
"6MP": "Mercury",
"6T1": "Toyota",
"6U9": "Privately",
"7A1": "Mitsubishi",
"7A3": "Honda",
"7A4": "Toyota",
"7A5": "Ford",
"7A7": "Nissan",
"7FA": "Honda",
"7FC": "Rivian",
"7F7": "Arcimoto",
"7G2": "Tesla",
"7H4": "Hino",
"7H8": "Cenntro",
"7JD": "Volvo",
"7JR": "Volvo",
"7JZ": "Proterra",
"7KG": "Vanderhall",
"7MM": "Mazda",
"7MU": "Toyota",
"7MW": "Cenntro",
"7NA": "Navistar",
"7NY": "Lordstown",
"7PD": "Rivian",
"7SA": "Tesla",
"7SU": "Blue Arc",
"7SV": "Toyota",
"7SX": "Global Electric Motorcars",
"7SY": "Polestar",
"7TN": "Canoo",
"7VV": "Ree",
"7Z0": "Zoox",
"8AB": "Mercedes-Benz",
"8AC": "Mercedes-Benz",
"8AD": "Peugeot",
"8AE": "Peugeot",
"8AF": "Ford",
"8AG": "Chevrolet",
"8AJ": "Toyota",
"8AK": "Suzuki",
"8AN": "Nissan",
"8AP": "Fiat",
"8AT": "Iveco",
"8AW": "Volkswagen",
"8A1": "Renault",
"8A3": "Scania",
"8BB": "Agrale",
"8BC": "Citroën",
"8BR": "Mercedes-Benz",
"8BT": "Mercedes-Benz",
"8BU": "Mercedes-Benz",
"8C3": "Honda",
"8G1": "Renault",
"8GD": "Peugeot",
"8GG": "Chevrolet",
"8LD": "Chevrolet",
"8LF": "Maresa",
"8LG": "Aymesa",
"8L4": "Great Wall",
"8XD": "Ford",
"9BD": "Fiat",
"9BF": "Ford",
"9BG": "Chevrolet",
"9BH": "Hyundai",
"9BM": "Mercedes-Benz",
"9BN": "Mafersa",
"9BR": "Toyota",
"9BS": "Scania",
"9BV": "Volvo",
"9BW": "Volkswagen",
"9DF": "Puma",
"932": "Harley-Davidson",
"935": "Citroën",
"936": "Peugeot",
"937": "Dodge",
"93C": "Chevrolet",
"93H": "Honda",
"93K": "Volvo",
"93P": "Volare",
"93S": "Navistar",
"93R": "Toyota",
"93U": "Audi",
"93W": "Fiat",
"93V": "Navistar",
"93X": "Mitsubishi",
"93Y": "Renault",
"93Z": "Iveco",
"94D": "Nissan",
"94N": "RWM",
"95P": "CAOA",
"988": "Jeep Fiat",
"98M": "BMW",
"98P": "DAF",
"98R": "Chery",
"99A": "Audi",
"99H": "Shineray",
"99J": "Jaguar Land Rover",
"99K": "Haojue Kymco",
"99L": "BYD",
"9FB": "Renault",
"9FC": "Compañía",
"9GA": "Chevrolet",
"9UJ": "Chery",
"9UK": "Lifan",
"9UT": "Dongfeng",
"9UW": "Kia",
"9VC": "Fiat",
"9V7": "Citroën",
"9V8": "Peugeot",
"MM0": "Mazda",
"MM6": "Mazda",
"MM7": "Mazda",
"MM8": "Mazda",
}
def decode_vds(manufacturer, vds):
# Mapping of manufacturers to their VDS positions and corresponding models
vds_model_mapping = {
"Honda": {
1: {
"F": "Agila",
"G": "Insignia",
"J": "Mokka",
"L": "Antara",
"M": "Movano",
"P": ["Astra J", "Zafira C"],
"R": "Astra GTC J",
"S": "Meriva",
"V": "Combo II",
"W": "Cascada",
}
},
"Kia": {
1: {
"A": ["Rio", "EV9"],
"C": ["Niro", "EV6"],
"D": "Rio",
"E": ["Stinger", "Seltos"],
"F": ["Forte", "K4"],
"G": ["Optima", "Magentis", "K5"],
"H": "Rondo",
"J": "Soul",
"K": ["Mohave", "Sorento", "Sportage"],
"L": ["Cadenza", "K9"],
"M": "Sedona",
"N": "Carnival",
"P": ["Sportage", "Sorento", "Telluride"],
"R": "Sorento",
"S": "K9",
}
},
"Peugeot": {
1: {
"A": "604",
"2": "206",
"8": ["406", "508"],
"6": "407",
"9": "308",
"4": "308",
"B": "Expert",
"C": ["208", "504"],
"D": "301",
"3": "307",
"7": ["306", "Partner"],
"U": "2008",
"M": "3008",
}
},
"Toyota": {
1: { # 5th character in VDS
"0": "MR2 Spyder",
"1": "Tundra",
"3": ["Echo", "Yaris"],
"A": ["Highlander", "Sequoia", "Celica", "Supra"],
"B": "Avalon",
"C": ["Sienna", "Previa"],
"D": "T100",
"E": ["Corolla", "Matrix"],
"F": "FJ Cruiser",
"G": "Hilux",
"H": "Highlander",
"J": "Land Cruiser",
"K": "Camry",
"L": ["Tercel", "Paseo"],
"M": "Previa",
"N": "Tacoma",
"P": "Camry",
"R": ["4Runner", "Corolla"],
"T": "Celica FWD",
"U": "Prius",
"V": "RAV4",
"W": "MR2 non Spyder",
"X": "Cressida",
}
},
"Nissan": {
2: {
"A": ["Armada", "Titan", "Maxima"],
"B": "Sentra",
"C": "Versa (07-11)",
"D": ["Truck", "Xterra (00-04)", "Frontier"],
"J": "Maxima",
"L": "Altima",
"N": "Xterra (05-11)",
"P": "Kicks",
"R": "Pathfinder",
"S": ["240SX", "Rogue (08-11)"],
"T": "X Trail",
"U": "Altima",
"Y": "Patrol",
"Z": ["300Z", "350Z", "Murano"],
}
},
"Renault": {
2: { # 5th character in VDS
"0": "Twingo",
"1": "R4",
"2": "R25",
"3": "R4",
"4": ["R21", "Express"],
"5": ["Clio I", "Laguna", "R19", "Safrane"],
"A": ["Megane I", "Master"],
"B": "Clio II",
"C": "Kangoo",
"D": "Master",
"E": ["Espace III", "Avantime"],
"G": "Laguna II",
"H": "Master Propulsion",
"J": ["Vel Satis", "New Trafic"],
"K": "Espace IV",
"L": "Trafic",
"M": "Megan II",
"P": "Modus",
"S": ["Logan", "Sandero", "Duster", "Dokker", "Lodgy"],
"Y": "Koleos",
}
},
# New Manufacturers Added Below
"Ford": {
3: {
"A": ["Fiesta", "Focus"],
"B": ["Mustang", "Explorer"],
"C": "Ranger",
"D": ["Escape", "Edge"],
"E": "F-150",
"F": "Transit",
"G": "Bronco",
"H": "Expedition",
}
},
"BMW": {
4: {
"1": "1 Series",
"2": "2 Series",
"3": "3 Series",
"4": "4 Series",
"5": "5 Series",
"6": "6 Series",
"7": "7 Series",
"8": "8 Series",
"X": "X Series (SUV)",
"Z": "Z Series (Roadster)",
}
},
"Mercedes-Benz": {
3: {
"A": "A-Class",
"B": "B-Class",
"C": "C-Class",
"E": "E-Class",
"G": "G-Class",
"S": "S-Class",
"V": "V-Class",
"X": "GL-Class",
}
},
"Volkswagen": {
2: {
"1": "Golf",
"2": "Jetta",
"3": "Passat",
"4": "Tiguan",
"5": "Polo",
"6": "Arteon",
"7": "Atlas",
"8": "Touareg",
"9": "Beetle",
}
},
"Hyundai": {
1: {
"A": "Accent",
"B": "Elantra",
"C": "Sonata",
"D": "Tucson",
"E": "Santa Fe",
"F": "Kona",
"G": "Palisade",
"H": "Veloster",
"J": "Genesis",
}
},
"Chevrolet": {
2: {
"A": "Camaro",
"B": "Corvette",
"C": "Cruze",
"D": "Malibu",
"E": "Equinox",
"F": "Traverse",
"G": "Silverado",
"H": "Tahoe",
"J": "Suburban",
}
},
"Audi": {
3: {
"1": "A1",
"2": "A2",
"3": "A3",
"4": "A4",
"5": "A5",
"6": "A6",
"7": "A7",
"8": "A8",
"Q": "Q Series (SUV)",
"T": "TT",
}
},
"Subaru": {
2: {
"A": "Impreza",
"B": "Legacy",
"C": "Outback",
"D": "Forester",
"E": "Crosstrek",
"F": "BRZ",
"G": "Ascent",
}
},
"Mazda": {
1: {
"A": "Mazda3",
"B": "Mazda6",
"C": "CX-5",
"D": "CX-9",
"E": "MX-5 Miata",
"F": "CX-30",
"G": "RX-8",
}
},
"Dongfeng": {
1: {
"A": "A-Series",
"B": "SHINE",
"C": "C-Series",
"D": "MAGE",
"E": ["CAPTAIN E", "E32"],
"F": "CAPTAIN C",
"G": "S50",
"H": "Dongfeng Fengshen AX3",
"J": "Dongfeng Joyear SUV",
"K": "Dongfeng Rich 6",
"L": "Dongfeng Sokon",
"M": "Dongfeng Glory 580",
},
2: {
"3": "C35", # Specific models in C-Series
"1": "C31",
"2": "C32",
"7": "C72",
"6": "A60", # Specific models in A-Series
"3": "A30",
"X": ["AX7", "AX4"],
},
3: { # Third character (for AX models)
"7": "AX7", # Resolves AX7
"4": "AX4", # Resolves AX4
},
},
"Changan": {
1: {
"A": "Changan CS35",
"B": "Changan CS55",
"C": "Changan CS75",
"D": "Changan CS85",
"E": "Changan CS95",
"F": "Changan Eado",
"G": "Changan Raeton",
"H": "Changan Alsvin",
"J": "Changan UNI-T",
"K": "Changan UNI-K",
"L": "Changan Oushang",
"M": "Changan Benni",
}
},
"Chery": {
1: {
"A": "Chery Arrizo 5",
"B": "Chery Arrizo 7",
"C": "Chery Tiggo 3",
"D": "Chery Tiggo 5",
"E": "Chery Tiggo 7",
"F": "Chery Tiggo 8",
"G": "Chery QQ",
"H": "Chery Fulwin",
"J": "Chery Cowin",
"K": "Chery eQ1",
"L": "Chery Exeed TX",
"M": "Chery Exeed LX",
}
},
"MG": {
1: {
"A": "MG 3",
"B": "MG 5",
"C": "MG 6",
"D": "MG ZS",
"E": "MG HS",
"F": "MG RX5",
"G": "MG Marvel R",
"H": "MG EZS",
"J": "MG GT",
"K": "MG TF",
"L": "MG Cyberster",
}
},
"JMC": {
1: {
"A": "JMC Yusheng",
"B": "JMC Vigus",
"C": "JMC Baodian",
"D": "JMC Ford Transit",
"E": "JMC S350",
"F": "JMC Teshun",
"G": "JMC Realm",
"H": "JMC Yuhu",
"J": "JMC E200",
"K": "JMC E400",
}
},
"JAC": {
1: {
"A": "JAC J3",
"B": "JAC J4",
"C": "JAC J5",
"D": "JAC J6",
"E": "JAC J7",
"F": "JAC S2",
"G": "JAC S3",
"H": "JAC S4",
"J": "JAC S5",
"K": "JAC S7",
"L": "JAC iEV7S",
"M": "JAC iEVS4",
}
},
"BYD": {
1: {
"A": "BYD F3",
"B": "BYD F6",
"C": "BYD S6",
"D": "BYD Tang",
"E": "BYD Song",
"F": "BYD Yuan",
"G": "BYD Qin",
"H": "BYD Han",
"J": "BYD e5",
"K": "BYD e6",
"L": "BYD Dolphin",
"M": "BYD Seal",
}
},
"Geely": {
1: {
"A": "Geely Emgrand EC7",
"B": "Geely Emgrand GS",
"C": "Geely Emgrand GL",
"D": "Geely Boyue",
"E": "Geely Xingyue",
"F": "Geely Binrui",
"G": "Geely Borui",
"H": "Geely Vision",
"J": "Geely Coolray",
"K": "Geely Monjaro",
"L": "Geely Geometry A",
"M": "Geely Geometry C",
}
},
"Great Wall Motors (GWM)": {
1: {
"A": "GWM Haval H6",
"B": "GWM Haval H9",
"C": "GWM Haval Jolion",
"D": "GWM WEY VV5",
"E": "GWM WEY VV6",
"F": "GWM WEY VV7",
"G": "GWM Ora R1",
"H": "GWM Ora Good Cat",
"J": "GWM Poer",
"K": "GWM Tank 300",
"L": "GWM Tank 500",
}
},
"FAW": {
1: {
"A": "FAW Besturn B50",
"B": "FAW Besturn X40",
"C": "FAW Besturn X80",
"D": "FAW Hongqi H5",
"E": "FAW Hongqi H7",
"F": "FAW Hongqi HS5",
"G": "FAW Hongqi HS7",
"H": "FAW Jiefang Truck",
"J": "FAW Oley",
"K": "FAW Vita",
}
},
"SAIC Motor": {
1: {
"A": "SAIC Maxus G10",
"B": "SAIC Maxus G50",
"C": "SAIC Maxus T60",
"D": "SAIC Roewe RX5",
"E": "SAIC Roewe i5",
"F": "SAIC Roewe i6",
"G": "SAIC MG ZS",
"H": "SAIC MG HS",
"J": "SAIC IM LS7",
"K": "SAIC IM Marvel R",
}
},
}
# Get the mapping for the specified manufacturer
manufacturer_mapping = vds_model_mapping.get(manufacturer, {})
# Iterate through the positions and models in the manufacturer's mapping
for position, models in manufacturer_mapping.items():
# Check if the VDS has enough characters for the specified position
if position - 1 < len(vds):
key = vds[position - 1] # Get the character at the specified position
model = models.get(key, None) # Get the model(s) for the key
if model:
return model # Return the model if found
# Return "Unknown Model" if no match is found
return "Unknown Model"
def decode_vin_haikalna(vin):
if len(vin) != 17:
raise ValueError("Invalid VIN length. VIN must be 17 characters.")
pattern = r"^[A-HJ-NPR-Z0-9]{17}$"
if not re.match(pattern, vin):
raise Exception(
"VIN number must only contain alphanumeric symbols except 'I', 'O', and 'Q' "
)
vin = vin.upper()
wmi = vin[:3]
vds = vin[3:9]
vis = vin[9:17]
manufacturer = wmi_manufacturer_mapping.get(wmi, vds)
year_code = vis[0]
year = vin_year(year_code)
model = decode_vds(manufacturer, vds)
data = {
"maker": manufacturer,
"model": model,
"modelYear": year,
}
print(data)
return data