@bytebrand/export-cars 0.0.2 → 1.0.6

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 (335) hide show
  1. package/.editorconfig +8 -0
  2. package/.eslintignore +1 -0
  3. package/.eslintrc.js +24 -0
  4. package/.prettierrc.js +7 -0
  5. package/README.md +67 -0
  6. package/dist/app.module.d.ts +2 -0
  7. package/dist/app.module.js +47 -0
  8. package/dist/app.module.js.map +1 -0
  9. package/dist/config/as24.config.d.ts +5 -0
  10. package/dist/config/as24.config.js +13 -0
  11. package/dist/config/as24.config.js.map +1 -0
  12. package/dist/config/auto24.config.d.ts +6 -0
  13. package/dist/config/auto24.config.js +31 -0
  14. package/dist/config/auto24.config.js.map +1 -0
  15. package/dist/config/autoboerse.config.d.ts +5 -0
  16. package/dist/config/autoboerse.config.js +15 -0
  17. package/dist/config/autoboerse.config.js.map +1 -0
  18. package/dist/config/autouncle.config.d.ts +5 -0
  19. package/dist/config/autouncle.config.js +14 -0
  20. package/dist/config/autouncle.config.js.map +1 -0
  21. package/dist/config/by-owner.config.d.ts +5 -0
  22. package/dist/config/by-owner.config.js +14 -0
  23. package/dist/config/by-owner.config.js.map +1 -0
  24. package/dist/config/config.d.ts +57 -0
  25. package/dist/config/config.js +78 -0
  26. package/dist/config/config.js.map +1 -0
  27. package/dist/config/eauto.config.d.ts +5 -0
  28. package/dist/config/eauto.config.js +15 -0
  29. package/dist/config/eauto.config.js.map +1 -0
  30. package/dist/config/fb.config.d.ts +5 -0
  31. package/dist/config/fb.config.js +14 -0
  32. package/dist/config/fb.config.js.map +1 -0
  33. package/dist/config/google.config.d.ts +5 -0
  34. package/dist/config/google.config.js +13 -0
  35. package/dist/config/google.config.js.map +1 -0
  36. package/dist/config/marktde.config.d.ts +5 -0
  37. package/dist/config/marktde.config.js +14 -0
  38. package/dist/config/marktde.config.js.map +1 -0
  39. package/dist/config/meinstadt.config.d.ts +5 -0
  40. package/dist/config/meinstadt.config.js +14 -0
  41. package/dist/config/meinstadt.config.js.map +1 -0
  42. package/dist/config/ooyyo.config.d.ts +5 -0
  43. package/dist/config/ooyyo.config.js +14 -0
  44. package/dist/config/ooyyo.config.js.map +1 -0
  45. package/dist/config/yescar.config.d.ts +5 -0
  46. package/dist/config/yescar.config.js +14 -0
  47. package/dist/config/yescar.config.js.map +1 -0
  48. package/dist/constants/autouncle.contants.d.ts +4 -0
  49. package/dist/constants/autouncle.contants.js +8 -0
  50. package/dist/constants/autouncle.contants.js.map +1 -0
  51. package/dist/constants/fb.constants.d.ts +7 -0
  52. package/dist/constants/fb.constants.js +11 -0
  53. package/dist/constants/fb.constants.js.map +1 -0
  54. package/dist/constants/rule-input.contants.d.ts +3 -0
  55. package/dist/constants/rule-input.contants.js +7 -0
  56. package/dist/constants/rule-input.contants.js.map +1 -0
  57. package/dist/enums/environment.enum.d.ts +5 -0
  58. package/dist/enums/environment.enum.js +10 -0
  59. package/dist/enums/environment.enum.js.map +1 -0
  60. package/dist/enums/export-type.enum.d.ts +14 -0
  61. package/dist/enums/export-type.enum.js +19 -0
  62. package/dist/enums/export-type.enum.js.map +1 -0
  63. package/dist/export.command.d.ts +11 -0
  64. package/dist/export.command.js +49 -0
  65. package/dist/export.command.js.map +1 -0
  66. package/dist/export.schema.d.ts +65 -0
  67. package/dist/export.schema.js +70 -0
  68. package/dist/export.schema.js.map +1 -0
  69. package/dist/exporters/as24.exporter.d.ts +13 -0
  70. package/dist/exporters/as24.exporter.js +68 -0
  71. package/dist/exporters/as24.exporter.js.map +1 -0
  72. package/dist/exporters/auto24.exporter.d.ts +13 -0
  73. package/dist/exporters/auto24.exporter.js +81 -0
  74. package/dist/exporters/auto24.exporter.js.map +1 -0
  75. package/dist/exporters/autouncle.exporter.d.ts +15 -0
  76. package/dist/exporters/autouncle.exporter.js +79 -0
  77. package/dist/exporters/autouncle.exporter.js.map +1 -0
  78. package/dist/exporters/by-owner.exporter.d.ts +11 -0
  79. package/dist/exporters/by-owner.exporter.js +58 -0
  80. package/dist/exporters/by-owner.exporter.js.map +1 -0
  81. package/dist/exporters/fb.exporter.d.ts +15 -0
  82. package/dist/exporters/fb.exporter.js +67 -0
  83. package/dist/exporters/fb.exporter.js.map +1 -0
  84. package/dist/exporters/google.exporter.d.ts +15 -0
  85. package/dist/exporters/google.exporter.js +67 -0
  86. package/dist/exporters/google.exporter.js.map +1 -0
  87. package/dist/exporters/meinstadt.exporter.d.ts +15 -0
  88. package/dist/exporters/meinstadt.exporter.js +84 -0
  89. package/dist/exporters/meinstadt.exporter.js.map +1 -0
  90. package/dist/exporters/mobile.exporter.d.ts +18 -0
  91. package/dist/exporters/mobile.exporter.js +111 -0
  92. package/dist/exporters/mobile.exporter.js.map +1 -0
  93. package/dist/exporters/ooyyo.exporter.d.ts +13 -0
  94. package/dist/exporters/ooyyo.exporter.js +65 -0
  95. package/dist/exporters/ooyyo.exporter.js.map +1 -0
  96. package/dist/formats/auto24-xml.builder.d.ts +7 -0
  97. package/dist/formats/auto24-xml.builder.js +47 -0
  98. package/dist/formats/auto24-xml.builder.js.map +1 -0
  99. package/dist/formats/autouncle-json.builder.d.ts +7 -0
  100. package/dist/formats/autouncle-json.builder.js +21 -0
  101. package/dist/formats/autouncle-json.builder.js.map +1 -0
  102. package/dist/formats/fb-xml.builder.d.ts +11 -0
  103. package/dist/formats/fb-xml.builder.js +63 -0
  104. package/dist/formats/fb-xml.builder.js.map +1 -0
  105. package/dist/formats/google-xml.builder.d.ts +8 -0
  106. package/dist/formats/google-xml.builder.js +32 -0
  107. package/dist/formats/google-xml.builder.js.map +1 -0
  108. package/dist/formats/meinstadt-json.builder.d.ts +7 -0
  109. package/dist/formats/meinstadt-json.builder.js +22 -0
  110. package/dist/formats/meinstadt-json.builder.js.map +1 -0
  111. package/dist/formats/ooyyo-xml.builder.d.ts +7 -0
  112. package/dist/formats/ooyyo-xml.builder.js +47 -0
  113. package/dist/formats/ooyyo-xml.builder.js.map +1 -0
  114. package/dist/input.questions.d.ts +3 -0
  115. package/dist/input.questions.js +32 -0
  116. package/dist/input.questions.js.map +1 -0
  117. package/dist/interfaces/description.interface.d.ts +22 -0
  118. package/dist/interfaces/description.interface.js +3 -0
  119. package/dist/interfaces/description.interface.js.map +1 -0
  120. package/dist/interfaces/export-item.interface.d.ts +147 -0
  121. package/dist/interfaces/export-item.interface.js +3 -0
  122. package/dist/interfaces/export-item.interface.js.map +1 -0
  123. package/dist/interfaces/exporter.interface.d.ts +3 -0
  124. package/dist/interfaces/exporter.interface.js +3 -0
  125. package/dist/interfaces/exporter.interface.js.map +1 -0
  126. package/dist/interfaces/input.interface.d.ts +5 -0
  127. package/dist/interfaces/input.interface.js +3 -0
  128. package/dist/interfaces/input.interface.js.map +1 -0
  129. package/dist/interfaces/mapping-rules.interface.d.ts +10 -0
  130. package/dist/interfaces/mapping-rules.interface.js +3 -0
  131. package/dist/interfaces/mapping-rules.interface.js.map +1 -0
  132. package/dist/interfaces/params.interface.d.ts +18 -0
  133. package/dist/interfaces/params.interface.js +3 -0
  134. package/dist/interfaces/params.interface.js.map +1 -0
  135. package/dist/interfaces/rule-parser.interface.d.ts +3 -0
  136. package/dist/interfaces/rule-parser.interface.js +3 -0
  137. package/dist/interfaces/rule-parser.interface.js.map +1 -0
  138. package/dist/main.d.ts +1 -0
  139. package/dist/main.js +10 -0
  140. package/dist/main.js.map +1 -0
  141. package/dist/rules/abstract.rule.d.ts +13 -0
  142. package/dist/rules/abstract.rule.js +32 -0
  143. package/dist/rules/abstract.rule.js.map +1 -0
  144. package/dist/rules/date.rule.d.ts +7 -0
  145. package/dist/rules/date.rule.js +20 -0
  146. package/dist/rules/date.rule.js.map +1 -0
  147. package/dist/rules/number.rule.d.ts +7 -0
  148. package/dist/rules/number.rule.js +16 -0
  149. package/dist/rules/number.rule.js.map +1 -0
  150. package/dist/rules/string.rule.d.ts +5 -0
  151. package/dist/rules/string.rule.js +11 -0
  152. package/dist/rules/string.rule.js.map +1 -0
  153. package/dist/services/car.service.d.ts +24 -0
  154. package/dist/services/car.service.js +74 -0
  155. package/dist/services/car.service.js.map +1 -0
  156. package/dist/services/config.service.d.ts +6 -0
  157. package/dist/services/config.service.js +24 -0
  158. package/dist/services/config.service.js.map +1 -0
  159. package/dist/services/loader.service.d.ts +9 -0
  160. package/dist/services/loader.service.js +45 -0
  161. package/dist/services/loader.service.js.map +1 -0
  162. package/dist/services/mapping.service.d.ts +11 -0
  163. package/dist/services/mapping.service.js +73 -0
  164. package/dist/services/mapping.service.js.map +1 -0
  165. package/dist/services/marketing-images.service.d.ts +16 -0
  166. package/dist/services/marketing-images.service.js +58 -0
  167. package/dist/services/marketing-images.service.js.map +1 -0
  168. package/dist/services/request.service.d.ts +12 -0
  169. package/dist/services/request.service.js +48 -0
  170. package/dist/services/request.service.js.map +1 -0
  171. package/dist/services/rules.service.d.ts +15 -0
  172. package/dist/services/rules.service.js +68 -0
  173. package/dist/services/rules.service.js.map +1 -0
  174. package/dist/services/user.service.d.ts +11 -0
  175. package/dist/services/user.service.js +64 -0
  176. package/dist/services/user.service.js.map +1 -0
  177. package/dist/transformers/as24.transformer.d.ts +28 -0
  178. package/dist/transformers/as24.transformer.js +217 -0
  179. package/dist/transformers/as24.transformer.js.map +1 -0
  180. package/dist/transformers/auto24.transfomer.d.ts +16 -0
  181. package/dist/transformers/auto24.transfomer.js +155 -0
  182. package/dist/transformers/auto24.transfomer.js.map +1 -0
  183. package/dist/transformers/autouncle.transformer.d.ts +32 -0
  184. package/dist/transformers/autouncle.transformer.js +234 -0
  185. package/dist/transformers/autouncle.transformer.js.map +1 -0
  186. package/dist/transformers/by-owner.transformer.d.ts +12 -0
  187. package/dist/transformers/by-owner.transformer.js +274 -0
  188. package/dist/transformers/by-owner.transformer.js.map +1 -0
  189. package/dist/transformers/fb-description.transformer.d.ts +19 -0
  190. package/dist/transformers/fb-description.transformer.js +297 -0
  191. package/dist/transformers/fb-description.transformer.js.map +1 -0
  192. package/dist/transformers/fb-equipment.transformer.d.ts +8 -0
  193. package/dist/transformers/fb-equipment.transformer.js +149 -0
  194. package/dist/transformers/fb-equipment.transformer.js.map +1 -0
  195. package/dist/transformers/fb.transformer.d.ts +41 -0
  196. package/dist/transformers/fb.transformer.js +553 -0
  197. package/dist/transformers/fb.transformer.js.map +1 -0
  198. package/dist/transformers/google.transformer.d.ts +26 -0
  199. package/dist/transformers/google.transformer.js +164 -0
  200. package/dist/transformers/google.transformer.js.map +1 -0
  201. package/dist/transformers/meinstadt.transformer.d.ts +14 -0
  202. package/dist/transformers/meinstadt.transformer.js +95 -0
  203. package/dist/transformers/meinstadt.transformer.js.map +1 -0
  204. package/dist/transformers/mobile.transformer.d.ts +47 -0
  205. package/dist/transformers/mobile.transformer.js +471 -0
  206. package/dist/transformers/mobile.transformer.js.map +1 -0
  207. package/dist/transformers/ooyyo.transformer.d.ts +17 -0
  208. package/dist/transformers/ooyyo.transformer.js +127 -0
  209. package/dist/transformers/ooyyo.transformer.js.map +1 -0
  210. package/dist/tsconfig.build.tsbuildinfo +1 -0
  211. package/dist/utils/converter.utils.d.ts +1 -0
  212. package/dist/utils/converter.utils.js +15 -0
  213. package/dist/utils/converter.utils.js.map +1 -0
  214. package/dist/utils/date-time.utils.d.ts +1 -0
  215. package/dist/utils/date-time.utils.js +21 -0
  216. package/dist/utils/date-time.utils.js.map +1 -0
  217. package/dist/utils/parser.utils.d.ts +2 -0
  218. package/dist/utils/parser.utils.js +9 -0
  219. package/dist/utils/parser.utils.js.map +1 -0
  220. package/dist/utils/validator.utils.d.ts +2 -0
  221. package/dist/utils/validator.utils.js +12 -0
  222. package/dist/utils/validator.utils.js.map +1 -0
  223. package/nest-cli.json +5 -0
  224. package/package.json +55 -31
  225. package/src/app.module.ts +34 -0
  226. package/src/config/as24.config.ts +10 -0
  227. package/src/config/auto24.config.ts +29 -0
  228. package/src/config/autoboerse.config.ts +12 -0
  229. package/src/config/autouncle.config.ts +11 -0
  230. package/src/config/by-owner.config.ts +11 -0
  231. package/src/config/config.ts +87 -0
  232. package/src/config/eauto.config.ts +12 -0
  233. package/src/config/fb.config.ts +11 -0
  234. package/src/config/google.config.ts +10 -0
  235. package/src/config/marktde.config.ts +11 -0
  236. package/src/config/meinstadt.config.ts +11 -0
  237. package/src/config/ooyyo.config.ts +11 -0
  238. package/src/config/yescar.config.ts +11 -0
  239. package/src/constants/autouncle.contants.ts +4 -0
  240. package/src/constants/fb.constants.ts +7 -0
  241. package/src/constants/rule-input.contants.ts +3 -0
  242. package/src/enums/environment.enum.ts +5 -0
  243. package/src/enums/export-type.enum.ts +14 -0
  244. package/src/export.command.ts +35 -0
  245. package/src/export.schema.ts +67 -0
  246. package/src/exporters/as24.exporter.ts +70 -0
  247. package/src/exporters/auto24.exporter.ts +68 -0
  248. package/src/exporters/autouncle.exporter.ts +62 -0
  249. package/src/exporters/by-owner.exporter.ts +45 -0
  250. package/src/exporters/fb.exporter.ts +49 -0
  251. package/src/exporters/google.exporter.ts +48 -0
  252. package/src/exporters/meinstadt.exporter.ts +70 -0
  253. package/src/exporters/mobile.exporter.ts +113 -0
  254. package/src/exporters/ooyyo.exporter.ts +50 -0
  255. package/src/formats/auto24-xml.builder.ts +48 -0
  256. package/src/formats/autouncle-json.builder.ts +20 -0
  257. package/src/formats/fb-xml.builder.ts +71 -0
  258. package/src/formats/google-xml.builder.ts +35 -0
  259. package/src/formats/meinstadt-json.builder.ts +19 -0
  260. package/src/formats/ooyyo-xml.builder.ts +48 -0
  261. package/src/input.questions.ts +12 -0
  262. package/src/interfaces/description.interface.ts +24 -0
  263. package/src/interfaces/export-item.interface.ts +147 -0
  264. package/src/interfaces/exporter.interface.ts +3 -0
  265. package/src/interfaces/input.interface.ts +6 -0
  266. package/src/interfaces/mapping-rules.interface.ts +11 -0
  267. package/src/interfaces/params.interface.ts +19 -0
  268. package/src/interfaces/rule-parser.interface.ts +3 -0
  269. package/src/main.ts +9 -0
  270. package/src/rules/abstract.rule.ts +37 -0
  271. package/src/rules/date.rule.ts +18 -0
  272. package/src/rules/number.rule.ts +15 -0
  273. package/src/rules/string.rule.ts +8 -0
  274. package/src/services/car.service.ts +57 -0
  275. package/src/services/config.service.ts +15 -0
  276. package/src/services/loader.service.ts +30 -0
  277. package/src/services/mapping.service.ts +80 -0
  278. package/src/services/marketing-images.service.ts +67 -0
  279. package/src/services/request.service.ts +44 -0
  280. package/src/services/rules.service.ts +61 -0
  281. package/src/services/user.service.ts +52 -0
  282. package/src/transformers/as24.transformer.ts +225 -0
  283. package/src/transformers/auto24.transfomer.ts +155 -0
  284. package/src/transformers/autouncle.transformer.ts +264 -0
  285. package/src/transformers/by-owner.transformer.ts +364 -0
  286. package/src/transformers/fb-description.transformer.ts +316 -0
  287. package/src/transformers/fb-equipment.transformer.ts +161 -0
  288. package/src/transformers/fb.transformer.ts +640 -0
  289. package/src/transformers/google.transformer.ts +166 -0
  290. package/src/transformers/meinstadt.transformer.ts +80 -0
  291. package/src/transformers/mobile.transformer.ts +495 -0
  292. package/src/transformers/ooyyo.transformer.ts +123 -0
  293. package/src/utils/converter.utils.ts +11 -0
  294. package/src/utils/date-time.utils.ts +20 -0
  295. package/src/utils/parser.utils.ts +6 -0
  296. package/src/utils/validator.utils.ts +7 -0
  297. package/tsconfig.build.json +4 -0
  298. package/tsconfig.json +28 -34
  299. package/.prettierrc +0 -14
  300. package/dist/config/ConfigBuilder.d.ts +0 -5
  301. package/dist/config/ConfigBuilder.js +0 -90
  302. package/dist/config/ConfigBuilder.js.map +0 -1
  303. package/dist/config/index.d.ts +0 -1
  304. package/dist/config/index.js +0 -7
  305. package/dist/config/index.js.map +0 -1
  306. package/dist/index.d.ts +0 -1
  307. package/dist/index.js +0 -64
  308. package/dist/index.js.map +0 -1
  309. package/dist/interfaces/index.d.ts +0 -0
  310. package/dist/interfaces/index.js +0 -1
  311. package/dist/interfaces/index.js.map +0 -1
  312. package/dist/modules/acrhiver/TarArchiver.d.ts +0 -6
  313. package/dist/modules/acrhiver/TarArchiver.js +0 -52
  314. package/dist/modules/acrhiver/TarArchiver.js.map +0 -1
  315. package/dist/modules/acrhiver/index.d.ts +0 -2
  316. package/dist/modules/acrhiver/index.js +0 -7
  317. package/dist/modules/acrhiver/index.js.map +0 -1
  318. package/dist/modules/car-exporter/index.d.ts +0 -2
  319. package/dist/modules/car-exporter/index.js +0 -10
  320. package/dist/modules/car-exporter/index.js.map +0 -1
  321. package/dist/modules/car-loader/index.d.ts +0 -2
  322. package/dist/modules/car-loader/index.js +0 -12
  323. package/dist/modules/car-loader/index.js.map +0 -1
  324. package/index.js +0 -2
  325. package/readme.md +0 -7
  326. package/src/config/ConfigBuilder.ts +0 -91
  327. package/src/config/index.ts +0 -1
  328. package/src/index.ts +0 -62
  329. package/src/interfaces/index.ts +0 -0
  330. package/src/modules/acrhiver/TarArchiver.ts +0 -32
  331. package/src/modules/acrhiver/index.ts +0 -6
  332. package/src/modules/car-exporter/index.ts +0 -11
  333. package/src/modules/car-loader/index.ts +0 -10
  334. package/tslint.json +0 -51
  335. package/types/basic-ftp.d.ts +0 -72
@@ -0,0 +1,264 @@
1
+ import { TranslatorExtended } from '@bytebrand/schema-tools';
2
+ import { de, deVehicleDetailsPage, deVehicleProps } from '@bytebrand/i18n-dictionaries';
3
+ import { get, toString, isEmpty, toSafeInteger } from 'lodash';
4
+ import * as moment from 'moment';
5
+ import { DataSchemes } from '@bytebrand/car-schema';
6
+ import { DePostalCodesService } from '@bytebrand/car-basic-data-scope';
7
+ import { DePostalCodesEntryInterface } from '@bytebrand/car-basic-data-scope/dist/interfaces/DePostalCodesInterface';
8
+ import { ConfigService } from '../services/config.service';
9
+ import { Injectable } from '@nestjs/common';
10
+ import { DEFAULT_ADDR1, DEFAULT_CITY, DEFAULT_ZIP, MIN_MILEAGES } from '../constants/autouncle.contants';
11
+ import { AutouncleJsonItem } from '../interfaces/export-item.interface';
12
+ import { isNotEmptyArray } from '../utils/validator.utils';
13
+
14
+ @Injectable()
15
+ export class AutouncleTransformer {
16
+ private translator: TranslatorExtended;
17
+ private postalCodesService: DePostalCodesService;
18
+
19
+ constructor(private configService: ConfigService) {
20
+ const dict = { ...de, ...deVehicleProps, ...deVehicleDetailsPage };
21
+ this.translator = new TranslatorExtended(dict);
22
+ this.postalCodesService = DePostalCodesService.getInstance();
23
+ }
24
+
25
+ async transform({
26
+ car,
27
+ images,
28
+ owner,
29
+ }: {
30
+ car: DataSchemes.Car;
31
+ images: unknown[];
32
+ metadata?: unknown;
33
+ owner: unknown;
34
+ }): Promise<AutouncleJsonItem> {
35
+ const autodeId = toString(get(car, '_id', ''));
36
+ const address = await this.getAddress(car, owner);
37
+
38
+ return {
39
+ back_link: `https://www.${this.configService.config.url}/search/vehicle/${autodeId}?source=autouncle&medium=cpc&campaign=listing`,
40
+ make: toString(get(car, 'mainData.make', '')),
41
+ model_name: toString(get(car, 'mainData.model', '')),
42
+ model_variant: toString(get(car, 'mainData.subModel', '')),
43
+ fuel: this.mapFuel(car),
44
+ body: this.mapBodyStyle(car),
45
+ doors: toString(get(car, 'mainData.doors', '')),
46
+ price: this.getPrice(car),
47
+ year: toString(this.getYear(car)),
48
+ status: toString(this.getStatus(car)),
49
+ mileage: toString(this.getMileage(car)) + 'km',
50
+ leasing: toString(get(car, '', '')),
51
+ color: this.getExteriorColor(car),
52
+ engine_size: toString(get(car, 'engineData.cubicCapacity', '')) + 'ccm',
53
+ power: toString(get(car, 'engineData.powerKW', '')),
54
+ gear_type: this.mapTransmission(car),
55
+ has_4wd: this.has4WD(),
56
+ seller_type: 'Dealer',
57
+ seller_region: toString(get(address, 'region', '')),
58
+ seller_city: toString(get(address, 'city', '')),
59
+ seller_street_address: toString(get(address, 'addr1', '')),
60
+ seller_postcode: toString(get(address, 'postal_code', '')),
61
+ seller_name: 'auto.de',
62
+ seller_id: toString(get(car, 'metaData.ownerId', '')),
63
+ description: toString(get(car, 'offer.offerDescription', '')),
64
+ images: this.getImagesField(autodeId, get(car, 'metaData.mainImageId', null), images),
65
+ fuel_economy: toString(get(car, 'consumption.consumptionCombined', '')),
66
+ co2_emission: toString(get(car, 'environmentEmissions.co2', '')),
67
+ co2_effiency_class: toString(get(car, 'environmentEmissions.energyEfficiencyClass', '')),
68
+ euro_emission_class: toString(get(car, 'environmentEmissions.emissionClass', '')),
69
+ enviromental_sticker: toString(get(car, 'environmentEmissions.emissionSticker', '')),
70
+ };
71
+ }
72
+
73
+ private getStatus(car: DataSchemes.Car): 'Neuwagen' | 'Gebrauchtwagen' {
74
+ if (get(car, 'mainData.firstRegistration', 0) === 0) {
75
+ return 'Neuwagen';
76
+ }
77
+ return 'Gebrauchtwagen';
78
+ }
79
+
80
+ private getYear(car: DataSchemes.Car): number | '' {
81
+ const firstRegistration = get(car, 'mainData.firstRegistration', 0) as number;
82
+ if (firstRegistration !== 0) {
83
+ return toSafeInteger(moment(firstRegistration * 1000).format('YYYY'));
84
+ }
85
+ return '';
86
+ }
87
+
88
+ private mapBodyStyle(car: DataSchemes.Car): string {
89
+ const available = {
90
+ selector_unknown: 'Other',
91
+ selector_category_combi: 'Wagon',
92
+ selector_category_sedan: 'Sedan',
93
+ selector_category_compact: 'Small_car',
94
+ selector_category_coupe: 'Coupe',
95
+ selector_category_convertible: 'Convertible',
96
+ selector_category_suv: 'Suv',
97
+ selector_category_van: 'Van',
98
+ selector_category_transporter: 'Truck',
99
+ selector_category_minibus: 'Minivan',
100
+ };
101
+ const category = get(car, 'mainData.category', 'selector_unknown');
102
+ return get(available, category);
103
+ }
104
+
105
+ private mapFuel(car: DataSchemes.Car): string {
106
+ const available = {
107
+ selector_fuel_petrol: 'Gasoline',
108
+ selector_fuel_diesel: 'Diesel',
109
+ selector_fuel_electrical: 'Electric',
110
+ selector_fuel_hybridElectricalPetrol: 'Hybrid',
111
+ selector_fuel_hybridElectricalDiesel: 'Hybrid',
112
+ selector_fuel_carGas: 'CarGas',
113
+ selector_fuel_naturalGas: 'NaturalGas',
114
+ selector_fuel_ethanol: 'Ethanol',
115
+ selector_fuel_hydrogen: 'Hydrogen',
116
+ selector_unknown: 'Other',
117
+ };
118
+ const fuel = get(car, 'consumption.fuel', 'selector_unknown');
119
+ return get(available, fuel);
120
+ }
121
+
122
+ private mapTransmission(car: DataSchemes.Car): string {
123
+ const available = {
124
+ selector_gearbox_manualShift: 'manual',
125
+ selector_gearbox_semiAutomatic: 'automatic',
126
+ selector_gearbox_automatic: 'automatic',
127
+ selector_unknown: 'other',
128
+ };
129
+ const transmission = get(car, 'driveSuspension.gearbox', 'selector_unknown');
130
+ return get(available, transmission);
131
+ }
132
+
133
+ private getPrice(car: DataSchemes.Car): string {
134
+ const price = get(car, 'price.currentSalesPrice', '');
135
+ return `EUR ${price}`;
136
+ }
137
+
138
+ private async getAddress(
139
+ car: DataSchemes.Car,
140
+ owner: unknown,
141
+ ): Promise<{
142
+ city: string;
143
+ addr1: unknown;
144
+ region: string;
145
+ country: string;
146
+ postal_code: string;
147
+ latitude: number;
148
+ longitude: number;
149
+ }> {
150
+ let addressPath = 'businessAddress';
151
+ if (this.isEmptyAddress(get(owner, addressPath, {}))) {
152
+ addressPath = 'mainAddress';
153
+ }
154
+ let city: string = get(owner, `${addressPath}.city`, '');
155
+ let zip: string = get(owner, `${addressPath}.zip`, '');
156
+ let addr1 = get(owner, `${addressPath}.street`, '');
157
+ let locationEntity = await this.getLocationByInfo({ city, zip: toSafeInteger(zip) });
158
+
159
+ if (this.isEmptyLocation(locationEntity)) {
160
+ addr1 = DEFAULT_ADDR1;
161
+ city = DEFAULT_CITY;
162
+ zip = DEFAULT_ZIP;
163
+ locationEntity = await this.getLocationByInfo({ city, zip: toSafeInteger(zip) });
164
+ }
165
+
166
+ const coords = await this.getCoords(car, locationEntity);
167
+ const country: string = get(owner, `${addressPath}.country.name`, '');
168
+ return {
169
+ ...coords,
170
+ city,
171
+ addr1,
172
+ region: get(locationEntity, 'Place Name', 'Deutschland'),
173
+ country: country || 'Deutschland',
174
+ postal_code: zip,
175
+ };
176
+ }
177
+
178
+ private isEmptyLocation(location: DePostalCodesEntryInterface): boolean {
179
+ if (!location) return true;
180
+ return !location['Place Name'] || !(location.Latitude && location.Longitude);
181
+ }
182
+
183
+ private isEmptyAddress(address: unknown): boolean {
184
+ if (!address) return true;
185
+ return ['city', 'zip', 'country'].every((key: string) => isEmpty(address[key]));
186
+ }
187
+
188
+ private async getCoords(
189
+ car: DataSchemes.Car,
190
+ locationEntry: DePostalCodesEntryInterface,
191
+ ): Promise<Pick<DataSchemes.Location, 'latitude' | 'longitude'>> {
192
+ const data: Pick<DataSchemes.Location, 'latitude' | 'longitude'> = {
193
+ latitude: get(car, 'location.latitude'),
194
+ longitude: get(car, 'location.longitude'),
195
+ };
196
+
197
+ if (data.latitude && data.longitude) {
198
+ return data;
199
+ }
200
+
201
+ return {
202
+ longitude: get(locationEntry, 'Longitude'),
203
+ latitude: get(locationEntry, 'Latitude'),
204
+ };
205
+ }
206
+
207
+ private async getLocationByInfo(info: { zip: number; city: string }): Promise<DePostalCodesEntryInterface> {
208
+ let entry: DePostalCodesEntryInterface = await this.postalCodesService.getLocationByPostalCode(info.zip);
209
+
210
+ if (!entry) {
211
+ entry = await this.postalCodesService.getLocationByCity(info.city);
212
+ }
213
+ return entry;
214
+ }
215
+
216
+ private getExteriorColor(car: DataSchemes.Car): string {
217
+ let colorSelection = get(car, 'exterior.exteriorColor', 'other');
218
+ if (!colorSelection || colorSelection === 'selector_unknown') {
219
+ colorSelection = 'other';
220
+ }
221
+ return this.translator.translateVal(colorSelection);
222
+ }
223
+
224
+ private getMileage(car: DataSchemes.Car): number {
225
+ const mileage = get(car, 'mainData.mileage', 0);
226
+ return mileage <= MIN_MILEAGES ? MIN_MILEAGES + 1 : mileage;
227
+ }
228
+
229
+ private has4WD(): string {
230
+ return '';
231
+ }
232
+
233
+ private getImagesField(carId: string, mainImageId: string, images: unknown[]): { url: string }[] {
234
+ const defImages = [
235
+ { url: 'https://images.auto.de/carimage/noimage/7pNvWELuWhZX/large-cached.jpeg' },
236
+ { url: 'https://images.auto.de/carimage/noimage/GvyXmrpaf1D6/large-cached.jpeg' },
237
+ { url: 'https://images.auto.de/carimage/noimage/gY1zF8PXzH2W/large-cached.jpeg' },
238
+ { url: 'https://images.auto.de/carimage/noimage/pFyfBsqBHEso/large-cached.jpeg' },
239
+ ];
240
+ if (isNotEmptyArray(images)) {
241
+ const imageList = images.sort(this.setMainImageFirst(mainImageId)).map((image: any) => {
242
+ return { url: this.buildLargeImageUrl(carId, image.imageIdentifier) };
243
+ });
244
+
245
+ if (imageList.length < 17) {
246
+ imageList.push(...defImages);
247
+ }
248
+ return imageList;
249
+ }
250
+ return defImages;
251
+ }
252
+
253
+ private buildLargeImageUrl(carId: string, imageId: string): string {
254
+ return `${this.configService.config.imageUrl}/carimage/${carId}/${imageId}/large`;
255
+ }
256
+
257
+ private setMainImageFirst(mainImageId: string): (current: any, next: any) => number {
258
+ return (current: any, next: any): number => {
259
+ if (current.imageIdentifier === mainImageId) return -1;
260
+ if (next.imageIdentifier === mainImageId) return 1;
261
+ return 0;
262
+ };
263
+ }
264
+ }
@@ -0,0 +1,364 @@
1
+ import { get, toString, trim, toSafeInteger, toNumber, isString } from 'lodash';
2
+ import { Translator, TranslatorExtended } from '@bytebrand/schema-tools';
3
+ import { de, deVehicleDetailsPage, deVehicleProps } from '@bytebrand/i18n-dictionaries';
4
+ import { DataSchemes } from '@bytebrand/car-schema';
5
+ import { Injectable } from '@nestjs/common';
6
+ import { normalizeRateObject, getMonthlyInstallment, getComputedFinancing } from '@bytebrand/fe-financing';
7
+ import * as moment from 'moment';
8
+
9
+ type transformFn = (car: DataSchemes.Car, translator: TranslatorExtended) => string;
10
+
11
+ @Injectable()
12
+ export class ByOwnerTransformer {
13
+ private readonly translator: TranslatorExtended = new TranslatorExtended({
14
+ ...de,
15
+ ...deVehicleProps,
16
+ ...deVehicleDetailsPage,
17
+ });
18
+
19
+ transform(car: DataSchemes.Car, index: number): unknown {
20
+ const mapping = {
21
+ UID: '',
22
+ ID: '_id',
23
+ autode_ID: 'metaData.vehicleId',
24
+
25
+ price: 'price.currentSalesPrice',
26
+ '(old price) strike price': 'price.wasPrice',
27
+ rate: (car: DataSchemes.Car) => {
28
+ const { rate } = normalizeRateObject({ ...car });
29
+ return getMonthlyInstallment(rate);
30
+ },
31
+ 'discount in %': this.mapToNumber('price.historyPriceDifferencePerCent', 1, 0),
32
+ 'discount in €': this.mapToNumber('price.historyPriceDifference', 1, 0),
33
+ 'first_installment in €': (car: DataSchemes.Car) => {
34
+ const { rate } = normalizeRateObject({ ...car });
35
+ const price = getComputedFinancing(rate) as ReturnType<typeof getComputedFinancing> & {
36
+ firstInstallment: number;
37
+ };
38
+ return price.firstInstallment;
39
+ },
40
+ 'amount of month': (car: DataSchemes.Car) => {
41
+ const { rate } = normalizeRateObject({ ...car });
42
+ return rate.paybackPeriod;
43
+ },
44
+
45
+ Name: (car: DataSchemes.Car): string => {
46
+ const make = toString(get(car, 'mainData.make', ''));
47
+ const model = toString(get(car, 'mainData.model', ''));
48
+ const subModel = toString(get(car, 'mainData.subModel', ''));
49
+ return trim([make, model, subModel].join(' '));
50
+ },
51
+ make: 'mainData.make',
52
+ model: 'mainData.model',
53
+ Name_Sonderserie: 'mainData.subModel',
54
+ PS: 'engineData.powerPS',
55
+ EngineVolume: this.mapToNumber('engineData.cubicCapacity'),
56
+
57
+ consumptioncombined_Benzin: this.mapToValueDependOnPath(
58
+ 'consumption.consumptionCombined',
59
+ 'consumption.fuel',
60
+ 'selector_fuel_petrol',
61
+ ),
62
+ consumptioncombined_Diesel: this.mapToValueDependOnPath(
63
+ 'consumption.consumptionCombined',
64
+ 'consumption.fuel',
65
+ 'selector_fuel_diesel',
66
+ ),
67
+ 'consumptioncombined_Hybrid(Elektro/Benzin)': this.mapToValueDependOnPath(
68
+ 'consumption.consumptionCombined',
69
+ 'consumption.fuel',
70
+ 'selector_fuel_hybridElectricalPetrol',
71
+ ),
72
+ 'consumptioncombined_Hybrid(Elektro/Diesel)': this.mapToValueDependOnPath(
73
+ 'consumption.consumptionCombined',
74
+ 'consumption.fuel',
75
+ 'selector_fuel_hybridElectricalDiesel',
76
+ ),
77
+ consumptioncombined_Gemisch: this.mapToValueDependOnPath(
78
+ 'consumption.consumptionCombined',
79
+ 'consumption.fuel',
80
+ 'selector_fuel_ethanol',
81
+ ),
82
+ consumptioncombined_Erdgas: this.mapToValueDependOnPath(
83
+ 'consumption.consumptionCombined',
84
+ 'consumption.fuel',
85
+ 'selector_fuel_naturalGas',
86
+ ),
87
+ consumptioncombined_Elektro: this.mapToValueDependOnPath(
88
+ 'consumption.consumptionCombined',
89
+ 'consumption.fuel',
90
+ 'selector_fuel_electrical',
91
+ ),
92
+ consumptioncombined_Autogas: this.mapToValueDependOnPath(
93
+ 'consumption.consumptionCombined',
94
+ 'consumption.fuel',
95
+ 'selector_fuel_carGas',
96
+ ),
97
+ consumptioncombined_Ethanol: this.mapToValueDependOnPath(
98
+ 'consumption.consumptionCombined',
99
+ 'consumption.fuel',
100
+ 'selector_fuel_hydrogen',
101
+ ),
102
+ consumptioncombined_Wasserstoff: '',
103
+
104
+ constructionYear: 'mainData.constructionYear',
105
+ first_registration: (car: DataSchemes.Car) => {
106
+ const val = get(car, 'mainData.firstRegistration');
107
+ return moment(toSafeInteger(val) * 1000).format('MM/YYYY');
108
+ },
109
+ Condition_New: this.mapToValue('mainData.condition', 'selector_condition_new', 'Neuwagen'),
110
+ Condition_Used: this.mapToValue('mainData.condition', 'selector_condition_used', 'Gebraucht'),
111
+ Mileage: 'mainData.mileage',
112
+ Amount_Owner: this.mapToNumber('mainData.numberOfPreviousOwners', 1, 0),
113
+ highSpeed: 'engineData.highSpeed',
114
+ cylinders: 'engineData.cylinders',
115
+
116
+ cylinders_word: (car: DataSchemes.Car) => {
117
+ const map = {
118
+ 1: 'Ein',
119
+ 2: 'Zwei',
120
+ 3: 'Drei',
121
+ 4: 'Vier',
122
+ 5: 'Fünf',
123
+ 6: 'Sechs',
124
+ 7: 'Sieben',
125
+ 8: 'Acht',
126
+ 9: 'Neun',
127
+ 10: 'Zehn',
128
+ 12: 'Zwölf',
129
+ 14: 'Vierzehn',
130
+ 16: 'Sechzehn',
131
+ };
132
+
133
+ const cylinders = get(car, 'engineData.cylinders');
134
+ if (!cylinders) {
135
+ return '';
136
+ }
137
+
138
+ return map[toSafeInteger(cylinders)];
139
+ },
140
+
141
+ Drivetype_Heckantrieb: this.mapToValue(
142
+ 'driveSuspension.driveType',
143
+ 'selector_driveType_rearWheelDrive',
144
+ 'Heckantrieb',
145
+ ),
146
+ Drivetype_Frontantrieb: this.mapToValue(
147
+ 'driveSuspension.driveType',
148
+ 'selector_driveType_frontWheelDrive',
149
+ 'Frontantrieb',
150
+ ),
151
+ Drivetype_allrad: this.mapToValue('driveSuspension.driveType', 'selector_driveType_allWheelDrive', 'Allrad'),
152
+ weight: this.mapToNumber('sizeVolumeWeight.emptyWeight'),
153
+ length: this.mapToNumber('sizeVolumeWeight.length', 10, 1),
154
+ gearbox_manuell: this.mapToValue('driveSuspension.gearbox', 'selector_gearbox_manualShift', 'Handschaltung'),
155
+ gearbox_automatik: this.mapToValue('driveSuspension.gearbox', 'selector_gearbox_automatic', 'Automatik'),
156
+ gearbox_semiAutomatik: this.mapToValue(
157
+ 'driveSuspension.gearbox',
158
+ 'selector_gearbox_semiAutomatic',
159
+ 'Semi Automatik',
160
+ ),
161
+ gearbox_unknown: this.mapToValue('driveSuspension.gearbox', 'selector_unknown', 'unknown'),
162
+
163
+ acceleration100: 'engineData.acceleration100',
164
+
165
+ gears_automatik: (car: DataSchemes.Car) => {
166
+ const box = get(car, 'driveSuspension.gearbox');
167
+ if (box === 'selector_gearbox_automatic' || box === 'selector_gearbox_semiAutomatic') {
168
+ return get(car, 'driveSuspension.gears');
169
+ }
170
+ return '';
171
+ },
172
+ gears_Manuell: (car: DataSchemes.Car) => {
173
+ const box = get(car, 'driveSuspension.gearbox');
174
+ if (box === 'selector_gearbox_manualShift') {
175
+ return get(car, 'driveSuspension.gears');
176
+ }
177
+ return '';
178
+ },
179
+ fuel_Benzin: this.mapToValue('consumption.fuel', 'selector_fuel_petrol', 'Benzin'),
180
+ fuel_Diesel: this.mapToValue('consumption.fuel', 'selector_fuel_diesel', 'Diesel'),
181
+ 'fuel_Hybrid (Elektro/Benzin)': this.mapToValue(
182
+ 'consumption.fuel',
183
+ 'selector_fuel_hybridElectricalPetrol',
184
+ 'Hybrid (Elektro/Benzin)',
185
+ ),
186
+ 'fuel_Hybrid (Elektro/Diesel)': this.mapToValue(
187
+ 'consumption.fuel',
188
+ 'selector_fuel_hybridElectricalDiesel',
189
+ 'Hybrid (Elektro/Diesel)',
190
+ ),
191
+ fuel_Elektro: this.mapToValue('consumption.fuel', 'selector_fuel_electrical', 'Elektro'),
192
+ fuel_autogas: this.mapToValue('consumption.fuel', 'selector_fuel_carGas', 'autogas'),
193
+ fuel_Erdgas: this.mapToValue('consumption.fuel', 'selector_fuel_naturalGas', 'Erdgas'),
194
+ fuel_Ethanol: this.mapToValue('consumption.fuel', 'selector_fuel_ethanol', 'Ethanol'),
195
+ fuel_Gemisch: this.mapToValue('consumption.fuel', 'selector_fuel_hydrogen', 'Ethanol'),
196
+ fuel_unknown: this.mapToValue('consumption.fuel', 'selector_unknown', 'unknown'),
197
+ CO2: 'environmentEmissions.co2',
198
+ doors: 'mainData.doors',
199
+ seats: 'mainData.seats',
200
+ category_Kleinwagen: this.mapToValue('mainData.category', 'selector_category_compact', 'Kleinwagen'),
201
+ Category_Limousine: this.mapToValue('mainData.category', 'selector_category_sedan', 'Limousine'),
202
+ category_Kombi: this.mapToValue('mainData.category', 'selector_category_combi', 'Kombi'),
203
+ 'category_SUV/Geländewagen': this.mapToValue('mainData.category', 'selector_category_suv', 'SUV'),
204
+ category_Transporter: this.mapToValue('mainData.category', 'selector_category_transporter', 'Transporter'),
205
+ // tslint:disable-next-line
206
+ category_Coupé: this.mapToValue('mainData.category', 'selector_category_coupe', 'Coupé'),
207
+ Category_cabrio: this.mapToValue('mainData.category', 'selector_category_convertible', 'cabrio'),
208
+ category_Pickup: this.mapToValue('mainData.category', 'selector_category_transporter', 'Pickup'),
209
+ category_Van: this.mapToValue('mainData.category', 'selector_category_van|selector_category_minibus', 'Van'),
210
+ torque_in_norm: 'engineData.torque',
211
+ count_of_airbags: 'airbags.airbagCount',
212
+ Fahrer_Airbag: this.checkInArray('airbags.airbag', 'selector_airbag_driver', 'Fahrerairbag'),
213
+ Beifahrer_Airbag: this.checkInArray('airbags.airbag', 'selector_airbag_passenger', 'Beifahrerairbag'),
214
+ Kopf_Airbag: this.checkInArray('airbags.airbag', 'selector_airbag_head', 'Kopfairbag'),
215
+ ABS: this.checkBoolean('assistants.abs', 'ABS'),
216
+ ESP: this.checkBoolean('assistants.esp', 'ESP'),
217
+ Traktionskontrolle: this.checkBoolean('assistants.tractionControlSystem', 'Traktionskontrolle'),
218
+ Spurhalteassistent: this.checkBoolean('assistants.laneAssistant', 'Spurhalteassistent'),
219
+ Spurwechselassistent: this.checkBoolean('assistants.laneAssistant', 'Spurwechselassistent'),
220
+ 'Bi-Xenon_Licht': this.checkBoolean('lights.xenonHeadlights', 'Bi-Xenon-Licht'),
221
+ Tagfahrlicht: this.checkBoolean(
222
+ 'lights.daytimeRunningLights|lights.daytimeRunningLightsLED',
223
+ 'Spurhalteassistent',
224
+ ),
225
+ 'LED-Scheinwerfer': this.checkBoolean('lights.daytimeRunningLightsLED', 'LED-Scheinwerfer'),
226
+ 'LED Nebel': this.checkBoolean('lights.frontFogLights', 'LED-Nebelscheinwerfer'),
227
+ Xenon: this.checkBoolean('lights.xenonHeadlights', 'Xenonscheinwerfer'),
228
+ Servolenkung: this.checkBoolean('assistants.powerAssistedSteering', 'Servolenkung'),
229
+ Zentralverriegelung: this.checkBoolean('doors.centralLocking', 'Zentralverriegelung'),
230
+ Keyless_Go: this.checkBoolean('doors.keylessEntry', 'Keyless-Go'),
231
+ elektrische_Heckklappe: this.checkBoolean('doors.electricTailGate', 'elektrische Heckklappe'),
232
+ Klimaanlage: this.checkBoolean('climatisation.selector_none', 'Klimaanlage', false),
233
+ Klimaautomatik: this.checkBoolean('climatisation.selector_climatisation_automaticAirCondition', 'Klimaautomatik'),
234
+ '2_Zonen_Klimautomatik': this.checkBoolean(
235
+ 'climatisation.selector_climatisation_automaticAirCondition',
236
+ '2-Zonen-Klimautomatik',
237
+ ),
238
+ '3_Zonen_Klimaautomatik': this.checkBoolean(
239
+ 'climatisation.selector_climatisation_automaticAirCondition',
240
+ '3-Zonen-Klimaautomatik',
241
+ ),
242
+ '4_Zonen_Klimaautomatik': this.checkBoolean(
243
+ 'climatisation.selector_climatisation_automaticAirCondition',
244
+ '4-Zonen-Klimaautomatik',
245
+ ),
246
+ Multifunktionslenkrad: this.checkBoolean('wheel.multifunctionalWheel', 'Multifunktionslenkrad'),
247
+ Lenkradheizung: this.checkBoolean('wheel.heatedSteeringWheel', 'Lenkradheizung'),
248
+ Sitzheizung: this.checkBoolean('heatingCooling.auxiliaryHeating', 'Ja'),
249
+ Navigationssystem: this.checkBoolean('multimedia.navigationSystem', 'Navigationssystem'),
250
+ Sprachsteuerung: this.checkBoolean('multimedia.voiceControl', 'Sprachsteuerung'),
251
+ Start_Stop_Automatik: this.checkBoolean('engineData.startStopSystem', 'Start/Stop-Automatik'),
252
+ USB_Anschluss: this.checkBoolean('multimedia.usbInterface', 'USB-Anschluss'),
253
+ 'USB_Schnittstelle /Bluetooth': this.checkBoolean('multimedia.bluetooth', 'USB_Schnittstelle /Bluetooth'),
254
+ max_emission_category: this.mapSelection('environmentEmissions.emissionClass'),
255
+ Seitenairbag:
256
+ this.checkInArray('airbags.airbag', 'selector_airbag_frontSideAndOther', 'Seitenairbag') ||
257
+ this.checkInArray('airbags.airbag', 'selector_airbag_frontAndSide', 'Seitenairbag'),
258
+ min_tank: 'sizeVolumeWeight.fuelCapacity',
259
+ Varnish: this.mapSelection('exterior.exteriorColor'),
260
+ Varnish_make: 'exterior.manufacturerColorName',
261
+ Interieur_Color: this.mapSelection('interior.interiorColor'),
262
+ Upholstery: this.mapSelection('interior.interiorType'),
263
+ accident_free: this.checkBoolean('mainData.accidentDamaged', 'Unfallfrei', false),
264
+ not_accident_free: this.checkBoolean('mainData.accidentDamaged', 'Beschädigt'),
265
+ Availability: (car: DataSchemes.Car) => {
266
+ const val = get(car, 'offer.availabilityMode');
267
+ if (val === 'selector_availabilityMode_always') return 'Sofort';
268
+ const date = get(car, 'offer.availabilityFrom');
269
+ return moment(toSafeInteger(date) * 1000).format('DD.MM.YYYY');
270
+ },
271
+ Parkassistent: (car: DataSchemes.Car) => {
272
+ const parks = get(car, 'assistants.parkingAssistants', []).filter(
273
+ (selector: string) => selector !== 'selector_unknown',
274
+ );
275
+ return parks.length ? 'Parkassistent' : '';
276
+ },
277
+ Freisprechanlage: this.checkBoolean('multimedia.handsFreePhoneSystem', 'Freisprechanlage'),
278
+ Car_Play: this.checkBoolean('multimedia.carplay', 'Car Play'),
279
+ Garantie: this.checkBoolean('offer.warranty', 'Garantie'),
280
+ Scheckheftgepflegt: this.checkBoolean('careService.fullServiceHistory', 'Scheckheftgepflegt'),
281
+ Regensenor: this.checkBoolean('assistants.automaticRainSensor', 'Regensenor'),
282
+ Tempomat: this.checkBoolean('assistants.cruiseControl', 'Tempomat'),
283
+ Panoramaschiebedach: this.checkBoolean('window.panoramaFrontWindow', 'Panoramaschiebedach'),
284
+ HU_Date: (car: DataSchemes.Car) => {
285
+ const date = get(car, 'careService.generalInspection');
286
+ if (!date) {
287
+ return '';
288
+ }
289
+ return moment(toSafeInteger(date) * 1000).format('DD.MM.YYYY');
290
+ },
291
+ Abstandsregeltempomat: this.checkBoolean('assistants.adaptiveCruiseControl', 'Abstandsregeltempomat'),
292
+ Verkehrszeichen_Erkennung: this.checkBoolean('assistants.trafficSignRecognition', 'Verkehrszeichen-Erkennung'),
293
+ };
294
+
295
+ return Object.entries(mapping)
296
+ .reverse()
297
+ .reduce(
298
+ (transformed, [key, value]) => {
299
+ return { [key]: this.transformValue(car, value as string), ...transformed };
300
+ },
301
+ { UID: index },
302
+ );
303
+ }
304
+
305
+ private transformValue(car: DataSchemes.Car, value: string | transformFn): unknown {
306
+ if (isString(value)) {
307
+ return get(car, value);
308
+ }
309
+ return value(car, this.translator);
310
+ }
311
+
312
+ private mapToValue(path: string, selection: string, value: string): (car: DataSchemes.Car) => string {
313
+ return (car: DataSchemes.Car) => {
314
+ const cond = get(car, path);
315
+ const selections = selection.split('|');
316
+ return selections.some(sel => sel === cond) ? value : '';
317
+ };
318
+ }
319
+
320
+ private mapToNumber(path: string, divider = 1000, toFix = 1): (car: DataSchemes.Car) => number | '' {
321
+ return (car: DataSchemes.Car) => {
322
+ const data = get(car, path);
323
+ const value = toNumber((toSafeInteger(data) / divider).toFixed(toFix));
324
+ return value > 0.0 ? value : '';
325
+ };
326
+ }
327
+
328
+ private mapToValueDependOnPath(
329
+ valuePath: string,
330
+ conditionPath: string,
331
+ selection: string,
332
+ ): (car: DataSchemes.Car) => any {
333
+ return (car: DataSchemes.Car) => {
334
+ const value = get(car, valuePath);
335
+ const cond = get(car, conditionPath);
336
+ return cond === selection ? value : '';
337
+ };
338
+ }
339
+
340
+ private checkBoolean(path: string, value: string, boolean = true): (car: DataSchemes.Car) => string {
341
+ return (car: DataSchemes.Car) => {
342
+ return path
343
+ .split('|')
344
+ .map(path => get(car, path))
345
+ .some(cond => cond === boolean)
346
+ ? value
347
+ : '';
348
+ };
349
+ }
350
+
351
+ private checkInArray(path: string, selector: string, value: string): (car: DataSchemes.Car) => string {
352
+ return (car: DataSchemes.Car) => {
353
+ const cond = get(car, path) as string[];
354
+ return cond.some((sel: string) => sel === selector) ? value : '';
355
+ };
356
+ }
357
+
358
+ private mapSelection(path: string): (car: DataSchemes.Car, translator: Translator) => any {
359
+ return (car: DataSchemes.Car, translator: Translator) => {
360
+ const selection = get(car, path);
361
+ return translator.translateVal(selection);
362
+ };
363
+ }
364
+ }