diff --git a/.DS_Store b/.DS_Store
index d4706b1a..2569b8d7 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/colors.txt b/colors.txt
new file mode 100644
index 00000000..ed0f27b6
--- /dev/null
+++ b/colors.txt
@@ -0,0 +1,20 @@
+exterior_colors = [
+ "192, 192, 192"
+ "0, 0, 0"
+ "255, 255, 255"
+ "128, 128, 128"
+ "255, 0, 0"
+ "255, 69, 0"
+ "0, 0, 255"
+ "75, 0, 130"
+ "255, 215, 0"
+ "34, 139, 34"
+ "160, 82, 45"
+ "245, 245, 220"
+ "210, 105, 30"
+ "255, 20, 147"
+ "255, 228, 196"
+ "255, 223, 0"
+ "85, 107, 47"
+ "192, 192, 192"
+ ]
\ No newline at end of file
diff --git a/exports/makes_without_models.csv b/exports/makes_without_models.csv
new file mode 100644
index 00000000..ee6dfec5
--- /dev/null
+++ b/exports/makes_without_models.csv
@@ -0,0 +1,2 @@
+make_id,make_name,is_sa_import
+4148,DFM,False
diff --git a/exports/models_without_series.csv b/exports/models_without_series.csv
new file mode 100644
index 00000000..5d19ddc2
--- /dev/null
+++ b/exports/models_without_series.csv
@@ -0,0 +1,560 @@
+model_id,model_name,make_id,make_name
+19753,Vigor,2,Acura
+31,Alfa 6,3,Alfa Romeo
+19754,1750,3,Alfa Romeo
+19755,2000,3,Alfa Romeo
+19756,2300,3,Alfa Romeo
+19759,Dauphine,3,Alfa Romeo
+19763,DB2,9,Aston Martin
+19764,DB2/4,9,Aston Martin
+19765,DB4,9,Aston Martin
+19766,DB6,9,Aston Martin
+19555,F103,10,Audi
+19768,4000,10,Audi
+19769,5000,10,Audi
+19771,Fox,10,Audi
+22556,Q8 I,10,Audi
+120,Mini Metro,11,Austin
+22595,BJ 2021,14,Beijing
+19259,S-series,15,Bentley
+19784,Type 57,24,Bugatti
+19786,F7,26,BYD
+19787,i6,26,BYD
+19788,Calais,28,Cadillac
+19789,Series 61,28,Cadillac
+19790,Series 70,28,Cadillac
+19791,SLS,28,Cadillac
+19793,Star Truck,32,Changan
+22484,CM8,32,Changan
+22492,Chana SM8,32,Changan
+245,SUV,33,ChangFeng
+2253,A19,34,Chery
+19797,Arauca,34,Chery
+19799,Cowin,34,Chery
+19802,Ego,34,Chery
+19803,Elara,34,Chery
+19804,Face,34,Chery
+19805,Fengyun,34,Chery
+19807,Fulwin,34,Chery
+19808,Fulwin 2,34,Chery
+19809,J1,34,Chery
+19810,J11,34,Chery
+19814,Qiyun,34,Chery
+19816,Riich 2,34,Chery
+19818,Storm 2,34,Chery
+2255,City Express,35,Chevrolet
+19270,Stylemaster,35,Chevrolet
+19820,150,35,Chevrolet
+19821,1700,35,Chevrolet
+19822,210,35,Chevrolet
+19823,400,35,Chevrolet
+19826,Biscayne,35,Chevrolet
+19827,Calibra,35,Chevrolet
+19828,Chevy II,35,Chevrolet
+19831,Commodore,35,Chevrolet
+19834,Delray,35,Chevrolet
+19836,Fleetline,35,Chevrolet
+19851,Opala,35,Chevrolet
+19855,Senator,35,Chevrolet
+19857,Spectrum,35,Chevrolet
+19859,Sprint,35,Chevrolet
+19862,Task Force,35,Chevrolet
+19867,Veraneio,35,Chevrolet
+340,TC,36,Chrysler
+19870,Alpine,36,Chrysler
+19871,Avenger,36,Chrysler
+19872,Centura,36,Chrysler
+19873,Conquest,36,Chrysler
+19875,Delta,36,Chrysler
+19876,Drifter,36,Chrysler
+19877,Executive,36,Chrysler
+19879,Horizon,36,Chrysler
+19880,Hunter,36,Chrysler
+19881,Lancer,36,Chrysler
+19882,Laser,36,Chrysler
+19884,Sunbeam,36,Chrysler
+19885,Valiant,36,Chrysler
+19886,Valiant Galant,36,Chrysler
+19888,Axel,37,Citroen
+19889,Bijou,37,Citroen
+19890,C15,37,Citroen
+19892,C35,37,Citroen
+19894,Chanson,37,Citroen
+19897,Dispatch,37,Citroen
+19898,Fukang,37,Citroen
+19900,ID,37,Citroen
+19902,Mehari,37,Citroen
+19905,Synergie,37,Citroen
+19906,1100,40,Dacia
+19907,1320,40,Dacia
+19909,2000,40,Dacia
+19910,500,40,Dacia
+19911,D6,40,Dacia
+19912,Denem,40,Dacia
+19913,Gamma,40,Dacia
+19915,Shifter,40,Dacia
+19917,Aranos,42,Daewoo
+19918,Brougham,42,Daewoo
+19919,Cielo,42,Daewoo
+19920,Fantasy,42,Daewoo
+19921,Imperial,42,Daewoo
+19924,Maepsy,42,Daewoo
+19925,Pointer,42,Daewoo
+19927,Veritas,42,Daewoo
+19929,Ayla,44,Daihatsu
+19931,Compagno,44,Daihatsu
+19932,Consorte,44,Daihatsu
+19933,Domino,44,Daihatsu
+19935,Fourtrak,44,Daihatsu
+19936,Gran Max,44,Daihatsu
+19938,Luxio,44,Daihatsu
+19941,Sportrak,44,Daihatsu
+19942,Taruna,44,Daihatsu
+19943,Valera,44,Daihatsu
+19944,Zebra,44,Daihatsu
+19948,1000,47,Datsun
+19949,1200,47,Datsun
+19950,200SX,47,Datsun
+19951,240Z / 260Z / 280Z,47,Datsun
+19952,510,47,Datsun
+19953,610,47,Datsun
+19954,710,47,Datsun
+19955,810,47,Datsun
+19956,B-210,47,Datsun
+19959,Fairlady,47,Datsun
+19961,Patrol,47,Datsun
+19962,Pickup,47,Datsun
+19964,330,51,Dodge
+19965,400,51,Dodge
+19966,440,51,Dodge
+19967,A100,51,Dodge
+19968,Aspen,51,Dodge
+19970,Brisa,51,Dodge
+19972,Conquest,51,Dodge
+19974,Demon,51,Dodge
+19976,Forza,51,Dodge
+19977,Matador,51,Dodge
+19978,Meadowbrook,51,Dodge
+19979,Mirada,51,Dodge
+19980,Phoenix,51,Dodge
+19982,Power Wagon,51,Dodge
+19984,Ram 50,51,Dodge
+19985,Rampage,51,Dodge
+19987,Royal,51,Dodge
+19988,SE,51,Dodge
+19990,St. Regis,51,Dodge
+19992,Future,52,DongFeng
+20941,AX3,52,DongFeng
+20950,A60,52,DongFeng
+19993,Orion M,53,Doninvest
+19998,Besturn B90,59,FAW
+19999,C131,59,FAW
+20000,Jiabao,59,FAW
+20001,Kun Cheng,59,FAW
+20002,M80,59,FAW
+20004,Sirius S80,59,FAW
+20007,Vela,59,FAW
+20008,Xiali N3,59,FAW
+20009,Xiali N5,59,FAW
+540,208,60,Ferrari
+20011,250,60,Ferrari
+20014,330,60,Ferrari
+20015,365,60,Ferrari
+20016,Berlinetta Boxer,60,Ferrari
+609,X1/9,61,Fiat
+20017,1100,61,Fiat
+20018,1200,61,Fiat
+20020,1300/1500,61,Fiat
+20021,133,61,Fiat
+20022,1400,61,Fiat
+20023,147,61,Fiat
+20024,1800/2100,61,Fiat
+20028,850,61,Fiat
+20029,Brio,61,Fiat
+20030,Campagnola,61,Fiat
+20032,Dino,61,Fiat
+20034,Elba,61,Fiat
+20035,Marengo,61,Fiat
+20036,Mille,61,Fiat
+20037,Panorama,61,Fiat
+20038,Perla,61,Fiat
+20040,Premio,61,Fiat
+20041,Spazio,61,Fiat
+20042,Talento,61,Fiat
+20043,Tucan,61,Fiat
+20044,Viaggio,61,Fiat
+20045,Vivace,61,Fiat
+22557,Fullback I,61,Fiat
+2223,Bronco II,63,Ford
+2275,Courier,63,Ford
+20048,Bantam,63,Ford
+20049,Comete,63,Ford
+20050,Corcel,63,Ford
+20051,Corsair,63,Ford
+20053,Del Rey,63,Ford
+20054,Durango,63,Ford
+20056,Elite,63,Ford
+20058,EXP,63,Ford
+20066,GPW,63,Ford
+20069,Lobo,63,Ford
+20070,LTD II,63,Ford
+20072,Pampa,63,Ford
+20073,Pilot,63,Ford
+20074,Pinto,63,Ford
+20075,Popular,63,Ford
+20076,Prefect,63,Ford
+20081,Vedette,63,Ford
+20082,Verona,63,Ford
+20083,Zodiac,63,Ford
+679,CK,67,Geely
+685,LC,67,Geely
+20097,CD,67,Geely
+20098,FC,67,Geely
+20101,HQ,67,Geely
+20103,SL,67,Geely
+20104,Uliou,67,Geely
+724,Voleex C10,71,Great Wall
+20105,Steed,71,Great Wall
+20106,Voleex C20R,71,Great Wall
+20108,Voleex V80,71,Great Wall
+20110,X240,71,Great Wall
+20111,Junyi,72,Hafei
+20112,Lobo,72,Hafei
+20113,Luzun,72,Hafei
+20116,Saima,72,Hafei
+20117,Zhongyi,72,Hafei
+20119,CX20,73,Haima
+20122,Fstar,73,Haima
+20123,H2,73,Haima
+20124,M11,73,Haima
+20125,M6,73,Haima
+20126,M8,73,Haima
+20127,S3,73,Haima
+20128,S7,73,Haima
+20131,Adventra,75,Holden
+20132,Barina Spark,75,Holden
+20133,Belmont,75,Holden
+20134,Berlina,75,Holden
+20135,Brougham,75,Holden
+20136,Camira,75,Holden
+20137,Captiva,75,Holden
+20138,Colorado,75,Holden
+20139,Crewman,75,Holden
+20140,Drover,75,Holden
+20141,Epica,75,Holden
+20142,Gemini,75,Holden
+20143,Kingswood,75,Holden
+20144,Malibu,75,Holden
+20145,Monterey,75,Holden
+20147,Piazza,75,Holden
+20148,Sandman,75,Holden
+20149,Tigra,75,Holden
+20150,Torana,75,Holden
+20151,Viva,75,Holden
+20152,Volt,75,Holden
+20153,1300,76,Honda
+20155,Amaze,76,Honda
+20163,MR-V,76,Honda
+20171,S800,76,Honda
+20172,Spirior,76,Honda
+23399,Forza,76,Honda
+23400,CB650R,76,Honda
+20173,Santa Fe,77,HuangHai
+20192,i25,79,Hyundai
+20203,Santro,79,Hyundai
+20204,Santro Xing,79,Hyundai
+20216,Bardo,83,Iran Khodro
+20221,Alterra,85,Isuzu
+20222,Bellel,85,Isuzu
+20224,Campo,85,Isuzu
+20225,Como,85,Isuzu
+20226,Crosswind,85,Isuzu
+20229,Fuego,85,Isuzu
+20230,I-Mark,85,Isuzu
+20231,i-Series,85,Isuzu
+20235,Panther,85,Isuzu
+20236,Statesman de Ville,85,Isuzu
+20237,Wasp,85,Isuzu
+20238,WFR,85,Isuzu
+20996,Filly,85,Isuzu
+20241,240/340,88,Jaguar
+20242,420,88,Jaguar
+20243,Mark,88,Jaguar
+20244,SS,88,Jaguar
+20245,2500,89,Jeep
+20247,Commando,89,Jeep
+20250,Baowei,91,JMC
+20256,Yuhu,91,JMC
+20257,Yusheng,91,JMC
+948,Opirus,92,Kia
+20259,Besta,92,Kia
+20277,CCXR,93,Koenigsegg
+20278,350GT,95,Lamborghini
+20279,400GT,95,Lamborghini
+22540,Egoista I,95,Lamborghini
+996,Montecarlo,96,Lancia
+20283,2000,96,Lancia
+20287,Scorpion,96,Lancia
+20288,Stratos HF,96,Lancia
+1014,Series,97,Land Rover
+20293,Foison,101,Lifan
+20298,Cosmopolitan,102,Lincoln
+20299,Custom,102,Lincoln
+20300,K-Series,102,Lincoln
+20305,7,103,Lotus
+20306,Carlton,103,Lotus
+20307,Omega,103,Lotus
+20308,MM 775,106,Mahindra
+20311,3500 GT,111,Maserati
+20315,Mistral,111,Maserati
+20316,Racing,111,Maserati
+20317,Sebring,111,Maserati
+20319,Zeppelin,112,Maybach
+20320,808,113,Mazda
+20321,Allegro,113,Mazda
+20322,Bongo Brawny,113,Mazda
+20323,Bravo,113,Mazda
+20325,Clef,113,Mazda
+20326,Drifter,113,Mazda
+20330,GLC,113,Mazda
+20332,Miata,113,Mazda
+20333,Montrose,113,Mazda
+20334,Porter,113,Mazda
+20335,Porter Cab,113,Mazda
+20336,R100,113,Mazda
+20338,Roadpacer AP,113,Mazda
+20339,RX-2,113,Mazda
+1207,SLS AMG,116,Mercedes-Benz
+20367,Type 300,116,Mercedes-Benz
+22646,S-klas (w126),116,Mercedes-Benz
+20371,Bobcat,117,Mercury
+20373,Comet,117,Mercury
+20374,Commuter,117,Mercury
+20375,Custom,117,Mercury
+20376,Cyclone,117,Mercury
+20377,LN7,117,Mercury
+20378,Lynx,117,Mercury
+20379,M-47,117,Mercury
+20380,Medalist,117,Mercury
+20381,Meteor,117,Mercury
+20382,Monarch,117,Mercury
+20383,Montclair,117,Mercury
+20384,Park Lane,117,Mercury
+20385,S-55,117,Mercury
+20386,Turnpike Cruiser,117,Mercury
+20387,Voyager,117,Mercury
+20388,Zephyr,117,Mercury
+1240,B,119,MG
+20389,1100/1300,119,MG
+20391,A,119,MG
+20392,C,119,MG
+20393,Magnette,119,MG
+1289,Jeep,123,Mitsubishi
+20398,380,123,Mitsubishi
+20399,Adventure,123,Mitsubishi
+20402,Expo,123,Mitsubishi
+20406,Grunder,123,Mitsubishi
+20407,L100,123,Mitsubishi
+20411,Magna,123,Mitsubishi
+20412,Magnum,123,Mitsubishi
+20413,Maven,123,Mitsubishi
+20414,Mighty Max,123,Mitsubishi
+20415,Montero iO,123,Mitsubishi
+20416,Nimbus,123,Mitsubishi
+20418,Precis,123,Mitsubishi
+20420,Scorpion,123,Mitsubishi
+20421,Shogun Pinin,123,Mitsubishi
+20422,Shogun Sport,123,Mitsubishi
+20423,Towny,123,Mitsubishi
+20424,Verada,123,Mitsubishi
+20425,Warrior,123,Mitsubishi
+20426,Zinger,123,Mitsubishi
+21000,Fuzion,123,Mitsubishi
+20427,Classic Type F,124,Mitsuoka
+20428,70,127,Nissan
+20434,Axxess,127,Nissan
+20437,Cherry Cab,127,Nissan
+20443,Hikari,127,Nissan
+20445,Hustler,127,Nissan
+20448,Junior,127,Nissan
+20455,Multi,127,Nissan
+20461,Pintara,127,Nissan
+20464,Tsuru,127,Nissan
+20468,Delta 88,129,Oldsmobile
+20469,Deluxe 88,129,Oldsmobile
+20470,Dynamic 88,129,Oldsmobile
+20471,Super 88,129,Oldsmobile
+20810,98,129,Oldsmobile
+20472,Arena,130,Opel
+20473,Bedford Blitz,130,Opel
+20474,Blazer,130,Opel
+20476,Calais,130,Opel
+20480,302,135,Peugeot
+20481,401,135,Peugeot
+20483,Hoggar,135,Peugeot
+20486,Pars,135,Peugeot
+20487,Persia,135,Peugeot
+20488,Roa,135,Peugeot
+22596,Grand Espace,136,Piaggio
+22597,Grand Scenic,136,Piaggio
+22598,Grand C4 Picasso,136,Piaggio
+20489,Acadian,138,Pontiac
+20490,Astre,138,Pontiac
+20491,Chieftain,138,Pontiac
+20492,Executive,138,Pontiac
+20494,G3,138,Pontiac
+20495,Grand Safari,138,Pontiac
+20496,Grand Ville,138,Pontiac
+20498,Matiz,138,Pontiac
+20499,Pathfinder,138,Pontiac
+20500,Pursuit,138,Pontiac
+20501,Star Chief,138,Pontiac
+20502,Strato Chief,138,Pontiac
+20503,Streamliner,138,Pontiac
+20504,Sunburst,138,Pontiac
+20506,Super Chief,138,Pontiac
+20508,Ventura,138,Pontiac
+20515,3,147,Renault
+19350,Silver Dawn,149,Rolls-Royce
+20533,Flying Spur,149,Rolls-Royce
+20535,10,151,Rover
+20537,16,151,Rover
+20539,CityRover,151,Rover
+20543,P5,151,Rover
+20544,Quintet,151,Rover
+1647,PS10,154,Santana
+20547,1200/1430 Sport,157,SEAT
+20548,124,157,SEAT
+20549,127,157,SEAT
+20550,128,157,SEAT
+20551,131,157,SEAT
+20553,1400,157,SEAT
+20554,1430,157,SEAT
+20555,1500,157,SEAT
+20556,600/800,157,SEAT
+20557,850,157,SEAT
+20559,Panda,157,SEAT
+20560,Ritmo,157,SEAT
+20561,CEO,158,ShuangHuan
+1681,100,159,Skoda
+20562,1000 MB,159,Skoda
+20564,1201,159,Skoda
+20565,1202,159,Skoda
+20567,440/445/450,159,Skoda
+20569,Garde,159,Skoda
+20572,VOS,159,Skoda
+20577,1500,166,Subaru
+20580,Estratto,166,Subaru
+20581,FF-1,166,Subaru
+20582,Fiori,166,Subaru
+20584,Loyale,166,Subaru
+20585,Mini Jumbo,166,Subaru
+20587,Vortex,166,Subaru
+20592,Cultus Crescent,167,Suzuki
+20595,Forsa,167,Suzuki
+20597,Fun,167,Suzuki
+20598,Grand Escudo,167,Suzuki
+20599,Grand Nomade,167,Suzuki
+20600,Karimun Estilo,167,Suzuki
+20601,Khyber,167,Suzuki
+20602,Lapin,167,Suzuki
+20603,Margalla,167,Suzuki
+20604,Mehran,167,Suzuki
+20605,Mighty Boy,167,Suzuki
+20606,Potohar,167,Suzuki
+20607,Santana,167,Suzuki
+20608,SC100,167,Suzuki
+20612,Beta,170,Tatra
+20615,T87,170,Tatra
+20616,Chenglong,173,Tianma
+1820,AC,176,Toyota
+2153,Master,176,Toyota
+19582,Pixis,176,Toyota
+20627,AA,176,Toyota
+20628,AB,176,Toyota
+20629,AE,176,Toyota
+20630,Agya,176,Toyota
+20633,Briska,176,Toyota
+20634,Carri,176,Toyota
+20637,Condor,176,Toyota
+20644,Kijang,176,Toyota
+20645,Lexcen,176,Toyota
+20647,MasterAce,176,Toyota
+20648,MiniAce,176,Toyota
+20654,Quantum,176,Toyota
+20655,Reiz,176,Toyota
+20657,Space Cruiser,176,Toyota
+20659,Stallion,176,Toyota
+20660,Stout,176,Toyota
+20661,Super,176,Toyota
+20662,T100,176,Toyota
+20663,Tamaraw FX,176,Toyota
+20664,Tarago,176,Toyota
+20665,Tazz,176,Toyota
+20666,Tiara,176,Toyota
+20668,Unser,176,Toyota
+20670,Venture,176,Toyota
+20671,Vienta,176,Toyota
+20673,Zace,176,Toyota
+22632,Karl,181,Vauxhall
+22637, Signum,181,Vauxhall
+20678,Country Buggy,184,Volkswagen
+20958,Dune Buggy,184,Volkswagen
+1934,140,185,Volvo
+1937,260,185,Volvo
+19301,120,185,Volvo
+20693,340,185,Volvo
+20694,360,185,Volvo
+20695,Amazon,185,Volvo
+20696,Duett,185,Volvo
+20698,PV444/544,185,Volvo
+20699,PV60,185,Volvo
+20700,Megabusa,188,Westfield
+20938,GT MF4,189,Wiesmann
+1981,RX6400,192,Zotye
+22619,21213,215,VAZ (Lada)
+2024,2308 Ataman,216,GAZ
+20710,3105 Volga,216,GAZ
+20719,M-1,216,GAZ
+20939,233001 Tigr,216,GAZ
+20724,110,218,ZIL
+20732,2315,223,Moskvich
+20733,2335,223,Moskvich
+20737,Moto stroller,224,SMZ
+2272,Tropica Roadster,284,Renaissance Cars
+19306,Trumpf,3664,Adler
+20762,MPV,3755,Efini
+20763,MS-6,3755,Efini
+20764,MS-8,3755,Efini
+20765,MS-9,3755,Efini
+20766,RX-7,3755,Efini
+20769,Bliss,3757,Groz
+20770,Dacota,3757,Groz
+20776,Vertus,3757,Groz
+20781,AlbaycĂn,3760,Hurtan
+20790,522,3767,Nysa
+20991,Other cars,3822,Other car
+20992,Other russian machines,3822,Other car
+20993,Self collected,3822,Other car
+22524,124 GT,4146,Abarth
+22526,124 Spider Turismo,4146,Abarth
+22527,595,4146,Abarth
+22528,595 Competizione,4146,Abarth
+22529,595 Pista,4146,Abarth
+22530,595 Turismo,4146,Abarth
+22531,695 Biposto,4146,Abarth
+22532,695 Rivale,4146,Abarth
+22533,695 XSR Yamaha,4146,Abarth
+22541,207A Boano Spyder Corsa,4146,Abarth
+22542,750 GT Zagato,4146,Abarth
+22543,1000 SP,4146,Abarth
+22545,2000 SE027,4146,Abarth
+22546,131 Rally,4146,Abarth
+22547,Lancia Rally 037 Stradale,4146,Abarth
+22548,Lancia Delta S4 Stradale (SE038),4146,Abarth
+22549,500 Pogea Racing Ares,4146,Abarth
+22585,Beijing BJ20,4147,Baic
+22586,ES 210,4147,Baic
+22588,Huansu S2,4147,Baic
+22589,Huansu S3,4147,Baic
+22590,Huansu S5,4147,Baic
diff --git a/exports/series_without_trims.csv b/exports/series_without_trims.csv
new file mode 100644
index 00000000..ccdc08f5
--- /dev/null
+++ b/exports/series_without_trims.csv
@@ -0,0 +1,431 @@
+serie_id,serie_name,model_id,model_name,make_id,make_name
+53807,Crossover,11,MDX,2,Acura
+47558,Sprint Coupe 2-doors,40,Giulietta,3,Alfa Romeo
+47559,Sprint Speciale Coupe 2-doors,40,Giulietta,3,Alfa Romeo
+47562,SVZ Coupe 2-doors,40,Giulietta,3,Alfa Romeo
+47564,3 roadster 1-doors,55,Atom,6,Ariel
+47565,3.5 roadster 1-doors,55,Atom,6,Ariel
+2881,S liftback,67,Rapide,9,Aston Martin
+8329,Avant hatchback,75,100,10,Audi
+8331,Coupe,75,100,10,Audi
+8332,Sedan,75,100,10,Audi
+47567,Sedan,75,100,10,Audi
+47569,Sedan 4-doors,75,100,10,Audi
+5466,Sedan,78,80,10,Audi
+5467,Sedan 2-doors,78,80,10,Audi
+47571,Sedan 2-doors,78,80,10,Audi
+47573,Sedan 4-doors,78,80,10,Audi
+47574,wagon,78,80,10,Audi
+47576,Sedan 2-doors,78,80,10,Audi
+54107,Citycarver hatchback,80,A1,10,Audi
+53743,wagon 5 doors,83,A4 allroad,10,Audi
+54011,Avant wagon,84,A4,10,Audi
+54012,Allroad quattro wagon,84,A4,10,Audi
+53302,Sportback hatchback,100,RS 3,10,Audi
+47589,Avant Nogaro selection wagon 5-doors,101,RS 4,10,Audi
+53735,Sedan,108,S4,10,Audi
+54013,Avant wagon,108,S4,10,Audi
+53632,Coupe 2-doors,114,TT,10,Audi
+53633,Roadster 2-doors,114,TT,10,Audi
+53634,S Coupe 2-doors,114,TT,10,Audi
+54110,R Coupe 2-doors,131,Continental,15,Bentley
+54111,Coupe,131,Continental,15,Bentley
+62954,Flying Spur Sedan,131,Continental,15,Bentley
+5615,Sedan,186,Electra,25,Buick
+67451,Crossover,239,CS35,32,Changan
+5679,Sedan,250,Fora (A21),34,Chery
+5684,Hatchback,255,QQ,34,Chery
+47617,Hatchback 5-doors,259,Astra,35,Chevrolet
+47620,Conversion minivan 4-doors,260,Astro,35,Chevrolet
+5696,SUV,264,Blazer,35,Chevrolet
+5697,SUV,264,Blazer,35,Chevrolet
+14922,SUV,264,Blazer,35,Chevrolet
+47623,K5 SUV 3-doors,264,Blazer,35,Chevrolet
+47624,S-10 SUV 3-doors,264,Blazer,35,Chevrolet
+47625,S-10 SUV 5-doors,264,Blazer,35,Chevrolet
+47626,K5 SUV 3-doors,264,Blazer,35,Chevrolet
+47627,K1500 SUV,264,Blazer,35,Chevrolet
+47745,Station Wagon wagon,275,Classic,35,Chevrolet
+47746,Sedan,275,Classic,35,Chevrolet
+47747,Sedan,275,Classic,35,Chevrolet
+47760,50th Anniversary cabriolet 2-doors,280,Corvette,35,Chevrolet
+47761,50th Anniversary Coupe 2-doors,280,Corvette,35,Chevrolet
+47898,SS targa 2-doors,297,Monte Carlo,35,Chevrolet
+47899,SS Aerocoupe targa 2-doors,297,Monte Carlo,35,Chevrolet
+47901,targa,297,Monte Carlo,35,Chevrolet
+47915,Spyder hatchback 3-doors,298,Monza,35,Chevrolet
+47916,Sport hatchback 3-doors,298,Monza,35,Chevrolet
+47917,Hatchback,298,Monza,35,Chevrolet
+47918,wagon,298,Monza,35,Chevrolet
+54017,Sedan,298,Monza,35,Chevrolet
+5761,Cabriolet,315,Tracker,35,Chevrolet
+47951,SUV,315,Tracker,35,Chevrolet
+53780,Crossover 5-doors,417,Winstorm,42,Daewoo
+62956,Hatchback,428,Coo,44,Daihatsu
+8511,Hatchback 5-doors,430,Cuore,44,Daihatsu
+53618,Minivan,440,Move,44,Daihatsu
+3199,Sedan,470,Stanza,47,Datsun
+3200,Hatchback 5-doors,470,Stanza,47,Datsun
+45393,Crossover,623,Edge,63,Ford
+48042,RS wagon 5-doors,626,Escort,63,Ford
+48043,RS wagon 3-doors,626,Escort,63,Ford
+53452,Super Cab pickup 2-doors,658,Ranger,63,Ford
+53453,SuperCrew pickup 4-doors,658,Ranger,63,Ford
+6229,Hatchback 5-doors,687,MK Cross,67,Geely
+6309,wagon,753,Accord,76,Honda
+48145,US-spec Sedan 4-doors,753,Accord,76,Honda
+48147,US-spec Sedan 4-doors,753,Accord,76,Honda
+48148,Hatchback,753,Accord,76,Honda
+48149,GXR Sedan 4-doors,753,Accord,76,Honda
+48151,Sedan 4-doors,753,Accord,76,Honda
+48155,Hatchback,759,City,76,Honda
+48156,Cabriolet,759,City,76,Honda
+6350,Shuttle wagon 5-doors,761,Civic,76,Honda
+6352,Hatchback,761,Civic,76,Honda
+15285,Sedan 2-doors,761,Civic,76,Honda
+48183,Si Sedan 4-doors,761,Civic,76,Honda
+48185,RS Sedan 2-doors,761,Civic,76,Honda
+48187,Sedan 4-doors,761,Civic,76,Honda
+62957,Hatchback,765,CR-Z,76,Honda
+53781,Crossover 3-doors,777,HR-V,76,Honda
+48227,Pickup,784,Life,76,Honda
+48228,Hatchback,784,Life,76,Honda
+48229,Sedan 4-doors,784,Life,76,Honda
+48230,Sedan 2-doors,784,Life,76,Honda
+1094,Minivan,811,Zest,76,Honda
+48295,Sedan,831,Grandeur,79,Hyundai
+3525,Hatchback 5-doors,906,"J3 (Tongyue,Tojoy)",87,JAC
+6717,Sedan,1047,MKZ,102,Lincoln
+14997,Sedan,1047,MKZ,102,Lincoln
+48421,Stretch Limousine,1049,Town Car,102,Lincoln
+54135,Coupe,1106,Ghibli,111,Maserati
+3660,Hatchback,1125,323,113,Mazda
+6809,Hatchback 3-doors,1125,323,113,Mazda
+6813,wagon,1125,323,113,Mazda
+6814,Hatchback 5-doors,1125,323,113,Mazda
+6827,Sedan,1129,626,113,Mazda
+48449,Liftback,1129,626,113,Mazda
+6832,Sedan,1131,929,113,Mazda
+48453,Hatchback,1132,Atenza,113,Mazda
+48455,Hatchback,1132,Atenza,113,Mazda
+48459,Hatchback,1132,Atenza,113,Mazda
+48467,Double Cab pickup 4-doors,1137,B-Series,113,Mazda
+48469,Freestyle Cab pickup 4-doors,1137,B-Series,113,Mazda
+48472,Pickup,1137,B-Series,113,Mazda
+48473,Pickup,1137,B-Series,113,Mazda
+48474,Pickup,1137,B-Series,113,Mazda
+48490,Sedan,1142,Capella,113,Mazda
+48491,Coupe,1142,Capella,113,Mazda
+48492,Sedan,1142,Capella,113,Mazda
+8795,wagon,1156,Familia,113,Mazda
+45157,Hatchback 3-doors,1156,Familia,113,Mazda
+48496,Field Break hatchback 5-doors,1156,Familia,113,Mazda
+48500,Hatchback 3-doors,1156,Familia,113,Mazda
+48501,Hatchback 5-doors,1156,Familia,113,Mazda
+48502,Hatchback 3-doors,1156,Familia,113,Mazda
+48503,Hatchback 5-doors,1156,Familia,113,Mazda
+48504,Hatchback 3-doors,1156,Familia,113,Mazda
+48505,Presto Coupe 2-doors,1156,Familia,113,Mazda
+48506,Grand Coupe 2-doors,1156,Familia,113,Mazda
+48507,Grand Sedan 4-doors,1156,Familia,113,Mazda
+48508,Presto Sedan 4-doors,1156,Familia,113,Mazda
+48509,Grand Coupe 2-doors,1156,Familia,113,Mazda
+48510,Presto Coupe 2-doors,1156,Familia,113,Mazda
+48511,Presto Sedan 4-doors,1156,Familia,113,Mazda
+48512,Presto Rotary Coupe 2-doors,1156,Familia,113,Mazda
+48513,Coupe 2-doors,1156,Familia,113,Mazda
+48514,Rotary Sedan 4-doors,1156,Familia,113,Mazda
+48515,Presto Coupe 2-doors,1156,Familia,113,Mazda
+48516,Sedan 2-doors,1156,Familia,113,Mazda
+48517,Sedan 4-doors,1156,Familia,113,Mazda
+48518,Rotary Coupe 2-doors,1156,Familia,113,Mazda
+48519,Sedan,1156,Familia,113,Mazda
+48520,Sedan 2-doors,1156,Familia,113,Mazda
+48521,Pickup,1156,Familia,113,Mazda
+48522,Coupe,1156,Familia,113,Mazda
+48523,Sedan 4-doors,1156,Familia,113,Mazda
+48532,Coupe,1164,MX-6,113,Mazda
+1564,Marvie SUV,1169,Proceed,113,Mazda
+8804,Coupe 2-doors,1173,RX-7,113,Mazda
+8805,Coupe,1173,RX-7,113,Mazda
+48536,Cabriolet,1173,RX-7,113,Mazda
+48538,Coupe,1173,RX-7,113,Mazda
+67452,Field Break crossover 5-doors,1178,Tribute,113,Mazda
+48547,Hatchback,1232,3,119,MG
+6999,Hatchback 3-doors,1250,M.Go,120,Microcar
+1676,Hatchback 3-doors,1252,MC,120,Microcar
+48548,Cooper cabriolet,1255,Cabrio,122,Mini
+48549,Cooper cabriolet,1255,Cabrio,122,Mini
+7022,Hatchback,1271,Colt,123,Mitsubishi
+7023,Hatchback 3-doors,1271,Colt,123,Mitsubishi
+47314,Hatchback 5-doors,1271,Colt,123,Mitsubishi
+48564,Ralliart hatchback 3-doors,1271,Colt,123,Mitsubishi
+48565,Turbo hatchback 3-doors,1271,Colt,123,Mitsubishi
+48566,Hatchback 3-doors,1271,Colt,123,Mitsubishi
+53876,Minivan,1274,Delica,123,Mitsubishi
+48579,Sedan,1284,Galant,123,Mitsubishi
+48580,wagon,1284,Galant,123,Mitsubishi
+48581,Coupe,1284,Galant,123,Mitsubishi
+48582,JDM wagon 3-doors,1284,Galant,123,Mitsubishi
+48617,Rothmans Special SUV 3-doors,1301,Pajero,123,Mitsubishi
+15759,Nismo Coupe 2-doors,1352,350Z,127,Nissan
+48635,Hatchback 3-doors,1356,Almera,127,Nissan
+48636,Sedan,1356,Almera,127,Nissan
+48637,Hatchback 5-doors,1356,Almera,127,Nissan
+48647,ARX Hardtop,1364,Bluebird,127,Nissan
+48705,Hatchback,1367,Cherry,127,Nissan
+1845,Hatchback,1386,Leaf,127,Nissan
+48780,wagon,1391,Maxima,127,Nissan
+53786,Crossover,1395,Murano,127,Nissan
+45849,Sedan,1422,Admiral,130,Opel
+48806,Cabriolet 4-doors,1422,Admiral,130,Opel
+3882,Sedan 4-doors,1426,Ascona,130,Opel
+3884,Hatchback,1426,Ascona,130,Opel
+7276,Sedan 2-doors,1426,Ascona,130,Opel
+7277,Sedan 4-doors,1426,Ascona,130,Opel
+48808,Cabriolet,1426,Ascona,130,Opel
+48809,Hatchback,1426,Ascona,130,Opel
+48810,Sedan 2-doors,1426,Ascona,130,Opel
+48812,Sedan 4-doors,1426,Ascona,130,Opel
+48815,Sedan 4-doors,1426,Ascona,130,Opel
+48817,Sedan 4-doors,1426,Ascona,130,Opel
+53779,Cabriolet,1426,Ascona,130,Opel
+48823,OPC cabriolet 2-doors,1427,Astra,130,Opel
+7307,Sedan 2-doors,1432,Commodore,130,Opel
+48836,Pickup,1433,Corsa,130,Opel
+48838,Sedan,1433,Corsa,130,Opel
+48840,Sedan,1433,Corsa,130,Opel
+48841,Pickup,1433,Corsa,130,Opel
+48843,Hatchback 5-doors,1433,Corsa,130,Opel
+48844,Hatchback 3-doors,1433,Corsa,130,Opel
+48845,GSi hatchback 3-doors,1433,Corsa,130,Opel
+48847,Hatchback 3-doors,1433,Corsa,130,Opel
+48848,GSi hatchback 3-doors,1433,Corsa,130,Opel
+48849,Sedan 4-doors,1433,Corsa,130,Opel
+48850,Sedan 2-doors,1433,Corsa,130,Opel
+48851,GT hatchback 3-doors,1433,Corsa,130,Opel
+54084,Hatchback 5 doors,1433,Corsa,130,Opel
+1934,GSE Coupe 3-doors,1443,Monza,130,Opel
+48874,Coupe,1443,Monza,130,Opel
+48875,Coupe,1443,Monza,130,Opel
+3916,Sedan,1445,Rekord,130,Opel
+46798,wagon 5-doors,1445,Rekord,130,Opel
+46803,wagon,1445,Rekord,130,Opel
+48878,wagon,1445,Rekord,130,Opel
+48882,wagon,1445,Rekord,130,Opel
+48883,Coupe,1445,Rekord,130,Opel
+48884,wagon,1445,Rekord,130,Opel
+48885,Sedan 4-doors,1445,Rekord,130,Opel
+48886,Sedan,1445,Rekord,130,Opel
+48887,Sedan,1446,Senator,130,Opel
+48906,Van hatchback 3-doors,1474,206,135,Peugeot
+48912,Sedan,1482,307,135,Peugeot
+48914,SW wagon,1483,308,135,Peugeot
+8988,Coupe,1517,Firebird,138,Pontiac
+48939,Cabriolet,1517,Firebird,138,Pontiac
+48940,Trans Am T-Roof targa,1517,Firebird,138,Pontiac
+48941,Trans Am Coupe 2-doors,1517,Firebird,138,Pontiac
+47375,R Coupe 2-doors,1536,911,139,Porsche
+49027,Safari hatchback 5-doors,1582,4,147,Renault
+49028,Jogging hatchback 5-doors,1582,4,147,Renault
+49029,Hatchback,1582,4,147,Renault
+49030,Hatchback,1582,4,147,Renault
+49032,Plein Air cabriolet,1582,4,147,Renault
+49034,Hatchback,1582,4,147,Renault
+54119,Minivan,1590,Espace,147,Renault
+53949,Stepway,1603,Sandero,147,Renault
+49082,Conquest minivan 5-doors,1604,Scenic,147,Renault
+4095,Hatchback 5-doors,1624,200 Series,151,Rover
+4127,Hatchback 5-doors,1648,Astra,155,Saturn
+4131,Coupe,1655,SC,155,Saturn
+54092,Hatchback,1673,Ibiza,157,SEAT
+53414,Preliator Coupe 2-doors,1697,C8,163,Spyker
+67455,STi crossover 5-doors,1716,Forester,166,Subaru
+67456,XL-7 crossover 5-doors,1745,Grand Vitara,167,Suzuki
+7711,Roadster,1758,Swift,167,Suzuki
+9175,Hatchback 3-doors,1761,Wagon R,167,Suzuki
+49181,TAG Heuer Sport roadster 2-doors,1783,Roadster,172,Tesla
+49182,Sport roadster 2-doors,1783,Roadster,172,Tesla
+49183,Roadster,1783,Roadster,172,Tesla
+47428,SUV,1791,4Runner,176,Toyota
+49184,SUV 5-doors,1791,4Runner,176,Toyota
+49185,SUV 3-doors,1791,4Runner,176,Toyota
+49187,Pickup,1791,4Runner,176,Toyota
+62983,SUV,1791,4Runner,176,Toyota
+7783,wagon,1810,Camry,176,Toyota
+15350,CN-spec Sedan 4-doors,1810,Camry,176,Toyota
+49208,CN-spec Sedan 4-doors,1810,Camry,176,Toyota
+7795,II Sedan 4-doors,1812,Carina,176,Toyota
+7797,Sedan 2-doors,1812,Carina,176,Toyota
+7798,II liftback,1812,Carina,176,Toyota
+7801,Sedan 4-doors,1812,Carina,176,Toyota
+47431,Sedan 4-doors,1812,Carina,176,Toyota
+53394,E wagon,1812,Carina,176,Toyota
+49243,Hardtop,1818,Corolla,176,Toyota
+54097,Liftback,1818,Corolla,176,Toyota
+53881,Van wagon,1821,Corona,176,Toyota
+53884,Hardtop Coupe,1821,Corona,176,Toyota
+54032,Van wagon,1821,Corona,176,Toyota
+49252,Coupe,1823,Cressida,176,Toyota
+7866,JDM Hardtop 4-doors,1826,Crown,176,Toyota
+49267,JDM Hardtop,1826,Crown,176,Toyota
+49287,TRD Special Edition SUV 5-doors,1832,FJ Cruiser,176,Toyota
+49288,"""Trail Teams"" SUV 5-doors",1832,FJ Cruiser,176,Toyota
+49297,Combi minivan,1839,Hiace,176,Toyota
+49300,Minivan 4-doors,1839,Hiace,176,Toyota
+49302,Combi minivan,1839,Hiace,176,Toyota
+49303,Minivan 4-doors,1839,Hiace,176,Toyota
+49304,Combi minivan,1839,Hiace,176,Toyota
+54033,SUV,1840,Highlander,176,Toyota
+7911,HJ47 cabriolet 2-doors,1849,Land Cruiser,176,Toyota
+4290,Cabriolet,1852,P 601,177,Trabant
+49359,"""Weltmeister"" Sedan 2-doors",1900,Beetle,184,Volkswagen
+47448,Tramper minivan 5-doors,1902,Caddy,184,Volkswagen
+49371,Tramper Maxi minivan 5-doors,1902,Caddy,184,Volkswagen
+49385,Sedan 2-doors,1906,Fox,184,Volkswagen
+53969,Minivan,1915,Multivan,184,Volkswagen
+67457,Crossover 5-doors,1927,Tiguan,184,Volkswagen
+2678,Coupe,1972,GT MF5,189,Wiesmann
+4579,Cabriolet 4-doors,2034,69,216,GAZ
+9409,wagon 5-doors,2076,426,223,Moskvich
+49489,Sedan,2110,S30,52,DongFeng
+49492,Minivan,2117,Prairie,127,Nissan
+49509,Milano X1 hatchback 3-doors,2122,Pulsar,127,Nissan
+67453,Crossover 5-doors,2123,Qashqai,127,Nissan
+49497,SSS hatchback,2130,Sentra,127,Nissan
+9493,Sedan,2136,Stanza,127,Nissan
+9494,Hatchback,2136,Stanza,127,Nissan
+49555,Sedan,2136,Stanza,127,Nissan
+9527,wagon,2150,Mark II,176,Toyota
+49612,TRD hatchback 5-doors,2154,Matrix,176,Toyota
+62919,S\XRS hatchback 5-doors,2154,Matrix,176,Toyota
+49636,Coupe,2193,Sprinter,176,Toyota
+62920,Hatchback,2211,Voltz,176,Toyota
+49673,Minivan,2218,Yaris Verso,176,Toyota
+49678,SS Regular Cab pickup 2-doors,2220,Silverado,35,Chevrolet
+49753,Minivan,2235,Caravelle,184,Volkswagen
+49759,Minivan,2245,Urvan,127,Nissan
+54078,Sedan,2286,XE,88,Jaguar
+15557,Hatchback 5-doors,2328,Focus ST,63,Ford
+15558,wagon 5-doors,2328,Focus ST,63,Ford
+15563,Hatchback 3-doors,2328,Focus ST,63,Ford
+15520,Coupe,2332,XKR,88,Jaguar
+15521,Cabriolet,2332,XKR,88,Jaguar
+15461,Hatchback 5-doors,2337,3 MPS,113,Mazda
+15599,Hatchback 3-doors,2356,Corsa OPC,130,Opel
+15437,Minivan,2375,Corolla Spacio,176,Toyota
+2093,Roadster,2388,918 Spyder,139,Porsche
+45007,Sedan Long,18882,XJR,88,Jaguar
+67454,Crossover 5-doors,19208,Tivoli,165,SsangYong
+49775,SS Sport trim pickup 2-doors,19269,El Camino,35,Chevrolet
+53587,Hatchback,19280,S3,87,JAC
+50973,Fastback,19305,M-72,216,GAZ
+46446,Coupe,19517,Toronado,129,Oldsmobile
+46570,Hardtop,19570,Ascot Innova,76,Honda
+46687,Sedan,19617,Kapitan,130,Opel
+46815,Sedan,19617,Kapitan,130,Opel
+49796,Sedan,19617,Kapitan,130,Opel
+49877,Coupe,19770,Coupe S,10,Audi
+50008,Rampside pickup,19832,Corvair,35,Chevrolet
+50014,Crew Cab pickup 4-doors,19833,D20,35,Chevrolet
+50015,Pickup 2-doors,19833,D20,35,Chevrolet
+50020,SUV 5-doors,19838,Grand Vitara,35,Chevrolet
+50028,Sedan,19843,Lova,35,Chevrolet
+50083,Sedan,19852,Optra,35,Chevrolet
+50087,SUV,19854,Samurai,35,Chevrolet
+50088,Cabriolet,19854,Samurai,35,Chevrolet
+50091,Sedan,19860,Swift,35,Chevrolet
+50092,Hatchback,19860,Swift,35,Chevrolet
+50095,Pickup,19863,Tornado,35,Chevrolet
+50096,SUV 5-doors,19864,Trooper,35,Chevrolet
+50097,Cabriolet,19864,Trooper,35,Chevrolet
+50098,SUV 5-doors,19864,Trooper,35,Chevrolet
+50099,SUV 3-doors,19864,Trooper,35,Chevrolet
+50126,Limousine,19945,DH27,45,Daimler
+50133,Hatchback,20010,Xiali N7,59,FAW
+50151,F-150 Tremor pickup 2-doors,20065,F-1,63,Ford
+50161,F-150 SVT Lighting pickup 2-doors,20065,F-1,63,Ford
+50162,F-150 SuperCab pickup 4-doors,20065,F-1,63,Ford
+50163,F-150 RegularCab pickup 2-doors,20065,F-1,63,Ford
+50164,F-350 SuperCab pickup 4-doors,20065,F-1,63,Ford
+50165,F-150 SuperCab pickup 4-doors,20065,F-1,63,Ford
+50166,F-250 RegularCab pickup 2-doors,20065,F-1,63,Ford
+50167,F-150 RegularCab pickup 2-doors,20065,F-1,63,Ford
+50168,F-100 RegularCab pickup 2-doors,20065,F-1,63,Ford
+50169,F-150 RegularCab pickup 2-doors,20065,F-1,63,Ford
+50170,F-100 RegularCab pickup 2-doors,20065,F-1,63,Ford
+50171,F-100 SuperCab pickup 4-doors,20065,F-1,63,Ford
+50172,F-250 SuperCab pickup 4-doors,20065,F-1,63,Ford
+50173,F-100 RegularCab pickup 2-doors,20065,F-1,63,Ford
+50174,F-100 RegularCab pickup 2-doors,20065,F-1,63,Ford
+50175,F-100 pickup 2-doors,20065,F-1,63,Ford
+50176,F-100 pickup 2-doors,20065,F-1,63,Ford
+50177,Pickup,20065,F-1,63,Ford
+53702,Sedan,20099,GE,67,Geely
+50198,Sedan,20107,Voleex C50,71,Great Wall
+50215,Hatchback,20177,Avega,79,Hyundai
+50239,Sedan,20197,Langdong,79,Hyundai
+50257,Sedan,20208,Sonica,79,Hyundai
+50266,Minivan,20211,TQ,79,Hyundai
+53803,Pickup,20248,Gladiator,89,Jeep
+50350,Coupe,20309,Berlinetta,108,Marlin
+50351,Cabriolet,20310,RoadSter,108,Marlin
+50377,AMG hatchback 5-doors,20342,A-Class,116,Mercedes-Benz
+62911,AMG wagon 5-doors,20350,E-Class,116,Mercedes-Benz
+50540,Cabriolet,20355,G-Class,116,Mercedes-Benz
+50580,AMG roadster 2-doors,20362,SL-Class,116,Mercedes-Benz
+50629,Coupe,20364,S-Class,116,Mercedes-Benz
+50630,Sedan,20364,S-Class,116,Mercedes-Benz
+53805,Maybach cabriolet 2-doors,20364,S-Class,116,Mercedes-Benz
+50654,Minivan,20429,Altra,127,Nissan
+50656,Sedan,20433,Auster,127,Nissan
+50657,Hatchback,20433,Auster,127,Nissan
+50660,JX Sedan,20433,Auster,127,Nissan
+50661,JX hatchback,20433,Auster,127,Nissan
+50664,Liftback,20433,Auster,127,Nissan
+50665,Sedan,20433,Auster,127,Nissan
+50705,Hatchback,20451,Latio,127,Nissan
+50732,Liftback,20465,Violet,127,Nissan
+50733,Hatchback,20465,Violet,127,Nissan
+50734,wagon,20465,Violet,127,Nissan
+50736,Sedan,20465,Violet,127,Nissan
+50740,Hatchback,20466,Violet Liberta,127,Nissan
+50752,Sedan,20478,Super 6,130,Opel
+50768,GTA cabriolet 2-doors,20517,Alliance,147,Renault
+50769,Cabriolet,20517,Alliance,147,Renault
+50770,GTA Sedan 2-doors,20517,Alliance,147,Renault
+50771,Sedan 4-doors,20517,Alliance,147,Renault
+50772,Sedan,20518,Celtaquatre,147,Renault
+50773,Prairie wagon 5-doors,20519,Colorale,147,Renault
+50775,Sedan,20521,Juvaquatre,147,Renault
+50777,wagon,20521,Juvaquatre,147,Renault
+50778,Hatchback 5-doors,20522,Le Car,147,Renault
+50819,Sedan,20527,Monaquatre,147,Renault
+50820,Sedan,20528,Primaquatre,147,Renault
+50821,Sport Sedan 4-doors,20528,Primaquatre,147,Renault
+50822,Sedan,20528,Primaquatre,147,Renault
+50896,wagon,20683,Magotan,184,Volkswagen
+50910,Coupe,20686,Quantum,184,Volkswagen
+50927,Pickup,20689,Saveiro,184,Volkswagen
+50928,Pickup,20689,Saveiro,184,Volkswagen
+50929,Pickup,20689,Saveiro,184,Volkswagen
+50935,Limousine,20702,13 Chaika,216,GAZ
+50936,Cabriolet,20702,13 Chaika,216,GAZ
+50937,Cabriolet,20703,14 Chaika,216,GAZ
+50972,Sedan,20720,M-12 ZiM,216,GAZ
+50974,Fastback,20721,M-20 Pobeda,216,GAZ
+50977,Fastback,20721,M-20 Pobeda,216,GAZ
+51009,Roadster,20752,3000,3749,Austin Healey
+51016,Board,20760,V22,3754,DFSK
+51017,Van,20761,V25,3754,DFSK
+51019,Pickup,20771,Fox,3757,Groz
+51021,SUV,20773,Rocky,3757,Groz
+51022,SUV,20774,Shuttle,3757,Groz
+51023,Pickup,20775,Target,3757,Groz
+53705,Crossover,22512,SX11,67,Geely
+53713,Crossover,22515,X80,101,Lifan
+53731,Coupe,22544,2000 Pininfarina,4146,Abarth
+54049,Crossover,22604,FY11,67,Geely
+14597,Sedan,22971,Bonus 3 (E3/A19),34,Chery
+63668,Roadster TR4A,23165,TR4,179,Triumph
+71839,Pickup Double cabin,26675,F30,4948,Changan Kuayue (KYC)
diff --git a/inventory/car_hierarchy_analysis.ipynb b/inventory/car_hierarchy_analysis.ipynb
new file mode 100644
index 00000000..8c066b6f
--- /dev/null
+++ b/inventory/car_hierarchy_analysis.ipynb
@@ -0,0 +1,248 @@
+{
+ "cells": [
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "outputs": [],
+ "execution_count": null,
+ "source": [
+ "# Setup Django environment\n",
+ "import os\n",
+ "import sys\n",
+ "import django\n",
+ "\n",
+ "# Set up Django environment\n",
+ "os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'car_inventory.settings')\n",
+ "django.setup()\n",
+ "\n",
+ "# Import models\n",
+ "from inventory.models import CarMake, CarModel, CarSerie, CarTrim"
+ ],
+ "id": "64ce4f8ed9e90534"
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "outputs": [],
+ "execution_count": null,
+ "source": [
+ "# Get all car makes\n",
+ "all_makes = CarMake.objects.all()\n",
+ "total_makes = all_makes.count()\n",
+ "\n",
+ "# Find makes without models using annotations\n",
+ "from django.db.models import Count\n",
+ "makes_without_models = CarMake.objects.annotate(model_count=Count('carmodel')).filter(model_count=0)\n",
+ "makes_without_models_count = makes_without_models.count()\n",
+ "\n",
+ "print(f\"Total car makes: {total_makes}\")\n",
+ "print(f\"Car makes without models: {makes_without_models_count} ({makes_without_models_count/total_makes*100:.2f}%)\")\n",
+ "\n",
+ "# Display the first 10 makes without models\n",
+ "if makes_without_models:\n",
+ " print(\"\\nSample of car makes without models:\")\n",
+ " for make in makes_without_models[:10]:\n",
+ " print(f"
+ ],
+ "id": "7807a14272fbf44b"
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "outputs": [],
+ "execution_count": null,
+ "source": [
+ "# Get all car models\n",
+ "all_models = CarModel.objects.all()\n",
+ "total_models = all_models.count()\n",
+ "\n",
+ "# Find models without series using annotations\n",
+ "models_without_series = CarModel.objects.annotate(serie_count=Count('carserie')).filter(serie_count=0)\n",
+ "models_without_series_count = models_without_series.count()\n",
+ "\n",
+ "print(f\"\\nTotal car models: {total_models}\")\n",
+ "print(f\"Car models without series: {models_without_series_count} ({models_without_series_count/total_models*100:.2f}%)\")\n",
+ "\n",
+ "# Display the first 10 models without series\n",
+ "if models_without_series:\n",
+ " print(\"\\nSample of car models without series:\")\n",
+ " for model in models_without_series[:10]:\n",
+ " print(f\"- {model.name} (Make: {model.id_car_make."
+ ],
+ "id": "318b5426d54f0705"
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "outputs": [],
+ "execution_count": null,
+ "source": [
+ "# Get all car series\n",
+ "all_series = CarSerie.objects.all()\n",
+ "total_series = all_series.count()\n",
+ "\n",
+ "# Find series without trims using annotations\n",
+ "series_without_trims = CarSerie.objects.annotate(trim_count=Count('cartrim')).filter(trim_count=0)\n",
+ "series_without_trims_count = series_without_trims.count()\n",
+ "\n",
+ "print(f\"\\nTotal car series: {total_series}\")\n",
+ "print(f\"Car series without trims: {series_without_trims_count} ({series_without_trims_count/total_series*100:.2f}%)\")\n",
+ "\n",
+ "# Display the first 10 series without trims\n",
+ "if series_without_trims:\n",
+ " print(\"\\nSample of car series without trims:\")\n",
+ " for serie in series_without_trims[:10]:\n",
+ " print(f\"- {serie.name} (Model: {serie.id_car_model.name}, Make: {serie.id_car_model.id_car_make."
+ ],
+ "id": "30eaf3383d2b34e1"
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "outputs": [],
+ "execution_count": null,
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "\n",
+ "# Data for the chart\n",
+ "categories = ['Makes', 'Models', 'Series']\n",
+ "total_counts = [total_makes, total_models, total_series]\n",
+ "empty_counts = [makes_without_models_count, models_without_series_count, series_without_trims_count]\n",
+ "with_children_counts = [total_makes - makes_without_models_count,\n",
+ " total_models - models_without_series_count,\n",
+ " total_series - series_without_trims_count]\n",
+ "\n",
+ "# Create a figure with two subplots\n",
+ "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))\n",
+ "\n",
+ "# Bar chart showing total vs. without children\n",
+ "x = np.arange(len(categories))\n",
+ "width = 0.35\n",
+ "\n",
+ "ax1.bar(x - width/2, total_counts, width, label='Total')\n",
+ "ax1.bar(x + width/2, empty_counts, width, label='Without children')\n",
+ "ax1.set_xticks(x)\n",
+ "ax1.set_xticklabels(categories)\n",
+ "ax1.set_ylabel('Count')\n",
+ "ax1.set_title('Car Hierarchy Analysis')\n",
+ "ax1.legend()\n",
+ "\n",
+ "# Pie charts showing percentage with/without children\n",
+ "labels = ['With children', 'Without children']\n",
+ "sizes = [[with_children_counts[i], empty_counts[i]] for i in range(3)]\n",
+ "colors = [['#66b3ff', '#ff9999'], ['#99ff99', '#ffcc99'], ['#c2c2f0', '#ffb3e6']]\n",
+ "\n",
+ "for i, category in enumerate(categories):\n",
+ " if i == 0:\n",
+ " ax2.pie(sizes[i], labels=labels, colors=colors[i], autopct='%1.1f%%',\n",
+ " startangle=90, wedgeprops={'alpha':0.7})\n",
+ " centre_circle = plt.Circle((0,0),0.70,fc='white')\n",
+ " ax2.add_patch(centre_circle)\n",
+ " ax2.text(0, 0, category, horizontalalignment='center', verticalalignment='center')\n",
+ " else:\n",
+ " # Calculate position for smaller pie charts\n",
+ " x_offset = 1.2 * (i-1)\n",
+ " ax2.pie(sizes[i], colors=colors[i], autopct='%1.1f%%',\n",
+ " startangle=90, wedgeprops={'alpha':0.7},\n",
+ " center=(x_offset, 0), radius=0.5)\n",
+ " centre_circle = plt.Circle((x_offset,0),0.35,fc='white')\n",
+ " ax2.add_patch(centre_circle)\n",
+ " ax2.text(x_offset, 0, category, horizontalalignment='center', verticalalignment='center')\n",
+ "\n",
+ "ax2.axis('equal')\n",
+ "ax2.set_title('Percentage Distribution')\n",
+ "\n",
+ "plt.tight_layout()\n",
+ "plt.show()"
+ ],
+ "id": "d23f0edf1ff334f7"
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "outputs": [],
+ "execution_count": null,
+ "source": [
+ "# Find all trims and go up the hierarchy to find complete chains\n",
+ "complete_hierarchies = []\n",
+ "\n",
+ "for trim in CarTrim.objects.select_related('id_car_serie__id_car_model__id_car_make')[:20]:\n",
+ " serie = trim.id_car_serie\n",
+ " model = serie.id_car_model\n",
+ " make = model.id_car_make\n",
+ "\n",
+ " complete_hierarchies.append({\n",
+ " 'make': make.name,\n",
+ " 'model': model.name,\n",
+ " 'serie': serie.name,\n",
+ " 'trim': trim.name\n",
+ " })\n",
+ "\n",
+ "# Display as a formatted table\n",
+ "from IPython.display import display, HTML\n",
+ "import pandas as pd\n",
+ "\n",
+ "if complete_hierarchies:\n",
+ " print(\"\\nSample of complete car hierarchies:\")\n",
+ " df = pd.DataFrame(complete_hierarchies)\n",
+ " display(HTML(df.to_html(index=False"
+ ],
+ "id": "3cd9822a8ac1a880"
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "outputs": [],
+ "execution_count": null,
+ "source": [
+ "# Create DataFrames for export\n",
+ "import pandas as pd\n",
+ "\n",
+ "# Makes without models\n",
+ "makes_without_models_df = pd.DataFrame({\n",
+ " 'make_id': [make.id_car_make for make in makes_without_models],\n",
+ " 'make_name': [make.name for make in makes_without_models],\n",
+ " 'is_sa_import': [make.is_sa_import for make in makes_without_models]\n",
+ "})\n",
+ "\n",
+ "# Models without series\n",
+ "models_without_series_df = pd.DataFrame({\n",
+ " 'model_id': [model.id_car_model for model in models_without_series],\n",
+ " 'model_name': [model.name for model in models_without_series],\n",
+ " 'make_id': [model.id_car_make.id_car_make for model in models_without_series],\n",
+ " 'make_name': [model.id_car_make.name for model in models_without_series]\n",
+ "})\n",
+ "\n",
+ "# Series without trims\n",
+ "series_without_trims_df = pd.DataFrame({\n",
+ " 'serie_id': [serie.id_car_serie for serie in series_without_trims],\n",
+ " 'serie_name': [serie.name for serie in series_without_trims],\n",
+ " 'model_id': [serie.id_car_model.id_car_model for serie in series_without_trims],\n",
+ " 'model_name': [serie.id_car_model.name for serie in series_without_trims],\n",
+ " 'make_id': [serie.id_car_model.id_car_make.id_car_make for serie in series_without_trims],\n",
+ " 'make_name': [serie.id_car_model.id_car_make.name for serie in series_without_trims]\n",
+ "})\n",
+ "\n",
+ "# Save to CSV files (uncomment to use)\n",
+ "# makes_without_models_df.to_csv('makes_without_models.csv', index=False)\n",
+ "# models_without_series_df.to_csv('models_without_series.csv', index=False)\n",
+ "# series_without_trims_df.to_csv('series_without_trims.csv', index=False)\n",
+ "\n",
+ "# Display the first few rows of each DataFrame\n",
+ "print(\"\\nMakes without models (first 5):\")\n",
+ "display(makes_without_models_df.head())\n",
+ "\n",
+ "print(\"\\nModels without series (first 5):\")\n",
+ "display(models_without_series_df.head())\n",
+ "\n",
+ "print(\"\\nSeries without trims (first 5):\")\n",
+ "display(series_without_trims_df.head())"
+ ],
+ "id": "6edeb052b327a48c"
+ }
+ ],
+ "metadata": {},
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/inventory/management/commands/analyze_car_hierarchy.py b/inventory/management/commands/analyze_car_hierarchy.py
new file mode 100644
index 00000000..bb7a35b0
--- /dev/null
+++ b/inventory/management/commands/analyze_car_hierarchy.py
@@ -0,0 +1,139 @@
+from django.core.management.base import BaseCommand
+from django.db.models import Count
+from inventory.models import CarMake, CarModel, CarSerie, CarTrim
+import csv
+import os
+from django.conf import settings
+
+
+class Command(BaseCommand):
+ help = 'Analyzes the car hierarchy to identify makes without models, models without series, and series without trims'
+
+ def add_arguments(self, parser):
+ parser.add_argument(
+ '--export',
+ action='store_true',
+ help='Export results to CSV files',
+ )
+ parser.add_argument(
+ '--export-path',
+ type=str,
+ default='exports',
+ help='Directory to export CSV files (default: "exports")',
+ )
+
+ def handle(self, *args, **options):
+ export = options['export']
+ export_path = options['export_path']
+
+ # Create export directory if needed
+ if export:
+ export_dir = os.path.join(settings.BASE_DIR, export_path)
+ if not os.path.exists(export_dir):
+ os.makedirs(export_dir)
+
+ # Analyze makes without models
+ all_makes = CarMake.objects.all()
+ total_makes = all_makes.count()
+ makes_without_models = CarMake.objects.annotate(model_count=Count('carmodel')).filter(model_count=0)
+ makes_without_models_count = makes_without_models.count()
+
+ self.stdout.write(self.style.SUCCESS(f"Total car makes: {total_makes}"))
+ self.stdout.write(self.style.SUCCESS(
+ f"Car makes without models: {makes_without_models_count} "
+ f"({makes_without_models_count/total_makes*100:.2f}% of all makes)"
+ ))
+
+ if makes_without_models_count > 0:
+ self.stdout.write("\nSample of car makes without models:")
+ for make in makes_without_models[:5]:
+ self.stdout.write(f"- {make.name}")
+
+ # Analyze models without series
+ all_models = CarModel.objects.all()
+ total_models = all_models.count()
+ models_without_series = CarModel.objects.annotate(serie_count=Count('carserie')).filter(serie_count=0)
+ models_without_series_count = models_without_series.count()
+
+ self.stdout.write(self.style.SUCCESS(f"\nTotal car models: {total_models}"))
+ self.stdout.write(self.style.SUCCESS(
+ f"Car models without series: {models_without_series_count} "
+ f"({models_without_series_count/total_models*100:.2f}% of all models)"
+ ))
+
+ if models_without_series_count > 0:
+ self.stdout.write("\nSample of car models without series:")
+ for model in models_without_series[:5]:
+ self.stdout.write(f"- {model.name} (Make: {model.id_car_make.name})")
+
+ # Analyze series without trims
+ all_series = CarSerie.objects.all()
+ total_series = all_series.count()
+ series_without_trims = CarSerie.objects.annotate(trim_count=Count('cartrim')).filter(trim_count=0)
+ series_without_trims_count = series_without_trims.count()
+
+ self.stdout.write(self.style.SUCCESS(f"\nTotal car series: {total_series}"))
+ self.stdout.write(self.style.SUCCESS(
+ f"Car series without trims: {series_without_trims_count} "
+ f"({series_without_trims_count/total_series*100:.2f}% of all series)"
+ ))
+
+ if series_without_trims_count > 0:
+ self.stdout.write("\nSample of car series without trims:")
+ for serie in series_without_trims[:5]:
+ self.stdout.write(
+ f"- {serie.name} (Model: {serie.id_car_model.name}, "
+ f"Make: {serie.id_car_model.id_car_make.name})"
+ )
+
+ # Export data if requested
+ if export:
+ # Export makes without models
+ if makes_without_models_count > 0:
+ filepath = os.path.join(export_dir, 'makes_without_models.csv')
+ with open(filepath, 'w', newline='') as csvfile:
+ writer = csv.writer(csvfile)
+ writer.writerow(['make_id', 'make_name', 'is_sa_import'])
+ for make in makes_without_models:
+ writer.writerow([make.id_car_make, make.name, make.is_sa_import])
+ self.stdout.write(self.style.SUCCESS(f"Exported makes without models to {filepath}"))
+
+ # Export models without series
+ if models_without_series_count > 0:
+ filepath = os.path.join(export_dir, 'models_without_series.csv')
+ with open(filepath, 'w', newline='') as csvfile:
+ writer = csv.writer(csvfile)
+ writer.writerow(['model_id', 'model_name', 'make_id', 'make_name'])
+ for model in models_without_series:
+ writer.writerow([
+ model.id_car_model,
+ model.name,
+ model.id_car_make.id_car_make,
+ model.id_car_make.name
+ ])
+ self.stdout.write(self.style.SUCCESS(f"Exported models without series to {filepath}"))
+
+ # Export series without trims
+ if series_without_trims_count > 0:
+ filepath = os.path.join(export_dir, 'series_without_trims.csv')
+ with open(filepath, 'w', newline='') as csvfile:
+ writer = csv.writer(csvfile)
+ writer.writerow(['serie_id', 'serie_name', 'model_id', 'model_name', 'make_id', 'make_name'])
+ for serie in series_without_trims:
+ writer.writerow([
+ serie.id_car_serie,
+ serie.name,
+ serie.id_car_model.id_car_model,
+ serie.id_car_model.name,
+ serie.id_car_model.id_car_make.id_car_make,
+ serie.id_car_model.id_car_make.name
+ ])
+ self.stdout.write(self.style.SUCCESS(f"Exported series without trims to {filepath}"))
+
+ # Summary
+ self.stdout.write("\n" + "="*50)
+ self.stdout.write(self.style.SUCCESS("SUMMARY"))
+ self.stdout.write("="*50)
+ self.stdout.write(f"Total makes: {total_makes} | Without models: {makes_without_models_count} ({makes_without_models_count/total_makes*100:.2f}%)")
+ self.stdout.write(f"Total models: {total_models} | Without series: {models_without_series_count} ({models_without_series_count/total_models*100:.2f}%)")
+ self.stdout.write(f"Total series: {total_series} | Without trims: {series_without_trims_count} ({series_without_trims_count/total_series*100:.2f}%)")
diff --git a/inventory/templatetags/custom_filters.py b/inventory/templatetags/custom_filters.py
index 6813139f..72fb9be5 100644
--- a/inventory/templatetags/custom_filters.py
+++ b/inventory/templatetags/custom_filters.py
@@ -1,10 +1,13 @@
+from typing import Union
from random import randint
from django import template
-from calendar import month_abbr
from django.urls import reverse
+from calendar import month_abbr
+from django.conf import settings
+from django.forms import ValidationError
from django.utils.formats import number_format
from django_ledger.io.io_core import get_localdate,validate_activity
-from django.conf import settings
+from django_ledger.models import InvoiceModel, JournalEntryModel, BillModel
register = template.Library()
@@ -390,3 +393,28 @@ def bill_item_formset_table(context, item_formset):
'total_amount__sum': context['total_amount__sum'],
'item_formset': item_formset,
}
+
+@register.inclusion_tag('bill/transactions/tags/txs_table.html')
+def transactions_table(object_type: Union[JournalEntryModel, BillModel, InvoiceModel], style='detail'):
+ if isinstance(object_type, JournalEntryModel):
+ transaction_model_qs = object_type.transactionmodel_set.all().with_annotated_details().order_by(
+ '-timestamp')
+ elif isinstance(object_type, BillModel):
+ transaction_model_qs = object_type.get_transaction_queryset(annotated=True).order_by('-timestamp')
+ elif isinstance(object_type, InvoiceModel):
+ transaction_model_qs = object_type.get_transaction_queryset(annotated=True).order_by('-timestamp')
+ else:
+ raise ValidationError(
+ 'Cannot handle object of type {} to get transaction model queryset'.format(type(object_type))
+ )
+
+ total_credits = sum(tx.amount for tx in transaction_model_qs if tx.is_credit())
+ total_debits = sum(tx.amount for tx in transaction_model_qs if tx.is_debit())
+
+ return {
+ 'style': style,
+ 'transaction_model_qs': transaction_model_qs,
+ 'total_debits': total_debits,
+ 'total_credits': total_credits,
+ 'object': object_type
+ }
diff --git a/static/.DS_Store b/static/.DS_Store
index fa3d2357..d14b0976 100644
Binary files a/static/.DS_Store and b/static/.DS_Store differ
diff --git a/static/images/.DS_Store b/static/images/.DS_Store
index 3d7a2676..84f8b6ec 100644
Binary files a/static/images/.DS_Store and b/static/images/.DS_Store differ
diff --git a/static/images/cars/.DS_Store b/static/images/cars/.DS_Store
new file mode 100644
index 00000000..407618a1
Binary files /dev/null and b/static/images/cars/.DS_Store differ
diff --git a/static/images/cars/bus.png b/static/images/cars/bus.png
new file mode 100644
index 00000000..dc963fda
Binary files /dev/null and b/static/images/cars/bus.png differ
diff --git a/static/images/cars/cabriolet.png b/static/images/cars/cabriolet.png
new file mode 100644
index 00000000..37a8374e
Binary files /dev/null and b/static/images/cars/cabriolet.png differ
diff --git a/static/images/cars/commercial.png b/static/images/cars/commercial.png
new file mode 100644
index 00000000..1d1a0c48
Binary files /dev/null and b/static/images/cars/commercial.png differ
diff --git a/static/images/cars/coupe.png b/static/images/cars/coupe.png
new file mode 100644
index 00000000..cf2d44d1
Binary files /dev/null and b/static/images/cars/coupe.png differ
diff --git a/static/images/cars/crossover.png b/static/images/cars/crossover.png
new file mode 100644
index 00000000..4596c87d
Binary files /dev/null and b/static/images/cars/crossover.png differ
diff --git a/static/images/cars/double_pickup.png b/static/images/cars/double_pickup.png
new file mode 100644
index 00000000..32ef5af4
Binary files /dev/null and b/static/images/cars/double_pickup.png differ
diff --git a/static/images/cars/hatchback.png b/static/images/cars/hatchback.png
new file mode 100644
index 00000000..1fb33a5c
Binary files /dev/null and b/static/images/cars/hatchback.png differ
diff --git a/static/images/cars/minivan.png b/static/images/cars/minivan.png
new file mode 100644
index 00000000..b48a9c44
Binary files /dev/null and b/static/images/cars/minivan.png differ
diff --git a/static/images/cars/sedan.png b/static/images/cars/sedan.png
new file mode 100644
index 00000000..22242c4f
Binary files /dev/null and b/static/images/cars/sedan.png differ
diff --git a/static/images/cars/single_pickup.png b/static/images/cars/single_pickup.png
new file mode 100644
index 00000000..c30fc028
Binary files /dev/null and b/static/images/cars/single_pickup.png differ
diff --git a/static/images/cars/sport_car.png b/static/images/cars/sport_car.png
new file mode 100644
index 00000000..588cb34c
Binary files /dev/null and b/static/images/cars/sport_car.png differ
diff --git a/static/images/cars/suv.png b/static/images/cars/suv.png
new file mode 100644
index 00000000..d42e6d94
Binary files /dev/null and b/static/images/cars/suv.png differ
diff --git a/static/images/cars/van.png b/static/images/cars/van.png
new file mode 100644
index 00000000..aee53afe
Binary files /dev/null and b/static/images/cars/van.png differ
diff --git a/static/images/cars/van_cargo.png b/static/images/cars/van_cargo.png
new file mode 100644
index 00000000..6a9d2749
Binary files /dev/null and b/static/images/cars/van_cargo.png differ
diff --git a/static/images/convertible.svg b/static/images/convertible.svg
new file mode 100644
index 00000000..277ed941
--- /dev/null
+++ b/static/images/convertible.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/images/coupe.svg b/static/images/coupe.svg
new file mode 100644
index 00000000..8097cff5
--- /dev/null
+++ b/static/images/coupe.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/images/sedan.svg b/static/images/sedan.svg
new file mode 100644
index 00000000..b560e504
--- /dev/null
+++ b/static/images/sedan.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/images/suv.svg b/static/images/suv.svg
new file mode 100644
index 00000000..cd8f1e9e
--- /dev/null
+++ b/static/images/suv.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/templates/bill/bill_detail.html b/templates/bill/bill_detail.html
index f85f30aa..568ddc95 100644
--- a/templates/bill/bill_detail.html
+++ b/templates/bill/bill_detail.html
@@ -2,6 +2,7 @@
{% load i18n %}
{% load static %}
{% load django_ledger %}
+{% load custom_filters %}
{% block title %}Bill Details - {{ block.super }}{% endblock %}
@@ -64,7 +65,7 @@
{% trans 'Cash Account' %}:
-
{{ bill.cash_account.code }}
@@ -79,7 +80,7 @@
{% trans 'Prepaid Account' %}:
-
{{ bill.prepaid_account.code }}
@@ -93,7 +94,7 @@
{% trans 'Accounts Payable' %}:
-
{{ bill.unearned_account.code }}
diff --git a/templates/bill/transactions/tags/txs_table.html b/templates/bill/transactions/tags/txs_table.html
new file mode 100644
index 00000000..0e801373
--- /dev/null
+++ b/templates/bill/transactions/tags/txs_table.html
@@ -0,0 +1,73 @@
+{% load i18n %}
+{% load django_ledger %}
+
+{% if style == 'detail' %}
+
+
+
+
+ | {% trans 'Timestamp' %} |
+ {% trans 'Account' %} |
+ {% trans 'Account Name' %} |
+ {% trans 'Unit' %} |
+ {% trans 'Credit' %} |
+ {% trans 'Debit' %} |
+ {% trans 'Description' %} |
+
+
+
+ {% for transaction_model in transaction_model_qs %}
+
+ | {{ transaction_model.timestamp }} |
+ {{ transaction_model.account_code }} |
+ {{ transaction_model.account_name }} |
+ {% if transaction_model.entity_unit_name %}{{ transaction_model.entity_unit_name }}{% endif %} |
+ {% if transaction_model.is_credit %}${{ transaction_model.amount | currency_format }}{% endif %} |
+ {% if transaction_model.is_debit %}${{ transaction_model.amount | currency_format }}{% endif %} |
+ {% if transaction_model.description %}{{ transaction_model.description }}{% endif %} |
+
+ {% endfor %}
+
+ |
+ {% trans 'Total' %} |
+ {% currency_symbol %}{{ total_credits | currency_format }} |
+ {% currency_symbol %}{{ total_debits | currency_format }} |
+ |
+
+
+
+
+{% elif style == 'compact' %}
+
+
+
+
+ | {% trans 'Account' %} |
+ {% trans 'Account Name' %} |
+ {% trans 'Credit' %} |
+ {% trans 'Debit' %} |
+ {% trans 'Description' %} |
+
+
+
+ {% for transaction_model in transaction_model_qs %}
+
+ | {{ transaction_model.account_code }} |
+ {{ transaction_model.account_name }} |
+ {% if transaction_model.is_credit %}${{ transaction_model.amount | currency_format }}{% endif %} |
+ {% if transaction_model.is_debit %}${{ transaction_model.amount | currency_format }}{% endif %} |
+ {% if transaction_model.description %}{{ transaction_model.description }}{% endif %} |
+
+ {% endfor %}
+
+ |
+ {% trans 'Total' %} |
+ {% currency_symbol %}{{ total_credits | currency_format }} |
+ {% currency_symbol %}{{ total_debits | currency_format }} |
+ |
+
+
+
+
+{% endif %}
+
diff --git a/templates/header.html b/templates/header.html
index c66156b1..386f4a00 100644
--- a/templates/header.html
+++ b/templates/header.html
@@ -38,7 +38,14 @@
- {% trans "purchase Orders"|capfirst %}
+ {% trans "purchase Orders"|capfirst %}
+
+
+
+
+
+
+ {% trans "Upload Cars"|capfirst %}
diff --git a/templates/inventory/car_list_view.html b/templates/inventory/car_list_view.html
index 0a71c589..7716231d 100644
--- a/templates/inventory/car_list_view.html
+++ b/templates/inventory/car_list_view.html
@@ -145,6 +145,10 @@
hx-on::after-request="filter_after_request()">{{ _("Search") }}