feat: VIN textbox WMI marka ikonu + WMI haritasını shared'e taşı/genişlet

- WMI_BRAND_MAP + getBrandFromWmi packages/shared'e taşındı (tek kaynak);
  corgi.service artık buradan import ediyor (davranış aynı, testler geçiyor)
- VinBrandIcon: VIN'in WMI'ı bilinen markaya denk gelince büyüteç yerine
  marka logosu pop animasyonuyla görünür (landing + search VIN textbox)
- WMI haritasına prod DB'de decode edilmiş VIN'lerden 23 eksik WMI eklendi
  (Türkiye fabrikaları NM4/NMT/NLA/NLH/NMB dahil; tüm DB WMI'ları artık tanınıyor)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-25 23:51:40 +03:00
parent 96171c0726
commit 77de860211
7 changed files with 215 additions and 103 deletions

View File

@@ -1,4 +1,5 @@
import { Injectable, Logger } from "@nestjs/common";
import { WMI_BRAND_MAP } from "@sase/shared";
interface CorgiDecodeResult {
brandName: string;
@@ -7,105 +8,6 @@ interface CorgiDecodeResult {
isKnown: boolean;
}
const WMI_DATABASE: Record<string, string> = {
// BMW
WBA: "BMW",
WBS: "BMW",
WBY: "BMW",
"5UX": "BMW",
// Mercedes-Benz
WDB: "Mercedes-Benz",
WDC: "Mercedes-Benz",
WDD: "Mercedes-Benz",
WDF: "Mercedes-Benz",
// Audi
WAU: "Audi",
WUA: "Audi",
// Volkswagen
WVW: "Volkswagen",
WVG: "Volkswagen",
"3VW": "Volkswagen",
WV1: "Volkswagen",
WV2: "Volkswagen",
WV3: "Volkswagen",
// Toyota
JTD: "Toyota",
JTE: "Toyota",
JTN: "Toyota",
"2T1": "Toyota",
"4T1": "Toyota",
// Fiat
ZFA: "Fiat",
ZFC: "Fiat",
// Renault
VF1: "Renault",
VF2: "Renault",
// Peugeot
VF3: "Peugeot",
VR3: "Peugeot", // newer Stellantis-era WMI
VR7: "Peugeot", // newer Stellantis-era WMI
// Citroen
VF7: "Citroen",
VR1: "Citroen", // newer Citroën/DS WMI
// Honda
JHM: "Honda",
SHH: "Honda",
"1HG": "Honda",
// Hyundai
KMH: "Hyundai",
"5NP": "Hyundai",
// Kia
KNA: "Kia",
KND: "Kia",
// Ford
WF0: "Ford",
NM0: "Ford",
"1FA": "Ford",
"3FA": "Ford",
// Opel
W0L: "Opel",
W0V: "Opel", // newer Stellantis-era WMI
// Skoda
TMB: "Skoda",
// Seat
VSS: "Seat",
// Volvo
YV1: "Volvo",
// Nissan
JN1: "Nissan",
"1N4": "Nissan",
"3N1": "Nissan",
// Mazda
JMZ: "Mazda",
JM1: "Mazda",
JM3: "Mazda",
// Porsche
WP0: "Porsche",
WP1: "Porsche",
// Land Rover
SAL: "Land Rover",
// Jaguar
SAJ: "Jaguar",
// Mini
WMW: "Mini",
// Dacia
UU1: "Dacia",
// Subaru
JF1: "Subaru",
JF2: "Subaru",
// Suzuki
JS2: "Suzuki",
JS3: "Suzuki",
TSM: "Suzuki",
MA3: "Suzuki",
MBH: "Suzuki",
// Mitsubishi
JMB: "Mitsubishi",
JMY: "Mitsubishi",
MMB: "Mitsubishi",
ML3: "Mitsubishi",
};
const YEAR_MAP: Record<string, number> = {
A: 2010,
B: 2011,
@@ -148,7 +50,7 @@ export class CorgiService {
if (upper.length !== 17) return null;
const wmi = upper.substring(0, 3);
const brandName = WMI_DATABASE[wmi];
const brandName = WMI_BRAND_MAP[wmi];
if (!brandName) {
this.logger.warn(`Unknown WMI: ${wmi}`);
@@ -169,6 +71,6 @@ export class CorgiService {
}
getBrandFromWmi(wmi: string): string | null {
return WMI_DATABASE[wmi.toUpperCase()] ?? null;
return WMI_BRAND_MAP[wmi.toUpperCase()] ?? null;
}
}