@bytebrand/export-cars 1.26.18 → 1.26.20

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 (41) hide show
  1. package/dist/configs/facebook-shop.config.js +1 -1
  2. package/dist/configs/facebook-shop.config.js.map +1 -1
  3. package/dist/configs/fb.config.js +1 -1
  4. package/dist/configs/fb.config.js.map +1 -1
  5. package/dist/configs/google.config.js +1 -1
  6. package/dist/configs/google.config.js.map +1 -1
  7. package/dist/constants/feed-price.constants.d.ts +1 -0
  8. package/dist/constants/feed-price.constants.js +4 -1
  9. package/dist/constants/feed-price.constants.js.map +1 -1
  10. package/dist/interfaces/params.interface.d.ts +1 -0
  11. package/dist/transformers/auto24.transfomer.js +1 -1
  12. package/dist/transformers/auto24.transfomer.js.map +1 -1
  13. package/dist/transformers/autouncle.transformer.js +1 -1
  14. package/dist/transformers/autouncle.transformer.js.map +1 -1
  15. package/dist/transformers/awin.transformer.js +1 -1
  16. package/dist/transformers/awin.transformer.js.map +1 -1
  17. package/dist/transformers/criteo.transformer.js +1 -1
  18. package/dist/transformers/criteo.transformer.js.map +1 -1
  19. package/dist/transformers/google.transformer.js +1 -1
  20. package/dist/transformers/google.transformer.js.map +1 -1
  21. package/dist/transformers/mobile.transformer.js +3 -2
  22. package/dist/transformers/mobile.transformer.js.map +1 -1
  23. package/dist/transformers/rubrikk.transformer.js +1 -1
  24. package/dist/transformers/rubrikk.transformer.js.map +1 -1
  25. package/dist/transformers/santander.transformer.js +3 -2
  26. package/dist/transformers/santander.transformer.js.map +1 -1
  27. package/dist/tsconfig.build.tsbuildinfo +1 -1
  28. package/package.json +1 -1
  29. package/src/configs/facebook-shop.config.ts +2 -2
  30. package/src/configs/fb.config.ts +2 -2
  31. package/src/configs/google.config.ts +2 -2
  32. package/src/constants/feed-price.constants.ts +7 -0
  33. package/src/interfaces/params.interface.ts +3 -0
  34. package/src/transformers/auto24.transfomer.ts +2 -1
  35. package/src/transformers/autouncle.transformer.ts +2 -1
  36. package/src/transformers/awin.transformer.ts +2 -1
  37. package/src/transformers/criteo.transformer.ts +2 -1
  38. package/src/transformers/google.transformer.ts +8 -1
  39. package/src/transformers/mobile.transformer.ts +6 -2
  40. package/src/transformers/rubrikk.transformer.ts +2 -1
  41. package/src/transformers/santander.transformer.ts +6 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bytebrand/export-cars",
3
- "version": "1.26.18",
3
+ "version": "1.26.20",
4
4
  "description": "",
5
5
  "author": "bytebrand",
6
6
  "license": "UNLICENSED",
@@ -1,13 +1,13 @@
1
1
  import { Params } from '../interfaces/params.interface';
2
2
  import { Config } from './config';
3
3
  import { ExportType, FileType } from '../enums';
4
- import { MAX_FEED_SALES_PRICE_EUR } from '../constants/feed-price.constants';
4
+ import { resolveMaxFeedSalesPrice } from '../constants/feed-price.constants';
5
5
 
6
6
  export class FacebookShopConfig extends Config {
7
7
  constructor(params: Params) {
8
8
  super(params);
9
9
  this.pathesConfig.localConvertedDirectory = `resources/${ExportType.FACEBOOK_SHOP}-export`;
10
- this.maxCurrentSalesPrice = MAX_FEED_SALES_PRICE_EUR;
10
+ this.maxCurrentSalesPrice = resolveMaxFeedSalesPrice(params.maxCurrentSalesPrice);
11
11
  this.imageUrl = this.environmentConfig[params.environment].baseImageUrl;
12
12
  this.outputFiles = [
13
13
  `${this.pathesConfig.localConvertedDirectory}/api_export_cars_${ExportType.FACEBOOK_SHOP}.${FileType.XML}`,
@@ -1,5 +1,5 @@
1
1
  import { ExportType, FileType, ImageType } from 'src/enums';
2
- import { MAX_FEED_SALES_PRICE_EUR } from '../constants/feed-price.constants';
2
+ import { resolveMaxFeedSalesPrice } from '../constants/feed-price.constants';
3
3
  import { Params } from '../interfaces/params.interface';
4
4
  import { Config } from './config';
5
5
 
@@ -7,7 +7,7 @@ export class FbConfig extends Config {
7
7
  constructor(params: Params) {
8
8
  super(params);
9
9
  this.pathesConfig.localConvertedDirectory = `resources/${ExportType.FB}-export`;
10
- this.maxCurrentSalesPrice = MAX_FEED_SALES_PRICE_EUR;
10
+ this.maxCurrentSalesPrice = resolveMaxFeedSalesPrice(params.maxCurrentSalesPrice);
11
11
  this.imageUrl = this.environmentConfig[params.environment].imageUrl;
12
12
  this.imageType = ImageType.marketing;
13
13
  this.marketingImageConfigId = this.environmentConfig[params.environment].fbMarketingImageId;
@@ -1,5 +1,5 @@
1
1
  import { ExportType, FileType, ImageType } from 'src/enums';
2
- import { MAX_FEED_SALES_PRICE_EUR } from '../constants/feed-price.constants';
2
+ import { resolveMaxFeedSalesPrice } from '../constants/feed-price.constants';
3
3
  import { Params } from '../interfaces/params.interface';
4
4
  import { Config } from './config';
5
5
 
@@ -8,7 +8,7 @@ export class GoogleConfig extends Config {
8
8
  super(params);
9
9
  this.pathesConfig.localConvertedDirectory = `resources/${ExportType.GOOGLE}-export`;
10
10
  this.imageType = ImageType.default;
11
- this.maxCurrentSalesPrice = MAX_FEED_SALES_PRICE_EUR;
11
+ this.maxCurrentSalesPrice = resolveMaxFeedSalesPrice(params.maxCurrentSalesPrice);
12
12
  this.outputFiles = [
13
13
  `${this.pathesConfig.localConvertedDirectory}/api_export_cars_${ExportType.GOOGLE}.${FileType.XML}`,
14
14
  ];
@@ -1,4 +1,11 @@
1
+ import { toNumber } from 'lodash';
2
+
1
3
  // Shared eligibility cap for the Google Vehicle Ads and Meta AIA/AMA feeds:
2
4
  // only cars whose end-customer selling price (price.currentSalesPrice) is
3
5
  // ≤ €80,000 may be exported. €80,000.00 itself is still included.
4
6
  export const MAX_FEED_SALES_PRICE_EUR = 80_000;
7
+
8
+ // The Cronicle "Max currentSalesPrice" plugin param (a text field) can override
9
+ // the default cap per event; empty/invalid/non-positive values fall back to it.
10
+ export const resolveMaxFeedSalesPrice = (raw?: string): number =>
11
+ toNumber(raw) > 0 ? toNumber(raw) : MAX_FEED_SALES_PRICE_EUR;
@@ -11,4 +11,7 @@ export interface Params {
11
11
  cpc?: string;
12
12
  ownerId?: string;
13
13
  metaPushPriorityCsvUrl?: string;
14
+ // Cronicle plugin param (text field, so it arrives as a string); overrides the
15
+ // default MAX_FEED_SALES_PRICE_EUR cap in the configs that apply one.
16
+ maxCurrentSalesPrice?: string;
14
17
  }
@@ -41,7 +41,8 @@ export class Auto24Transformer {
41
41
  fueltype: this.translateSelector(get(car, 'consumption.fuel', '')),
42
42
  consumptionK: toString(get(car, 'consumption.consumptionCombined', '')),
43
43
  co2: toString(get(car, 'environmentEmissions.co2', '')),
44
- efficiencyclass: this.translateSelector(get(car, 'environmentEmissions.energyEfficiencyClass', '')),
44
+ // ADV-187: canonical CO2-derived WLTP class, not the unvalidated legacy NEFZ class.
45
+ efficiencyclass: this.translateSelector(get(car, 'environmentEmissions.wltpEnergyEfficiencyClass', '')),
45
46
  image: transformedImages[0],
46
47
  registration: this.getRegistrationField(get(car, 'mainData.firstRegistration') as number),
47
48
  images: transformedImages,
@@ -68,7 +68,8 @@ export class AutouncleTransformer {
68
68
  images: transformed_images,
69
69
  fuel_economy: toString(get(car, 'consumption.consumptionCombined', '')),
70
70
  co2_emission: toString(get(car, 'environmentEmissions.co2', '')),
71
- co2_effiency_class: toString(get(car, 'environmentEmissions.energyEfficiencyClass', '')),
71
+ // ADV-187: canonical CO2-derived WLTP class, not the unvalidated legacy NEFZ class.
72
+ co2_effiency_class: toString(get(car, 'environmentEmissions.wltpEnergyEfficiencyClass', '')),
72
73
  euro_emission_class: toString(get(car, 'environmentEmissions.emissionClass', '')),
73
74
  enviromental_sticker: toString(get(car, 'environmentEmissions.emissionSticker', '')),
74
75
  };
@@ -171,7 +171,8 @@ export class AwinTransformer {
171
171
  selector_energyEfficiencyClass_g: 'G',
172
172
  selector_unknown: '',
173
173
  };
174
- const energyClass = get(car, 'environmentEmissions.energyEfficiencyClass', 'selector_unknown');
174
+ // ADV-187: canonical CO2-derived WLTP class, not the unvalidated legacy NEFZ class.
175
+ const energyClass = get(car, 'environmentEmissions.wltpEnergyEfficiencyClass', 'selector_unknown');
175
176
  return get(available, energyClass);
176
177
  }
177
178
 
@@ -140,7 +140,8 @@ export class CriteoTransformer {
140
140
  selector_energyEfficiencyClass_g: 'G',
141
141
  selector_unknown: 'default',
142
142
  };
143
- const energyClass = get(car, 'environmentEmissions.energyEfficiencyClass', 'selector_unknown');
143
+ // ADV-187: canonical CO2-derived WLTP class, not the unvalidated legacy NEFZ class.
144
+ const energyClass = get(car, 'environmentEmissions.wltpEnergyEfficiencyClass', 'selector_unknown');
144
145
  return get(available, energyClass);
145
146
  }
146
147
 
@@ -288,8 +288,15 @@ export class GoogleTransformer {
288
288
  return value ? value.replace(/\+/g, '') : '';
289
289
  }
290
290
 
291
+ // ADV-187: the canonical (legally defined, CO2-derived) class lives in
292
+ // wltpEnergyEfficiencyClass — same field the website, PDF exposé and the
293
+ // Facebook feed use. The legacy NEFZ `energyEfficiencyClass` is a different
294
+ // (mass-relative) scale and is NOT validated against CO2, so it must not
295
+ // feed the BMWK Vehicle_CO2_Class certification. No fallback to the legacy
296
+ // field on purpose: an unknown WLTP class omits the certification instead of
297
+ // publishing an unvalidated one.
291
298
  private getEnergyClass(car: DataSchemes.Car): string {
292
- return this.mapEnergyClass(get(car, 'environmentEmissions.energyEfficiencyClass', 'selector_unknown'));
299
+ return this.mapEnergyClass(get(car, 'environmentEmissions.wltpEnergyEfficiencyClass', 'selector_unknown'));
293
300
  }
294
301
 
295
302
  private getDischargedEnergyClass(car: DataSchemes.Car): string {
@@ -258,8 +258,11 @@ export class MobileTransformer {
258
258
  }
259
259
  }
260
260
 
261
+ // ADV-187: export the canonical CO2-derived WLTP class (not the unvalidated
262
+ // legacy NEFZ class) and never invent one — an unknown class is exported
263
+ // empty instead of the former hard-coded 'C'.
261
264
  private getEnergyEfficiencyClass(car: DataSchemes.Car): string {
262
- const energyEfficiencyClass = get(car, 'environmentEmissions.energyEfficiencyClass', 'selector_unknown');
265
+ const energyEfficiencyClass = get(car, 'environmentEmissions.wltpEnergyEfficiencyClass', 'selector_unknown');
263
266
  switch (energyEfficiencyClass) {
264
267
  case 'selector_energyEfficiencyClass_appp': {
265
268
  return 'A+++';
@@ -271,8 +274,9 @@ export class MobileTransformer {
271
274
  return 'A+';
272
275
  }
273
276
  case 'selector_unknown':
277
+ case undefined:
274
278
  case null: {
275
- return 'C';
279
+ return '';
276
280
  }
277
281
  default: {
278
282
  return energyEfficiencyClass.slice(-1).toUpperCase();
@@ -148,7 +148,8 @@ export class RubrikkTransformer {
148
148
  selector_energyEfficiencyClass_g: 'G',
149
149
  selector_unknown: 'default',
150
150
  };
151
- const energyClass = get(car, 'environmentEmissions.energyEfficiencyClass', 'selector_unknown');
151
+ // ADV-187: canonical CO2-derived WLTP class, not the unvalidated legacy NEFZ class.
152
+ const energyClass = get(car, 'environmentEmissions.wltpEnergyEfficiencyClass', 'selector_unknown');
152
153
  return get(available, energyClass);
153
154
  }
154
155
 
@@ -364,8 +364,11 @@ export class SantanderTransformer {
364
364
  }
365
365
  }
366
366
 
367
+ // ADV-187: export the canonical CO2-derived WLTP class (not the unvalidated
368
+ // legacy NEFZ class) and never invent one — an unknown class is exported
369
+ // empty instead of the former hard-coded 'C'.
367
370
  private getEnergyEfficiencyClass(car: DataSchemes.Car): string {
368
- const energyEfficiencyClass = get(car, 'environmentEmissions.energyEfficiencyClass', 'selector_unknown');
371
+ const energyEfficiencyClass = get(car, 'environmentEmissions.wltpEnergyEfficiencyClass', 'selector_unknown');
369
372
  switch (energyEfficiencyClass) {
370
373
  case 'selector_energyEfficiencyClass_appp': {
371
374
  return 'A+++';
@@ -377,8 +380,9 @@ export class SantanderTransformer {
377
380
  return 'A+';
378
381
  }
379
382
  case 'selector_unknown':
383
+ case undefined:
380
384
  case null: {
381
- return 'C';
385
+ return '';
382
386
  }
383
387
  default: {
384
388
  return energyEfficiencyClass.slice(-1).toUpperCase();