@bytebrand/export-cars 1.1.1 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/kleinanzeigeFocus.config.d.ts +5 -0
- package/dist/config/kleinanzeigeFocus.config.js +15 -0
- package/dist/config/kleinanzeigeFocus.config.js.map +1 -0
- package/dist/enums/export-type.enum.d.ts +2 -1
- package/dist/enums/export-type.enum.js +1 -0
- package/dist/enums/export-type.enum.js.map +1 -1
- package/dist/export.schema.d.ts +6 -0
- package/dist/export.schema.js +6 -0
- package/dist/export.schema.js.map +1 -1
- package/dist/exporters/index.d.ts +1 -0
- package/dist/exporters/index.js +18 -0
- package/dist/exporters/index.js.map +1 -0
- package/dist/exporters/rubrikk.exporter.d.ts +13 -0
- package/dist/exporters/rubrikk.exporter.js +68 -0
- package/dist/exporters/rubrikk.exporter.js.map +1 -0
- package/dist/formats/index.d.ts +1 -0
- package/dist/formats/index.js +18 -0
- package/dist/formats/index.js.map +1 -0
- package/dist/formats/rubrikk-xml.builder.d.ts +7 -0
- package/dist/formats/rubrikk-xml.builder.js +25 -0
- package/dist/formats/rubrikk-xml.builder.js.map +1 -0
- package/dist/interfaces/export-item.interface.d.ts +47 -0
- package/dist/transformers/index.d.ts +1 -0
- package/dist/transformers/index.js +18 -0
- package/dist/transformers/index.js.map +1 -0
- package/dist/transformers/rubrikk.transformer.d.ts +26 -0
- package/dist/transformers/rubrikk.transformer.js +180 -0
- package/dist/transformers/rubrikk.transformer.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/config/kleinanzeigeFocus.config.ts +12 -0
- package/src/enums/export-type.enum.ts +1 -0
- package/src/export.schema.ts +6 -0
- package/src/exporters/index.ts +1 -0
- package/src/exporters/rubrikk.exporter.ts +53 -0
- package/src/formats/index.ts +1 -0
- package/src/formats/rubrikk-xml.builder.ts +27 -0
- package/src/interfaces/export-item.interface.ts +48 -0
- package/src/transformers/index.ts +1 -0
- package/src/transformers/rubrikk.transformer.ts +199 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bytebrand/export-cars",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"author": "bytebrand",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -65,5 +65,5 @@
|
|
|
65
65
|
"engines": {
|
|
66
66
|
"node": ">=14.0.0"
|
|
67
67
|
},
|
|
68
|
-
"gitHead": "
|
|
68
|
+
"gitHead": "13a4edb8d673e76002d9f6232d409a704e366607"
|
|
69
69
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Params } from '../interfaces/params.interface';
|
|
2
|
+
import { Config } from './config';
|
|
3
|
+
|
|
4
|
+
export class KleinanzeigeFocusConfig extends Config {
|
|
5
|
+
constructor(params: Params) {
|
|
6
|
+
super(params);
|
|
7
|
+
this.pathesConfig.localConvertedDirectory = this.environmentConfig[params.environment].localConvertedDirectory;
|
|
8
|
+
this.pathesConfig.remoteDirectory = this.environmentConfig[params.environment].remoteDirectory;
|
|
9
|
+
this.imageUrl = this.environmentConfig[params.environment].imageUrl;
|
|
10
|
+
this.outputFiles = ['api_export_cars_focus.xml'];
|
|
11
|
+
}
|
|
12
|
+
}
|
package/src/export.schema.ts
CHANGED
|
@@ -12,6 +12,7 @@ import { MarktdeConfig } from './config/marktde.config';
|
|
|
12
12
|
import { MeinstadtConfig } from './config/meinstadt.config';
|
|
13
13
|
import { OoyyoConfig } from './config/ooyyo.config';
|
|
14
14
|
import { YescarConfig } from './config/yescar.config';
|
|
15
|
+
import { KleinanzeigeFocusConfig } from './config/kleinanzeigeFocus.config';
|
|
15
16
|
import { ExportType } from './enums/export-type.enum';
|
|
16
17
|
import { As24Exporter } from './exporters/as24.exporter';
|
|
17
18
|
import { Auto24Exporter } from './exporters/auto24.exporter';
|
|
@@ -22,6 +23,7 @@ import { GoogleExporter } from './exporters/google.exporter';
|
|
|
22
23
|
import { MeinstadtExporter } from './exporters/meinstadt.exporter';
|
|
23
24
|
import { MobileExporter } from './exporters/mobile.exporter';
|
|
24
25
|
import { OoyyoExporter } from './exporters/ooyyo.exporter';
|
|
26
|
+
import { RubrikkExporter } from './exporters';
|
|
25
27
|
|
|
26
28
|
export const exportSchema = {
|
|
27
29
|
[ExportType.EAUTO]: {
|
|
@@ -80,4 +82,8 @@ export const exportSchema = {
|
|
|
80
82
|
config: DasparkingConfig,
|
|
81
83
|
exporter: Auto24Exporter,
|
|
82
84
|
},
|
|
85
|
+
[ExportType.KLEINANZEIGE_FOCUS]: {
|
|
86
|
+
config: KleinanzeigeFocusConfig,
|
|
87
|
+
exporter: RubrikkExporter,
|
|
88
|
+
},
|
|
83
89
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './rubrikk.exporter';
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Injectable } from '@nestjs/common';
|
|
2
|
+
import { Exporter } from '../interfaces/exporter.interface';
|
|
3
|
+
import { CarService } from '../services/car.service';
|
|
4
|
+
import { ConfigService } from '../services/config.service';
|
|
5
|
+
import { LoaderService } from '../services/loader.service';
|
|
6
|
+
import { ModuleRef } from '@nestjs/core';
|
|
7
|
+
import { CronicleUtils } from '@bytebrand/cronicle-helper';
|
|
8
|
+
import { Zipper } from '@bytebrand/zipper';
|
|
9
|
+
import { RubrikkXmlBuilder } from '../formats';
|
|
10
|
+
import { RubrikkTransformer } from '../transformers';
|
|
11
|
+
import { FsChunkInterface } from '@bytebrand/chunkable';
|
|
12
|
+
|
|
13
|
+
@Injectable()
|
|
14
|
+
export class RubrikkExporter implements Exporter {
|
|
15
|
+
constructor(
|
|
16
|
+
private carService: CarService,
|
|
17
|
+
private configService: ConfigService,
|
|
18
|
+
private loaderService: LoaderService,
|
|
19
|
+
private moduleRef: ModuleRef,
|
|
20
|
+
) {}
|
|
21
|
+
async export(): Promise<void> {
|
|
22
|
+
for (const file of this.configService.config.outputFiles) {
|
|
23
|
+
const exists = await CronicleUtils.exists(file);
|
|
24
|
+
exists && (await CronicleUtils.unlink(file));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const [fileXml, fileGZ] = this.configService.config.outputFiles;
|
|
28
|
+
|
|
29
|
+
const rubrikkXmlBuilder = new RubrikkXmlBuilder(fileXml);
|
|
30
|
+
const rubrikkTransformer = await this.moduleRef.create(RubrikkTransformer);
|
|
31
|
+
|
|
32
|
+
await rubrikkXmlBuilder.buildStart();
|
|
33
|
+
await this.loaderService.process(async (chunk: FsChunkInterface) => {
|
|
34
|
+
if (chunk && chunk.data) {
|
|
35
|
+
for (let i = 0; i < chunk.data.length; i += 1) {
|
|
36
|
+
const data = chunk.data[i];
|
|
37
|
+
const { car, images } = data;
|
|
38
|
+
|
|
39
|
+
const transformed_car = await rubrikkTransformer.transform({ car, images });
|
|
40
|
+
|
|
41
|
+
await rubrikkXmlBuilder.addItem(transformed_car);
|
|
42
|
+
this.carService.counter.countCar(images);
|
|
43
|
+
}
|
|
44
|
+
chunk.data = null;
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
await rubrikkXmlBuilder.buildEnd();
|
|
48
|
+
|
|
49
|
+
if (fileGZ) {
|
|
50
|
+
await Zipper.tar({ dest: fileGZ, fileList: [fileXml] });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './rubrikk-xml.builder';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { XMLBuilderBase } from '@bytebrand/cronicle-helper';
|
|
2
|
+
import { RubrikkXmlItem } from '../interfaces/export-item.interface';
|
|
3
|
+
|
|
4
|
+
export class RubrikkXmlBuilder extends XMLBuilderBase {
|
|
5
|
+
async buildStart(): Promise<void> {
|
|
6
|
+
await this.write('<?xml version="1.0" encoding="UTF-8"?><rubrikk>');
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
async addItem(car: RubrikkXmlItem): Promise<void> {
|
|
10
|
+
let item = '\n<ad>\n';
|
|
11
|
+
|
|
12
|
+
const tags = Object.keys(car);
|
|
13
|
+
|
|
14
|
+
for (const tag of tags) {
|
|
15
|
+
const value = car[tag];
|
|
16
|
+
item += this.getElement(tag, value, true);
|
|
17
|
+
}
|
|
18
|
+
item += '</ad>';
|
|
19
|
+
|
|
20
|
+
await this.write(item);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async buildEnd(): Promise<void> {
|
|
24
|
+
await this.write('</rubrikk>');
|
|
25
|
+
await this.end();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -144,3 +144,51 @@ export interface GoogleXmlItem {
|
|
|
144
144
|
color: string;
|
|
145
145
|
installment: { paybackPeriod: any; monthlyInstallment: any };
|
|
146
146
|
}
|
|
147
|
+
|
|
148
|
+
export interface RubrikkXmlItem {
|
|
149
|
+
ad__all_imageurls: string[];
|
|
150
|
+
ad__condition_new_used_etc: string;
|
|
151
|
+
ad__description: string;
|
|
152
|
+
ad__headline: string;
|
|
153
|
+
ad__imageurl: string;
|
|
154
|
+
ad__price: number;
|
|
155
|
+
ad__price_currency: string;
|
|
156
|
+
product__type: string;
|
|
157
|
+
ad__url: string;
|
|
158
|
+
efficiency_class: string;
|
|
159
|
+
ad__number_ad__number_reference_id: string;
|
|
160
|
+
category_original: string;
|
|
161
|
+
maincategory_original: string;
|
|
162
|
+
advertiser__company_homepage_url: string;
|
|
163
|
+
advertiser__company_logo_url: string;
|
|
164
|
+
advertiser__email: string;
|
|
165
|
+
advertiser__name_company_name: string;
|
|
166
|
+
advertiser__phone: string;
|
|
167
|
+
location__country: string;
|
|
168
|
+
location__municipality_city: string;
|
|
169
|
+
location__zip_postal_code: string;
|
|
170
|
+
motoring__body_type: string;
|
|
171
|
+
motoring__color: string;
|
|
172
|
+
motoring__drivetrain: string;
|
|
173
|
+
motoring__emission_class: string;
|
|
174
|
+
motoring__emission_co2: number;
|
|
175
|
+
motoring__emission_co2_unit: string;
|
|
176
|
+
motoring__emission_sticker: string;
|
|
177
|
+
motoring__engine_displacement_cubic_centimeters: number;
|
|
178
|
+
motoring__fuel_consumption_combined: number;
|
|
179
|
+
motoring__fuel_consumption_extra_urban: number;
|
|
180
|
+
motoring__fuel_consumption_extra_urban_unit: string;
|
|
181
|
+
motoring__fuel_consumption_combined_unit: string;
|
|
182
|
+
motoring__fuel_consumption_urban: number;
|
|
183
|
+
motoring__fuel_consumption_urban_unit: string;
|
|
184
|
+
motoring__fuel_type: string;
|
|
185
|
+
motoring__make: string;
|
|
186
|
+
motoring__mileage_kilometers: number;
|
|
187
|
+
motoring__model: string;
|
|
188
|
+
motoring__model_year: number;
|
|
189
|
+
motoring__number_of_doors: number;
|
|
190
|
+
motoring__number_of_seats: number;
|
|
191
|
+
motoring__power_kw: number;
|
|
192
|
+
motoring__power_hp: number;
|
|
193
|
+
motoring__transmission: string;
|
|
194
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './rubrikk.transformer';
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { escape, get, isEmpty, join, toNumber, toSafeInteger, toString, trim } from 'lodash';
|
|
2
|
+
import { Injectable } from '@nestjs/common';
|
|
3
|
+
|
|
4
|
+
import { de, deVehicleDetailsPage, deVehicleProps } from '@bytebrand/i18n-dictionaries';
|
|
5
|
+
import { DePostalCodesService } from '@bytebrand/car-basic-data-scope';
|
|
6
|
+
import { TranslatorExtended } from '@bytebrand/schema-tools';
|
|
7
|
+
import { DataSchemes } from '@bytebrand/car-schema';
|
|
8
|
+
|
|
9
|
+
import { RubrikkXmlItem } from '../interfaces/export-item.interface';
|
|
10
|
+
import { ConfigService } from '../services/config.service';
|
|
11
|
+
import * as moment from 'moment/moment';
|
|
12
|
+
import { ImboImageResponseInterface } from '@bytebrand/chunkable';
|
|
13
|
+
import { isNotEmptyArray } from '../utils/validator.utils';
|
|
14
|
+
|
|
15
|
+
@Injectable()
|
|
16
|
+
export class RubrikkTransformer {
|
|
17
|
+
private translator: TranslatorExtended;
|
|
18
|
+
private postalCodesService: DePostalCodesService;
|
|
19
|
+
|
|
20
|
+
constructor(private readonly configService: ConfigService) {
|
|
21
|
+
const dict = { ...de, ...deVehicleProps, ...deVehicleDetailsPage };
|
|
22
|
+
this.postalCodesService = DePostalCodesService.getInstance();
|
|
23
|
+
this.translator = new TranslatorExtended(dict);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async transform({
|
|
27
|
+
car,
|
|
28
|
+
images,
|
|
29
|
+
}: {
|
|
30
|
+
car: DataSchemes.Car;
|
|
31
|
+
images: ImboImageResponseInterface[];
|
|
32
|
+
}): Promise<RubrikkXmlItem> {
|
|
33
|
+
const autodeId = toString(get(car, '_id', ''));
|
|
34
|
+
|
|
35
|
+
return {
|
|
36
|
+
//Common Fields
|
|
37
|
+
ad__all_imageurls: this.getImagesLinks(autodeId, images),
|
|
38
|
+
ad__condition_new_used_etc: this.getCondition(car),
|
|
39
|
+
ad__description: toString(get(car, 'offer.offerDescription', '')),
|
|
40
|
+
ad__headline: this.getTitle(car),
|
|
41
|
+
ad__imageurl: this.getImageLink(car),
|
|
42
|
+
ad__price: toNumber(get(car, 'price.currentSalesPrice', null)),
|
|
43
|
+
ad__price_currency: toString(get(car, 'price.currency', 'EUR')),
|
|
44
|
+
product__type: this.getCategory(car),
|
|
45
|
+
ad__url: this.getCarLink(car),
|
|
46
|
+
efficiency_class: this.getEnergyClass(car),
|
|
47
|
+
ad__number_ad__number_reference_id: toString(get(car, 'metaData.vehicleId', '')),
|
|
48
|
+
|
|
49
|
+
//Categorization
|
|
50
|
+
category_original: 'Autos',
|
|
51
|
+
maincategory_original: 'Fahrzeuge',
|
|
52
|
+
|
|
53
|
+
//Advertiser Info
|
|
54
|
+
advertiser__company_homepage_url: 'https://www.auto.de',
|
|
55
|
+
advertiser__company_logo_url:
|
|
56
|
+
'https://autode-static.de/wp-content/themes/autode/front/img/header/b_logo_autode.svg',
|
|
57
|
+
advertiser__email: 'auto@auto.de',
|
|
58
|
+
advertiser__name_company_name: 'Auto.de',
|
|
59
|
+
advertiser__phone: '+498004030182',
|
|
60
|
+
|
|
61
|
+
// Geography Info
|
|
62
|
+
location__country: 'Deutschland',
|
|
63
|
+
location__municipality_city: get(car, 'location.city', ''),
|
|
64
|
+
location__zip_postal_code: toString(get(car, 'location.zipCode', '')),
|
|
65
|
+
|
|
66
|
+
// Motoring Fields
|
|
67
|
+
motoring__body_type: this.translateSelector(get(car, 'mainData.category', '')),
|
|
68
|
+
motoring__color: this.getColor(car),
|
|
69
|
+
motoring__drivetrain: this.getDriveType(car),
|
|
70
|
+
motoring__emission_class: this.translateSelector(get(car, 'environmentEmissions.emissionClass', '')),
|
|
71
|
+
motoring__emission_co2: get(car, 'environmentEmissions.co2', null),
|
|
72
|
+
motoring__emission_co2_unit: 'g/km',
|
|
73
|
+
motoring__emission_sticker: this.translateSelector(get(car, 'environmentEmissions.emissionSticker', '')),
|
|
74
|
+
motoring__engine_displacement_cubic_centimeters: toNumber(get(car, 'engineData.cubicCapacity', null)),
|
|
75
|
+
motoring__fuel_consumption_combined: get(car, 'consumption.consumptionCombined', null),
|
|
76
|
+
motoring__fuel_consumption_combined_unit: 'l/100km',
|
|
77
|
+
motoring__fuel_consumption_extra_urban: get(car, 'consumption.consumptionOuter', null),
|
|
78
|
+
motoring__fuel_consumption_extra_urban_unit: 'l/100km',
|
|
79
|
+
motoring__fuel_consumption_urban: get(car, 'consumption.consumptionInner', null),
|
|
80
|
+
motoring__fuel_consumption_urban_unit: 'l/100km',
|
|
81
|
+
motoring__fuel_type: this.translateSelector(get(car, 'consumption.fuel', '')),
|
|
82
|
+
motoring__make: toString(get(car, 'mainData.make', '')),
|
|
83
|
+
motoring__mileage_kilometers: get(car, 'mainData.mileage', null),
|
|
84
|
+
motoring__model: toString(get(car, 'mainData.model', '')),
|
|
85
|
+
motoring__model_year: this.getYear(car),
|
|
86
|
+
motoring__number_of_doors: get(car, 'mainData.doors', null),
|
|
87
|
+
motoring__number_of_seats: get(car, 'mainData.seats', null),
|
|
88
|
+
motoring__power_kw: get(car, 'engineData.powerKW', null),
|
|
89
|
+
motoring__power_hp: get(car, 'engineData.powerPS', null),
|
|
90
|
+
motoring__transmission: this.getDrivetrain(car),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
private translateSelector(selector: string): string {
|
|
95
|
+
if (isEmpty(selector) || selector === 'selector_unknown') {
|
|
96
|
+
return '';
|
|
97
|
+
}
|
|
98
|
+
return this.translator.translateVal(selector);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
private getTitle(car: DataSchemes.Car): string {
|
|
102
|
+
const make = toString(get(car, 'mainData.make', ''));
|
|
103
|
+
const model = toString(get(car, 'mainData.model', ''));
|
|
104
|
+
const subModel = toString(get(car, 'mainData.subModel', ''));
|
|
105
|
+
return trim(escape(join([make, model, subModel], ' ')));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
private getCondition(car: DataSchemes.Car): string {
|
|
109
|
+
const available = {
|
|
110
|
+
selector_condition_new: 'Neu',
|
|
111
|
+
selector_condition_used: 'Gebraucht',
|
|
112
|
+
selector_unknown: 'Gebraucht',
|
|
113
|
+
};
|
|
114
|
+
const condition = get(car, 'mainData.condition', 'selector_unknown');
|
|
115
|
+
return get(available, condition);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
private getCategory(car: DataSchemes.Car): string {
|
|
119
|
+
return this.translator.translateVal(get(car, 'mainData.category', ''));
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
private getCarLink(car: DataSchemes.Car): string {
|
|
123
|
+
const autodeId = toString(get(car, '_id', ''));
|
|
124
|
+
return `https://www${this.configService.config.url}/search/vehicle/${autodeId}?source=classifieds&medium=listing&campaign=focus`;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
private getImageLink(car: DataSchemes.Car): string {
|
|
128
|
+
const mainImageId = get(car, 'metaData.mainImageId', '');
|
|
129
|
+
return mainImageId
|
|
130
|
+
? `https://${this.configService.config.imageUrl}carimage/${car._id}/${mainImageId}/large-cached.webp`
|
|
131
|
+
: `https://${this.configService.config.imageUrl}/carimage/noimage/7pNvWELuWhZX/large-cached.jpeg`;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
private getImagesLinks(carId: string, images: ImboImageResponseInterface[]): string[] {
|
|
135
|
+
if (isNotEmptyArray(images)) {
|
|
136
|
+
return images.map((image: ImboImageResponseInterface) => {
|
|
137
|
+
return `https://${this.configService.config.url}/carimage/${carId}/${image.imageIdentifier}/large`;
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
return [];
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
private getEnergyClass(car: DataSchemes.Car): string {
|
|
144
|
+
const available = {
|
|
145
|
+
selector_energyEfficiencyClass_a: 'A',
|
|
146
|
+
selector_energyEfficiencyClass_ap: 'A+',
|
|
147
|
+
selector_energyEfficiencyClass_app: 'A++',
|
|
148
|
+
selector_energyEfficiencyClass_appp: 'A+++',
|
|
149
|
+
selector_energyEfficiencyClass_b: 'B',
|
|
150
|
+
selector_energyEfficiencyClass_c: 'C',
|
|
151
|
+
selector_energyEfficiencyClass_d: 'D',
|
|
152
|
+
selector_energyEfficiencyClass_e: 'E',
|
|
153
|
+
selector_energyEfficiencyClass_f: 'F',
|
|
154
|
+
selector_energyEfficiencyClass_g: 'G',
|
|
155
|
+
selector_unknown: 'default',
|
|
156
|
+
};
|
|
157
|
+
const energyClass = get(car, 'environmentEmissions.energyEfficiencyClass', 'selector_unknown');
|
|
158
|
+
return get(available, energyClass);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
private getColor(car: DataSchemes.Car): string {
|
|
162
|
+
let colorSelection = get(car, 'exterior.exteriorColor', 'selector_unknown');
|
|
163
|
+
if (!colorSelection || colorSelection === 'selector_unknown') {
|
|
164
|
+
colorSelection = 'selector_unknown';
|
|
165
|
+
}
|
|
166
|
+
return this.translator.translateVal(colorSelection);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
private getDrivetrain(car: DataSchemes.Car): string {
|
|
170
|
+
const available = {
|
|
171
|
+
selector_gearbox_manualShift: 'Manual',
|
|
172
|
+
selector_gearbox_semiAutomatic: 'Automatic',
|
|
173
|
+
selector_gearbox_automatic: 'Automatic',
|
|
174
|
+
selector_unknown: 'N/A',
|
|
175
|
+
};
|
|
176
|
+
const transmission = get(car, 'driveSuspension.gearbox', 'selector_unknown');
|
|
177
|
+
return get(available, transmission);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
private getYear(car: DataSchemes.Car): number {
|
|
181
|
+
const firstRegistration = get(car, 'mainData.firstRegistration', 0) as number;
|
|
182
|
+
if (firstRegistration !== 0) {
|
|
183
|
+
return toSafeInteger(moment(firstRegistration * 1000).format('YYYY'));
|
|
184
|
+
}
|
|
185
|
+
return 0;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
private getDriveType(car: DataSchemes.Car): string {
|
|
189
|
+
const available = {
|
|
190
|
+
selector_unknown: 'N/A',
|
|
191
|
+
selector_driveType_frontWheelDrive: 'FWD',
|
|
192
|
+
selector_driveType_rearWheelDrive: 'RWD',
|
|
193
|
+
selector_driveType_allWheelDrive: 'AWD',
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
const driveType = get(car, 'driveSuspension.driveType', 'selector_unknown');
|
|
197
|
+
return get(available, driveType) || 'N/A';
|
|
198
|
+
}
|
|
199
|
+
}
|