haikal/inventory/haikalna.py
Marwan Alwali 43228b97a8 update
2025-01-07 16:45:00 +03:00

1854 lines
44 KiB
Python

import re
from itertools import cycle
from datetime import datetime
from typing import List
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: { # First character
'A': 'A-Series',
'B': 'SHINE', # SHINE model
'C': 'C-Series', # General C-Series
'D': 'MAGE', # MAGE model
'E': ['CAPTAIN E', 'E32'], # CAPTAIN and E-Series models
'F': 'CAPTAIN C', # CAPTAIN C model
'G': 'S50', # S50 model
'H': 'Dongfeng Fengshen AX3',
'J': 'Dongfeng Joyear SUV',
'K': 'Dongfeng Rich 6',
'L': 'Dongfeng Sokon',
'M': 'Dongfeng Glory 580',
},
2: { # Second character (for C-Series)
'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(f"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