@bytebrand/export-cars 1.21.6 → 1.21.8

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.
Files changed (160) hide show
  1. package/.editorconfig +8 -8
  2. package/.eslintignore +1 -1
  3. package/.eslintrc.js +24 -24
  4. package/.prettierrc.js +7 -7
  5. package/README.md +65 -65
  6. package/dist/configs/index.d.ts +1 -0
  7. package/dist/configs/index.js +1 -0
  8. package/dist/configs/index.js.map +1 -1
  9. package/dist/configs/santander.config.d.ts +5 -0
  10. package/dist/configs/santander.config.js +18 -0
  11. package/dist/configs/santander.config.js.map +1 -0
  12. package/dist/enums/export-type.enum.d.ts +1 -0
  13. package/dist/enums/export-type.enum.js +1 -0
  14. package/dist/enums/export-type.enum.js.map +1 -1
  15. package/dist/export.command.js +1 -1
  16. package/dist/export.command.js.map +1 -1
  17. package/dist/export.schema.d.ts +6 -2
  18. package/dist/export.schema.js +4 -0
  19. package/dist/export.schema.js.map +1 -1
  20. package/dist/exporters/autouncle.exporter.js +5 -1
  21. package/dist/exporters/autouncle.exporter.js.map +1 -1
  22. package/dist/exporters/fb.exporter.js +7 -1
  23. package/dist/exporters/fb.exporter.js.map +1 -1
  24. package/dist/exporters/index.d.ts +1 -0
  25. package/dist/exporters/index.js +1 -0
  26. package/dist/exporters/index.js.map +1 -1
  27. package/dist/exporters/santander.exporter.d.ts +12 -0
  28. package/dist/exporters/santander.exporter.js +63 -0
  29. package/dist/exporters/santander.exporter.js.map +1 -0
  30. package/dist/formats/auto24-xml.builder.js +2 -2
  31. package/dist/formats/google-xml.builder.js +3 -3
  32. package/dist/formats/modix-xml.builder.js +2 -2
  33. package/dist/formats/ooyyo-xml.builder.js +1 -1
  34. package/dist/formats/santander-csv.builder.d.ts +6 -0
  35. package/dist/formats/santander-csv.builder.js +17 -0
  36. package/dist/formats/santander-csv.builder.js.map +1 -0
  37. package/dist/tsconfig.build.tsbuildinfo +1 -1
  38. package/nest-cli.json +5 -5
  39. package/package.json +61 -61
  40. package/src/app.module.ts +38 -38
  41. package/src/configs/alleskralle.config.ts +15 -15
  42. package/src/configs/as24.config.ts +13 -13
  43. package/src/configs/auto24.config.ts +15 -15
  44. package/src/configs/autoboerse.config.ts +16 -16
  45. package/src/configs/autouncle.config.ts +14 -14
  46. package/src/configs/awin.config.ts +15 -15
  47. package/src/configs/by-owner.config.ts +14 -14
  48. package/src/configs/config.ts +83 -83
  49. package/src/configs/criteo.config.ts +17 -17
  50. package/src/configs/dasparking.config.ts +15 -15
  51. package/src/configs/eauto.config.ts +15 -15
  52. package/src/configs/evium.config.ts +18 -18
  53. package/src/configs/facebook-shop.config.ts +16 -16
  54. package/src/configs/fb.config.ts +16 -16
  55. package/src/configs/google.config.ts +14 -14
  56. package/src/configs/index.ts +22 -21
  57. package/src/configs/kleinanzeigeFocus.config.ts +14 -14
  58. package/src/configs/marktde.config.ts +18 -18
  59. package/src/configs/meinstadt.config.ts +15 -15
  60. package/src/configs/mitula.config.ts +14 -14
  61. package/src/configs/ooyyo.config.ts +15 -15
  62. package/src/configs/santander.config.ts +15 -0
  63. package/src/configs/trovit.config.ts +14 -14
  64. package/src/configs/yescar.config.ts +17 -17
  65. package/src/constants/autouncle.contants.ts +4 -4
  66. package/src/constants/fb.constants.ts +7 -7
  67. package/src/constants/index.ts +1 -1
  68. package/src/constants/modix/body-color-name.constant.ts +20 -20
  69. package/src/constants/modix/category.constant.ts +14 -14
  70. package/src/constants/modix/fuel.constant.ts +14 -14
  71. package/src/constants/modix/index.ts +7 -7
  72. package/src/constants/modix/manufacturers.constant.ts +7498 -7498
  73. package/src/constants/modix/transmission.constant.ts +8 -8
  74. package/src/constants/modix/usage-type.constant.ts +13 -13
  75. package/src/constants/modix/vehicle-class.constant.ts +17 -17
  76. package/src/enums/environment.enum.ts +5 -5
  77. package/src/enums/export-type.enum.ts +33 -32
  78. package/src/enums/file-types.enum.ts +8 -8
  79. package/src/enums/image-type.enum.ts +4 -4
  80. package/src/enums/index.ts +4 -4
  81. package/src/export.command.ts +37 -37
  82. package/src/export.schema.ts +134 -128
  83. package/src/exporters/as24.exporter.ts +69 -69
  84. package/src/exporters/auto24.exporter.ts +48 -48
  85. package/src/exporters/autouncle.exporter.ts +60 -58
  86. package/src/exporters/awin.exporter.ts +47 -47
  87. package/src/exporters/by-owner.exporter.ts +44 -44
  88. package/src/exporters/facebook-shop.exporter.ts +51 -51
  89. package/src/exporters/fb.exporter.ts +52 -50
  90. package/src/exporters/google.exporter.ts +45 -45
  91. package/src/exporters/index.ts +15 -14
  92. package/src/exporters/meinstadt.exporter.ts +55 -55
  93. package/src/exporters/mobile.exporter.ts +64 -64
  94. package/src/exporters/modix.exporter.ts +56 -56
  95. package/src/exporters/ooyyo.exporter.ts +48 -48
  96. package/src/exporters/rubrikk.exporter.ts +53 -53
  97. package/src/exporters/santander.exporter.ts +50 -0
  98. package/src/exporters/trovit.exporter.ts +51 -51
  99. package/src/formats/auto24-xml.builder.ts +54 -54
  100. package/src/formats/autouncle-json.builder.ts +20 -20
  101. package/src/formats/awin-csv.builder.ts +16 -16
  102. package/src/formats/facebook-shop.builder.ts +69 -69
  103. package/src/formats/fb-xml.builder.ts +71 -71
  104. package/src/formats/google-xml.builder.ts +35 -35
  105. package/src/formats/index.ts +5 -5
  106. package/src/formats/meinstadt-json.builder.ts +19 -19
  107. package/src/formats/modix-xml.builder.ts +180 -180
  108. package/src/formats/ooyyo-xml.builder.ts +48 -48
  109. package/src/formats/rubrikk-xml.builder.ts +27 -27
  110. package/src/formats/santander-csv.builder.ts +15 -0
  111. package/src/formats/trovit-xml.builder.ts +44 -44
  112. package/src/interfaces/atributes-wrap-item.intreface.ts +6 -6
  113. package/src/interfaces/dealers-mapping.interface.ts +7 -7
  114. package/src/interfaces/description.interface.ts +24 -24
  115. package/src/interfaces/export-item.interface.ts +366 -366
  116. package/src/interfaces/exporter.interface.ts +3 -3
  117. package/src/interfaces/index.ts +3 -3
  118. package/src/interfaces/input.interface.ts +6 -6
  119. package/src/interfaces/mapping-rules.interface.ts +11 -11
  120. package/src/interfaces/modix/index.ts +1 -1
  121. package/src/interfaces/modix/modix-item-list.interface.ts +5 -5
  122. package/src/interfaces/params.interface.ts +13 -13
  123. package/src/interfaces/rule-parser.interface.ts +3 -3
  124. package/src/main.ts +14 -14
  125. package/src/rules/abstract.rule.ts +37 -37
  126. package/src/rules/date.rule.ts +19 -19
  127. package/src/rules/number.rule.ts +15 -15
  128. package/src/rules/string.rule.ts +8 -8
  129. package/src/services/car.service.ts +49 -49
  130. package/src/services/config.service.ts +15 -15
  131. package/src/services/images.service.ts +207 -207
  132. package/src/services/index.ts +9 -9
  133. package/src/services/loader.service.ts +29 -29
  134. package/src/services/mapping.service.ts +91 -91
  135. package/src/services/request.service.ts +44 -44
  136. package/src/services/rules.service.ts +61 -61
  137. package/src/services/transformer.service.ts +129 -129
  138. package/src/services/user.service.ts +57 -57
  139. package/src/transformers/as24.transformer.ts +253 -253
  140. package/src/transformers/auto24.transfomer.ts +155 -155
  141. package/src/transformers/autouncle.transformer.ts +236 -236
  142. package/src/transformers/awin.transformer.ts +193 -193
  143. package/src/transformers/by-owner.transformer.ts +354 -354
  144. package/src/transformers/facebook-shop.transformer.ts +93 -93
  145. package/src/transformers/fb-description.transformer.ts +316 -316
  146. package/src/transformers/fb-equipment.transformer.ts +161 -161
  147. package/src/transformers/fb.transformer.ts +655 -655
  148. package/src/transformers/google.transformer.ts +169 -169
  149. package/src/transformers/index.ts +5 -5
  150. package/src/transformers/meinstadt.transformer.ts +92 -92
  151. package/src/transformers/mobile.transformer.ts +482 -482
  152. package/src/transformers/modix.transformer.ts +227 -227
  153. package/src/transformers/ooyyo.transformer.ts +109 -109
  154. package/src/transformers/rubrikk.transformer.ts +200 -200
  155. package/src/transformers/trovit.transformer.ts +63 -63
  156. package/src/utils/converter.utils.ts +15 -15
  157. package/src/utils/index.ts +2 -2
  158. package/src/utils/validator.utils.ts +7 -7
  159. package/tsconfig.build.json +4 -4
  160. package/tsconfig.json +29 -29
@@ -1,227 +1,227 @@
1
- import { findLast, get, omit, toNumber, toSafeInteger, toString } from 'lodash';
2
- import * as moment from 'moment/moment';
3
-
4
- import { Injectable } from '@nestjs/common';
5
-
6
- import { MappingRulesInterface, TransformerFactory } from '@bytebrand/import-helper';
7
- import { toLowercase } from '@bytebrand/schema-tools/dist/transform/utils';
8
- import { ImboImageResponseInterface } from '@bytebrand/chunkable';
9
- import { ImportOrigins } from '@bytebrand/cronicle-helper';
10
- import { DataSchemes } from '@bytebrand/car-schema';
11
-
12
- import { imageItem, IAtributeWrapItem, ModixXmlItem } from '../interfaces';
13
- import { isNotEmptyArray, isValidVin, xmlStringReplacer } from '../utils';
14
- import { ConfigService, ImagesService } from '../services';
15
- import {
16
- BodyColorList,
17
- VehicleClassList,
18
- FuelList,
19
- ManufactureList,
20
- TransmissionList,
21
- UsageConditionList,
22
- UsageTypeList,
23
- CategoryList,
24
- } from '../constants';
25
-
26
- @Injectable()
27
- export class ModixTransformer {
28
- constructor(private readonly configService: ConfigService, private readonly imagesService: ImagesService) {}
29
-
30
- async transform(
31
- chunkData: { car: DataSchemes.Car; images: ImboImageResponseInterface[] },
32
- mappingRules: MappingRulesInterface[],
33
- ): Promise<ModixXmlItem> {
34
- const { car, images } = chunkData;
35
-
36
- return {
37
- //Main data
38
- maindata: {
39
- category: this.getCategoryData(car),
40
- manufacturer: this.getManufactureData(car),
41
- model: { value: xmlStringReplacer(get(car, 'mainData.model', '')) },
42
- submodel: { value: xmlStringReplacer(get(car, 'mainData.subModel', '')) },
43
- mileage: { value: toNumber(get(car, 'mainData.mileage', null)), atributes: { scaleUnit: 'km' } },
44
- cylinderCapacity: { value: toString(get(car, 'engineData.cylinders', null)) },
45
- enginePower: { value: toNumber(get(car, 'engineData.powerKW', null)), atributes: { scaleUnit: 'kW' } },
46
- fuel: this.getFuelData(car),
47
- transmission: this.getTransmissionData(car),
48
- accident: this.getAccident(car),
49
- usageCategory: this.getUsageData(car),
50
- bodyStyle: this.getBodyStyleData(car),
51
- isOnline: { value: get(car, 'state.isOnline', null) },
52
- },
53
-
54
- //colors
55
- bodyColors: {
56
- id: this.getColorNameData(car).atributes.id,
57
- data: {
58
- name: { value: this.getColorNameData(car).value },
59
- description: { value: `Außenfarbe ${this.getColorNameData(car).value}` },
60
- paint: this.getPainId(car),
61
- },
62
- },
63
-
64
- //dates
65
- dates: [
66
- { tag: 'date', value: toString(this.getGeneralInspection(car)), atributes: { id: 3 } },
67
- { tag: 'date', value: toString(this.getExhaustInspection(car)), atributes: { id: 4 } },
68
- { tag: 'date', value: toString(this.getConstruction(car)), atributes: { id: 1 } },
69
- { tag: 'date', value: toString(this.getYear(car)), atributes: { id: 2 } },
70
- ],
71
-
72
- // identification
73
- identification: {
74
- hsnTsn: {
75
- hsn: { value: get(car, 'metaData.hsn', '') },
76
- tsn: { value: get(car, 'metaData.tsn', '') },
77
- },
78
- vin: { value: this.getVin(car) },
79
- datEuropacode: { value: get(car, 'metaData.codeDAT', '') },
80
- schwackecode: { value: get(car, 'metaData.codeSchwacke', '') },
81
- },
82
-
83
- //price
84
- prices: {
85
- vatReclaimable: get(car, 'price.vatDeductible', false),
86
- grossPrice: { value: toNumber(get(car, 'price.currentSalesPrice', null)) },
87
- },
88
-
89
- //images
90
- images: this.getImagesLinks(car, images),
91
-
92
- //dealer
93
- dealer: {
94
- address: {
95
- company: { value: 'auto.de Handels GmbH' },
96
- street: { value: 'Thomaskirchhof 20' },
97
- city: { value: 'Leipzig' },
98
- zip: { value: '04109' },
99
- country: { value: 'DE' },
100
- phone: { value: '+498004030182' },
101
- fax: { value: '+4934199153879' },
102
- email: { value: 'auto@auto.de' },
103
- homepage: { value: 'https://www.auto.de' },
104
- },
105
- imprint: {
106
- registerId: { value: ' - HRB 33676' },
107
- representitive: { value: 'Michael Klemmer, Boris Radke' },
108
- vatid: { value: 'DE311875741' },
109
- },
110
- },
111
- options: await this.buildOptions(car, mappingRules),
112
- };
113
- }
114
-
115
- private getCategoryData(car: DataSchemes.Car): IAtributeWrapItem {
116
- const vehicle_class = get(car, 'mainData.vehicleClass', 'selector_unknown');
117
- return get(VehicleClassList, vehicle_class);
118
- }
119
-
120
- private getManufactureData(car: DataSchemes.Car): IAtributeWrapItem {
121
- const carMake = toString(get(car, 'mainData.make', ''));
122
- const manufactureData = findLast(ManufactureList, item => toLowercase(item.name) === toLowercase(carMake));
123
-
124
- return { value: manufactureData?.name || carMake, atributes: { id: manufactureData?.id || null } };
125
- }
126
-
127
- private getFuelData(car: DataSchemes.Car): IAtributeWrapItem {
128
- const fuel_selector = get(car, 'consumption.fuel', '');
129
- return get(FuelList, fuel_selector);
130
- }
131
-
132
- private getTransmissionData(car: DataSchemes.Car): IAtributeWrapItem {
133
- const transmission_selector = get(car, 'driveSuspension.gearbox', 'selector_unknown');
134
- return get(TransmissionList, transmission_selector);
135
- }
136
-
137
- private getAccident(car: DataSchemes.Car): IAtributeWrapItem {
138
- const accident = get(car, 'mainData.accidentDamaged', null);
139
-
140
- return { value: accident };
141
- }
142
-
143
- private getUsageData(car: DataSchemes.Car): IAtributeWrapItem {
144
- const usageType = get(car, 'mainData.usageType', '');
145
- const usageBySelector = get(UsageTypeList, usageType);
146
-
147
- if (usageBySelector) {
148
- return usageBySelector;
149
- }
150
-
151
- const condition = get(car, 'mainData.condition', 'selector_unknown');
152
- return get(UsageConditionList, condition);
153
- }
154
-
155
- private getBodyStyleData(car: DataSchemes.Car): IAtributeWrapItem {
156
- const body_style_selector = get(car, 'mainData.category', 'selector_unknown');
157
- return get(CategoryList, body_style_selector) || null;
158
- }
159
-
160
- private getPainId(car: DataSchemes.Car): IAtributeWrapItem {
161
- const metallic = get(car, 'exterior.metallic', false);
162
- return metallic ? { value: 'metallic', atributes: { id: 3 } } : { value: 'solid', atributes: { id: 1 } };
163
- }
164
-
165
- private getColorNameData(car: DataSchemes.Car): IAtributeWrapItem {
166
- const colorSelection = get(car, 'exterior.exteriorColor', 'selector_unknown');
167
- return get(BodyColorList, colorSelection);
168
- }
169
-
170
- private getYear(car: DataSchemes.Car): number {
171
- const firstRegistration = get(car, 'mainData.firstRegistration', 0) as number;
172
- if (firstRegistration !== 0) {
173
- return toSafeInteger(moment(firstRegistration * 1000).format('YYYY'));
174
- }
175
- return 0;
176
- }
177
-
178
- private getGeneralInspection(car: DataSchemes.Car): number {
179
- const inspection_date = get(car, 'careService.generalInspection', 0) as number;
180
- return inspection_date ? toSafeInteger(moment(inspection_date * 1000).format('YYYY')) : 0;
181
- }
182
-
183
- private getConstruction(car: DataSchemes.Car): number {
184
- const construction_date = get(car, 'mainData.constructionDate', 0) as number;
185
- return construction_date ? toSafeInteger(moment(construction_date * 1000).format('YYYY')) : 0;
186
- }
187
-
188
- private getExhaustInspection(car: DataSchemes.Car): number {
189
- const exhaust_date = get(car, 'careService.exhaustInspection', 0) as number;
190
- return exhaust_date ? toSafeInteger(moment(exhaust_date * 1000).format('YYYY')) : 0;
191
- }
192
-
193
- private getVin(car: DataSchemes.Car): string {
194
- const vin: string = get(car, 'metaData.vin', '');
195
- return isValidVin(vin) ? vin : get(car, 'marketing.fakeVIN', '');
196
- }
197
-
198
- private getImagesLinks(car: DataSchemes.Car, images: ImboImageResponseInterface[]): imageItem {
199
- const car_id = toString(get(car, '_id', ''));
200
- const url = `${this.configService.config.imageUrl}/carimage/${car_id}`;
201
-
202
- const imageList: IAtributeWrapItem[] = [];
203
-
204
- if (isNotEmptyArray(images)) {
205
- this.imagesService.sortImages(images).forEach((image: ImboImageResponseInterface, index) => {
206
- imageList.push({ value: null, atributes: { name: `${image.imageIdentifier}/large`, position: index + 1 } });
207
- });
208
- }
209
- return { url, imageList };
210
- }
211
-
212
- private async buildOptions(
213
- car: DataSchemes.Car,
214
- mappingRules: MappingRulesInterface[],
215
- ): Promise<Omit<DataSchemes.Car, 'state'>> {
216
- const transformer = TransformerFactory.createTransformer(
217
- ImportOrigins.MODIX,
218
- car,
219
- { importSelectorMappingLog: () => {} } as any,
220
- [{ make: 'make', model: 'model' }],
221
- ['alt_model'],
222
- );
223
- const { car: transformedCar } = await transformer.transform(mappingRules);
224
-
225
- return omit(transformedCar, ['state']);
226
- }
227
- }
1
+ import { findLast, get, omit, toNumber, toSafeInteger, toString } from 'lodash';
2
+ import * as moment from 'moment/moment';
3
+
4
+ import { Injectable } from '@nestjs/common';
5
+
6
+ import { MappingRulesInterface, TransformerFactory } from '@bytebrand/import-helper';
7
+ import { toLowercase } from '@bytebrand/schema-tools/dist/transform/utils';
8
+ import { ImboImageResponseInterface } from '@bytebrand/chunkable';
9
+ import { ImportOrigins } from '@bytebrand/cronicle-helper';
10
+ import { DataSchemes } from '@bytebrand/car-schema';
11
+
12
+ import { imageItem, IAtributeWrapItem, ModixXmlItem } from '../interfaces';
13
+ import { isNotEmptyArray, isValidVin, xmlStringReplacer } from '../utils';
14
+ import { ConfigService, ImagesService } from '../services';
15
+ import {
16
+ BodyColorList,
17
+ VehicleClassList,
18
+ FuelList,
19
+ ManufactureList,
20
+ TransmissionList,
21
+ UsageConditionList,
22
+ UsageTypeList,
23
+ CategoryList,
24
+ } from '../constants';
25
+
26
+ @Injectable()
27
+ export class ModixTransformer {
28
+ constructor(private readonly configService: ConfigService, private readonly imagesService: ImagesService) {}
29
+
30
+ async transform(
31
+ chunkData: { car: DataSchemes.Car; images: ImboImageResponseInterface[] },
32
+ mappingRules: MappingRulesInterface[],
33
+ ): Promise<ModixXmlItem> {
34
+ const { car, images } = chunkData;
35
+
36
+ return {
37
+ //Main data
38
+ maindata: {
39
+ category: this.getCategoryData(car),
40
+ manufacturer: this.getManufactureData(car),
41
+ model: { value: xmlStringReplacer(get(car, 'mainData.model', '')) },
42
+ submodel: { value: xmlStringReplacer(get(car, 'mainData.subModel', '')) },
43
+ mileage: { value: toNumber(get(car, 'mainData.mileage', null)), atributes: { scaleUnit: 'km' } },
44
+ cylinderCapacity: { value: toString(get(car, 'engineData.cylinders', null)) },
45
+ enginePower: { value: toNumber(get(car, 'engineData.powerKW', null)), atributes: { scaleUnit: 'kW' } },
46
+ fuel: this.getFuelData(car),
47
+ transmission: this.getTransmissionData(car),
48
+ accident: this.getAccident(car),
49
+ usageCategory: this.getUsageData(car),
50
+ bodyStyle: this.getBodyStyleData(car),
51
+ isOnline: { value: get(car, 'state.isOnline', null) },
52
+ },
53
+
54
+ //colors
55
+ bodyColors: {
56
+ id: this.getColorNameData(car).atributes.id,
57
+ data: {
58
+ name: { value: this.getColorNameData(car).value },
59
+ description: { value: `Außenfarbe ${this.getColorNameData(car).value}` },
60
+ paint: this.getPainId(car),
61
+ },
62
+ },
63
+
64
+ //dates
65
+ dates: [
66
+ { tag: 'date', value: toString(this.getGeneralInspection(car)), atributes: { id: 3 } },
67
+ { tag: 'date', value: toString(this.getExhaustInspection(car)), atributes: { id: 4 } },
68
+ { tag: 'date', value: toString(this.getConstruction(car)), atributes: { id: 1 } },
69
+ { tag: 'date', value: toString(this.getYear(car)), atributes: { id: 2 } },
70
+ ],
71
+
72
+ // identification
73
+ identification: {
74
+ hsnTsn: {
75
+ hsn: { value: get(car, 'metaData.hsn', '') },
76
+ tsn: { value: get(car, 'metaData.tsn', '') },
77
+ },
78
+ vin: { value: this.getVin(car) },
79
+ datEuropacode: { value: get(car, 'metaData.codeDAT', '') },
80
+ schwackecode: { value: get(car, 'metaData.codeSchwacke', '') },
81
+ },
82
+
83
+ //price
84
+ prices: {
85
+ vatReclaimable: get(car, 'price.vatDeductible', false),
86
+ grossPrice: { value: toNumber(get(car, 'price.currentSalesPrice', null)) },
87
+ },
88
+
89
+ //images
90
+ images: this.getImagesLinks(car, images),
91
+
92
+ //dealer
93
+ dealer: {
94
+ address: {
95
+ company: { value: 'auto.de Handels GmbH' },
96
+ street: { value: 'Thomaskirchhof 20' },
97
+ city: { value: 'Leipzig' },
98
+ zip: { value: '04109' },
99
+ country: { value: 'DE' },
100
+ phone: { value: '+498004030182' },
101
+ fax: { value: '+4934199153879' },
102
+ email: { value: 'auto@auto.de' },
103
+ homepage: { value: 'https://www.auto.de' },
104
+ },
105
+ imprint: {
106
+ registerId: { value: ' - HRB 33676' },
107
+ representitive: { value: 'Michael Klemmer, Boris Radke' },
108
+ vatid: { value: 'DE311875741' },
109
+ },
110
+ },
111
+ options: await this.buildOptions(car, mappingRules),
112
+ };
113
+ }
114
+
115
+ private getCategoryData(car: DataSchemes.Car): IAtributeWrapItem {
116
+ const vehicle_class = get(car, 'mainData.vehicleClass', 'selector_unknown');
117
+ return get(VehicleClassList, vehicle_class);
118
+ }
119
+
120
+ private getManufactureData(car: DataSchemes.Car): IAtributeWrapItem {
121
+ const carMake = toString(get(car, 'mainData.make', ''));
122
+ const manufactureData = findLast(ManufactureList, item => toLowercase(item.name) === toLowercase(carMake));
123
+
124
+ return { value: manufactureData?.name || carMake, atributes: { id: manufactureData?.id || null } };
125
+ }
126
+
127
+ private getFuelData(car: DataSchemes.Car): IAtributeWrapItem {
128
+ const fuel_selector = get(car, 'consumption.fuel', '');
129
+ return get(FuelList, fuel_selector);
130
+ }
131
+
132
+ private getTransmissionData(car: DataSchemes.Car): IAtributeWrapItem {
133
+ const transmission_selector = get(car, 'driveSuspension.gearbox', 'selector_unknown');
134
+ return get(TransmissionList, transmission_selector);
135
+ }
136
+
137
+ private getAccident(car: DataSchemes.Car): IAtributeWrapItem {
138
+ const accident = get(car, 'mainData.accidentDamaged', null);
139
+
140
+ return { value: accident };
141
+ }
142
+
143
+ private getUsageData(car: DataSchemes.Car): IAtributeWrapItem {
144
+ const usageType = get(car, 'mainData.usageType', '');
145
+ const usageBySelector = get(UsageTypeList, usageType);
146
+
147
+ if (usageBySelector) {
148
+ return usageBySelector;
149
+ }
150
+
151
+ const condition = get(car, 'mainData.condition', 'selector_unknown');
152
+ return get(UsageConditionList, condition);
153
+ }
154
+
155
+ private getBodyStyleData(car: DataSchemes.Car): IAtributeWrapItem {
156
+ const body_style_selector = get(car, 'mainData.category', 'selector_unknown');
157
+ return get(CategoryList, body_style_selector) || null;
158
+ }
159
+
160
+ private getPainId(car: DataSchemes.Car): IAtributeWrapItem {
161
+ const metallic = get(car, 'exterior.metallic', false);
162
+ return metallic ? { value: 'metallic', atributes: { id: 3 } } : { value: 'solid', atributes: { id: 1 } };
163
+ }
164
+
165
+ private getColorNameData(car: DataSchemes.Car): IAtributeWrapItem {
166
+ const colorSelection = get(car, 'exterior.exteriorColor', 'selector_unknown');
167
+ return get(BodyColorList, colorSelection);
168
+ }
169
+
170
+ private getYear(car: DataSchemes.Car): number {
171
+ const firstRegistration = get(car, 'mainData.firstRegistration', 0) as number;
172
+ if (firstRegistration !== 0) {
173
+ return toSafeInteger(moment(firstRegistration * 1000).format('YYYY'));
174
+ }
175
+ return 0;
176
+ }
177
+
178
+ private getGeneralInspection(car: DataSchemes.Car): number {
179
+ const inspection_date = get(car, 'careService.generalInspection', 0) as number;
180
+ return inspection_date ? toSafeInteger(moment(inspection_date * 1000).format('YYYY')) : 0;
181
+ }
182
+
183
+ private getConstruction(car: DataSchemes.Car): number {
184
+ const construction_date = get(car, 'mainData.constructionDate', 0) as number;
185
+ return construction_date ? toSafeInteger(moment(construction_date * 1000).format('YYYY')) : 0;
186
+ }
187
+
188
+ private getExhaustInspection(car: DataSchemes.Car): number {
189
+ const exhaust_date = get(car, 'careService.exhaustInspection', 0) as number;
190
+ return exhaust_date ? toSafeInteger(moment(exhaust_date * 1000).format('YYYY')) : 0;
191
+ }
192
+
193
+ private getVin(car: DataSchemes.Car): string {
194
+ const vin: string = get(car, 'metaData.vin', '');
195
+ return isValidVin(vin) ? vin : get(car, 'marketing.fakeVIN', '');
196
+ }
197
+
198
+ private getImagesLinks(car: DataSchemes.Car, images: ImboImageResponseInterface[]): imageItem {
199
+ const car_id = toString(get(car, '_id', ''));
200
+ const url = `${this.configService.config.imageUrl}/carimage/${car_id}`;
201
+
202
+ const imageList: IAtributeWrapItem[] = [];
203
+
204
+ if (isNotEmptyArray(images)) {
205
+ this.imagesService.sortImages(images).forEach((image: ImboImageResponseInterface, index) => {
206
+ imageList.push({ value: null, atributes: { name: `${image.imageIdentifier}/large`, position: index + 1 } });
207
+ });
208
+ }
209
+ return { url, imageList };
210
+ }
211
+
212
+ private async buildOptions(
213
+ car: DataSchemes.Car,
214
+ mappingRules: MappingRulesInterface[],
215
+ ): Promise<Omit<DataSchemes.Car, 'state'>> {
216
+ const transformer = TransformerFactory.createTransformer(
217
+ ImportOrigins.MODIX,
218
+ car,
219
+ { importSelectorMappingLog: () => {} } as any,
220
+ [{ make: 'make', model: 'model' }],
221
+ ['alt_model'],
222
+ );
223
+ const { car: transformedCar } = await transformer.transform(mappingRules);
224
+
225
+ return omit(transformedCar, ['state']);
226
+ }
227
+ }