@contrail/flexplm 1.1.51 → 1.1.53

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.
@@ -11,10 +11,11 @@ import fsPromise = require('fs/promises');
11
11
  import path = require('path');
12
12
  import { MapFileUtil } from '@contrail/transform-data';
13
13
  import { Logger } from '@contrail/app-framework';
14
+ import { EventShortMessageStatus } from '../util/event-short-message-status';
14
15
 
15
16
  export class BaseProcessPublishAssortment {
16
17
 
17
- private TTL = 7 * 24 * 60 * 60 * 1_000; // 1 week
18
+ private TTL = 30 * 24 * 60 * 60 * 1_000; // 30 days
18
19
  static ASSORTMENT_NOT_PUBLISHABLE = 'Assortment isn\'t marked for publishing to FlexPLM';
19
20
  static ASSORTMENT_NO_FED_INFO = 'Assortment doesn\'t have all "identifier" properties, so there is no processing. Identifier properties: ';
20
21
  static NOT_ABLE_TO_PROCESS_DELETE_CHANGES = 'Error: Not able to process delete changes';
@@ -47,9 +48,16 @@ export class BaseProcessPublishAssortment {
47
48
  seasonFed = await this.getSeasonFederation(assortmentId);
48
49
  } catch (e) {
49
50
  const message = e.message;
51
+ const eventStatus =
52
+ (message.includes(BaseProcessPublishAssortment.ASSORTMENT_NOT_PUBLISHABLE)) ? EventShortMessageStatus.NOT_PUBLISHABLE :
53
+ (message.startsWith(BaseProcessPublishAssortment.ASSORTMENT_NO_FED_INFO)) ? EventShortMessageStatus.NO_FEDERATION_INFO :
54
+ EventShortMessageStatus.FAILURE;
55
+ const processStatus = 'BaseProcessPublishAssortment: ' + eventStatus
56
+ + ': assortmentId: ' + event.assortmentId + ': assortmentPublishChangeId: ' + event.assortmentPublishChangeId;
57
+ console.log(JSON.stringify(processStatus));
50
58
  console.log(message);
51
59
  const output = {
52
- results: { message },
60
+ results: { message, event },
53
61
  skip_await: true
54
62
  };
55
63
  return output;
@@ -607,6 +615,10 @@ export class BaseProcessPublishAssortment {
607
615
  }
608
616
  async processPublish(pcd: PublishChangeData, changeDetail, fullChange, deleteChanges) {
609
617
  console.info('processPublish-start');
618
+ const event = {
619
+ assortmentId: pcd.assortmentId,
620
+ assortmentPublishChangeId: pcd.assortmentPublishChangeId
621
+ };
610
622
 
611
623
  const assortmentItemFullChangeMap = this.getFullChangeAssortmentMap(fullChange);
612
624
  const assortmentItemDeleteMap = this.getDeleteChangesAssortmentMap(deleteChanges);
@@ -614,16 +626,39 @@ export class BaseProcessPublishAssortment {
614
626
 
615
627
  const events = await this.getEventsForPublishChangeData(pcd);
616
628
  if (events.length === 0) {
617
- const message = 'No Events to Send; returning';
618
- console.log(message);
619
- return {
620
- results: { message },
621
- skip_await: true
622
- };
629
+ const processStatus = 'BaseProcessPublishAssortment: ' + EventShortMessageStatus.NO_EVENTS_TO_SEND
630
+ + ': assortmentId: ' + pcd.assortmentId + ': assortmentPublishChangeId: ' + pcd.assortmentPublishChangeId;
631
+ console.log(processStatus);
632
+ const message = 'No Events to Send; returning';
633
+ console.log(message);
634
+ return {
635
+ results: { message, event },
636
+ skip_await: true
637
+ };
638
+
623
639
  }
624
640
 
625
641
  const results = await this.sendEvents(events);
626
- return { results };
642
+ const resultsCount = this.getResultsCount(events);
643
+ const processStatus = 'BaseProcessPublishAssortment: ' + EventShortMessageStatus.NO_EVENTS_TO_SEND
644
+ + ': assortmentId: ' + pcd.assortmentId + ': assortmentPublishChangeId: ' + pcd.assortmentPublishChangeId
645
+ + ': resultsCount: ' + JSON.stringify(resultsCount);
646
+ console.log(processStatus);
647
+ return { results, event, resultsCount };
648
+
649
+ }
650
+
651
+ getResultsCount(events) {
652
+ return events.reduce((acc, event) => {
653
+ const objectClass = event?.objectClass;
654
+ if (objectClass === 'LCSProductSeasonLink') {
655
+ acc.productSeasons++;
656
+ }
657
+ else if (objectClass === 'LCSSKUSeasonLink') {
658
+ acc.colorwaySeasons++;
659
+ }
660
+ return acc;
661
+ }, { productSeasons: 0, colorwaySeasons: 0 });
627
662
  }
628
663
 
629
664
  private async sendEvents(events: SeasonalPayload[]): Promise<any> {
@@ -0,0 +1,496 @@
1
+ 'use strict';
2
+ Object.defineProperty(exports, '__esModule', { value: true });
3
+ exports.mapping = {
4
+ typeConversion: {
5
+ vibe2flex: {
6
+ 'custom-entity': {
7
+ getMapKey: (entity) =>{
8
+ const typePath = entity['typePath'];
9
+ let mapKey = '';
10
+ switch (typePath) {
11
+ case 'custom-entity:pack':
12
+ mapKey = 'packaging';
13
+ break;
14
+ case 'custom-entity:prefix':
15
+ mapKey = 'prefix';
16
+ break;
17
+ case 'custom-entity:catName':
18
+ mapKey = 'catName';
19
+ break;
20
+ case 'custom-entity:partnerOrg':
21
+ mapKey = 'partnerOrg';
22
+ break;
23
+ case 'custom-entity:catFamily':
24
+ mapKey = 'catFamily';
25
+ break;
26
+ case 'custom-entity:formName':
27
+ mapKey = 'formName';
28
+ break;
29
+ }
30
+
31
+ return mapKey;
32
+ }
33
+ }
34
+ }
35
+ // flex2vibe: {
36
+ // LCSRevisableEntity: {
37
+ // getMapKey: (object) =>{ return object;}
38
+ // },
39
+ // LCSLast: {
40
+ // getMapKey: (object) => {return object;}
41
+ // },
42
+ // LCSMaterial: {
43
+ // getMapKey: (object) =>{ return object;}
44
+ // },
45
+ // LCSBusinessObject: {
46
+ // getMapKey: (object) => {return object;}
47
+ // }
48
+ // },
49
+ },
50
+ LCSSeason: {
51
+ vibe2flex: {
52
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
53
+ rekey: {
54
+ seasonName: 'flexPLMSeasonName',
55
+ year: 'seasonYear'
56
+ },
57
+ getSoftType: () => 'Season',
58
+ getClass: () => 'LCSSeason'
59
+ },
60
+ flex2vibe: {
61
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
62
+ rekey: {
63
+ flexPLMSeasonName: 'seasonName',
64
+ seasonYear: 'year'
65
+ }
66
+ }
67
+ },
68
+ LCSProduct: {
69
+ vibeOwningKeys: ['itemNumber', 'lifecycleStage'],
70
+ vibe2flex: {
71
+ getClass: () => 'LCSProduct',
72
+ getSoftType: (entity /*, dependencies*/) =>{
73
+ const prodType = entity['prodType'];
74
+ let val = '';
75
+ switch (prodType) {
76
+ case 'acc':
77
+ val = 'Product\\Accesories';
78
+ break;
79
+ case 'app':
80
+ val = 'Product\\Apparel';
81
+ break;
82
+ case 'eqp':
83
+ val = 'Product\\Equipment';
84
+ break;
85
+ case 'foot':
86
+ val = 'Product\\Footwear';
87
+ break;
88
+ }
89
+
90
+ return val;
91
+ },
92
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }, { processor: 'VALUE_TRANSFORM', functionTransformersKey: 'valueTransform' }],
93
+ rekey: {
94
+ productName: 'name',
95
+ vibeIQIdentifier: 'itemNumber'
96
+ },
97
+ valueTransform: {
98
+ transformEx: (row/*, dependencies*/) => {
99
+ return row['otherProp'] + 'xxx';
100
+ }
101
+ }
102
+
103
+ },
104
+ flex2vibe: {
105
+ getClass: () => 'item',
106
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
107
+ rekey: {
108
+ itemNumber: 'vibeIQIdentifier',
109
+ name: 'productName',
110
+ }
111
+ }
112
+ },
113
+ LCSSKU: {
114
+ vibeOwningKeys: ['itemNumber', 'lifecycleStage'],
115
+ vibe2flex: {
116
+ getClass: () => 'LCSSKU',
117
+ getSoftType: (entity /*, dependencies*/) =>{
118
+ const prodType = entity['prodType'];
119
+ let val = '';
120
+ switch (prodType) {
121
+ case 'acc':
122
+ val = 'Product\\Accesories';
123
+ break;
124
+ case 'app':
125
+ val = 'Product\\Apparel';
126
+ break;
127
+ case 'eqp':
128
+ val = 'Product\\Equipment';
129
+ break;
130
+ case 'foot':
131
+ val = 'Product\\Footwear';
132
+ break;
133
+ }
134
+
135
+ return val;
136
+ },
137
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
138
+ rekey: {
139
+ skuName: 'optionName',
140
+ vibeIQIdentifier: 'itemNumber'
141
+ }
142
+ },
143
+ flex2vibe: {
144
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
145
+ rekey: {
146
+ itemNumber: 'vibeIQIdentifier',
147
+ optionName: 'skuName',
148
+ }
149
+ }
150
+ },
151
+
152
+ packaging: {
153
+ vibe2flex: {
154
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
155
+ rekey: {
156
+ retailPackType: 'packType',
157
+ retailIntroDate: 'introDate'
158
+ },
159
+ getSoftType: () => 'Revisable Entity\\packaging',
160
+ getClass: () => 'LCSRevisableEntity'
161
+ },
162
+ flex2vibe: {
163
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
164
+ rekey: {
165
+ packType: 'retailPackType',
166
+ introDate: 'retailIntroDate'
167
+ },
168
+ getClass: () => 'custom-entity',
169
+ getSoftType: () => 'custom-entity:pack',
170
+
171
+ }
172
+ },
173
+ prefix: {
174
+ vibe2flex: {
175
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
176
+ rekey: {
177
+ retailOwner: 'owner',
178
+ retailIntroDate: 'introDate'
179
+ },
180
+ getSoftType: () => 'Revisable Entity\\prefix',
181
+ getClass: () => 'LCSRevisableEntity'
182
+ },
183
+ flex2vibe: {
184
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
185
+ rekey: {
186
+ owner: 'retailOwner',
187
+ introDate: 'retailIntroDate'
188
+ },
189
+ getClass: () => 'custom-entity',
190
+ getSoftType: () => 'custom-entity:prefix',
191
+
192
+ }
193
+ },
194
+ catName: {
195
+ getIdentifierProperties: () => ['catName', 'catNumber'],
196
+ getInformationalProperties: () => ['longName'],
197
+ vibe2flex: {
198
+ transformOrder: [],
199
+ getSoftType: () => 'Last\\catName',
200
+ getClass: () => 'LCSLast'
201
+ },
202
+ flex2vibe: {
203
+ transformOrder: [],
204
+ getClass: () => 'custom-entity',
205
+ getSoftType: () => 'custom-entity:catName',
206
+
207
+ }
208
+ },
209
+ partnerOrg: {
210
+ vibe2flex: {
211
+ transformOrder: [],
212
+ getSoftType: () => 'Business Object\\partnerOrg',
213
+ getClass: () => 'LCSLifecycleManaged'
214
+ },
215
+ flex2vibe: {
216
+ transformOrder: [],
217
+ getClass: () => 'custom-entity',
218
+ getSoftType: () => 'custom-entity:partnerOrg',
219
+
220
+ }
221
+ },
222
+ catFamily: {
223
+ vibe2flex: {
224
+ transformOrder: [],
225
+ getSoftType: () => 'Revisable Entity\\catFamily',
226
+ getClass: () => 'LCSRevisableEntity'
227
+ },
228
+ flex2vibe: {
229
+ transformOrder: [],
230
+ getClass: () => 'custom-entity',
231
+ getSoftType: () => 'custom-entity:catFamily',
232
+
233
+ }
234
+ },
235
+ formName: {
236
+ vibe2flex: {
237
+ transformOrder: [],
238
+ getSoftType: () => 'Material\\form',
239
+ getClass: () => 'LCSMaterial'
240
+ },
241
+ flex2vibe: {
242
+ transformOrder: [],
243
+ getClass: () => 'custom-entity',
244
+ getSoftType: () => 'custom-entity:formName',
245
+
246
+ }
247
+ },
248
+
249
+ };
250
+ exports.mapping2 = {
251
+ typeConversion: {
252
+ vibe2flex: {
253
+ 'custom-entity': {
254
+ getMapKey: (entity) =>{
255
+ const typePath = entity['typePath'];
256
+ let mapKey = '';
257
+ switch (typePath) {
258
+ case 'custom-entity:pack':
259
+ mapKey = 'packaging';
260
+ break;
261
+ case 'custom-entity:prefix':
262
+ mapKey = 'prefix';
263
+ break;
264
+ case 'custom-entity:catName':
265
+ mapKey = 'catName';
266
+ break;
267
+ case 'custom-entity:partnerOrg':
268
+ mapKey = 'partnerOrg';
269
+ break;
270
+ case 'custom-entity:catFamily':
271
+ mapKey = 'catFamily';
272
+ break;
273
+ case 'custom-entity:formName':
274
+ mapKey = 'formName';
275
+ break;
276
+ }
277
+
278
+ return mapKey;
279
+ }
280
+ }
281
+ }
282
+ // flex2vibe: {
283
+ // LCSRevisableEntity: {
284
+ // getMapKey: (object) =>{ return object;}
285
+ // },
286
+ // LCSLast: {
287
+ // getMapKey: (object) => {return object;}
288
+ // },
289
+ // LCSMaterial: {
290
+ // getMapKey: (object) =>{ return object;}
291
+ // },
292
+ // LCSBusinessObject: {
293
+ // getMapKey: (object) => {return object;}
294
+ // }
295
+ // },
296
+ },
297
+ LCSSeason: {
298
+ getIdentifierProperties: () => ['brand', 'year', 'seasonType'],
299
+ vibe2flex: {
300
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
301
+ rekey: {
302
+ seasonName: 'flexPLMSeasonName'
303
+ },
304
+ getSoftType: () => 'Season',
305
+ getClass: () => 'LCSSeason'
306
+ },
307
+ flex2vibe: {
308
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
309
+ rekey: {
310
+ flexPLMSeasonName: 'seasonName'
311
+ }
312
+ }
313
+ },
314
+ LCSProduct: {
315
+ vibeOwningKeys: ['itemNumber', 'lifecycleStage'],
316
+ vibe2flex: {
317
+ getClass: () => 'LCSProduct',
318
+ getSoftType: (entity /*, dependencies*/) =>{
319
+ const prodType = entity['prodType'];
320
+ let val = '';
321
+ switch (prodType) {
322
+ case 'acc':
323
+ val = 'Product\\Accesories';
324
+ break;
325
+ case 'app':
326
+ val = 'Product\\Apparel';
327
+ break;
328
+ case 'eqp':
329
+ val = 'Product\\Equipment';
330
+ break;
331
+ case 'foot':
332
+ val = 'Product\\Footwear';
333
+ break;
334
+ }
335
+
336
+ return val;
337
+ },
338
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }, { processor: 'VALUE_TRANSFORM', functionTransformersKey: 'valueTransform' }],
339
+ rekey: {
340
+ productName: 'name',
341
+ vibeIQIdentifier: 'itemNumber'
342
+ },
343
+ valueTransform: {
344
+ transformEx: (row/*, dependencies*/) => {
345
+ return row['otherProp'] + 'xxx';
346
+ }
347
+ }
348
+
349
+ },
350
+ flex2vibe: {
351
+ getClass: () => 'item',
352
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
353
+ rekey: {
354
+ itemNumber: 'vibeIQIdentifier',
355
+ name: 'productName',
356
+ }
357
+ }
358
+ },
359
+ LCSSKU: {
360
+ vibeOwningKeys: ['itemNumber', 'lifecycleStage'],
361
+ getIdentifierProperties: () => ['uniqueIdentifierA', 'uniqueIdentifierB'],
362
+ vibe2flex: {
363
+ getClass: () => 'LCSSKU',
364
+ getSoftType: (entity /*, dependencies*/) =>{
365
+ const prodType = entity['prodType'];
366
+ let val = '';
367
+ switch (prodType) {
368
+ case 'acc':
369
+ val = 'Product\\Accesories';
370
+ break;
371
+ case 'app':
372
+ val = 'Product\\Apparel';
373
+ break;
374
+ case 'eqp':
375
+ val = 'Product\\Equipment';
376
+ break;
377
+ case 'foot':
378
+ val = 'Product\\Footwear';
379
+ break;
380
+ }
381
+
382
+ return val;
383
+ },
384
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
385
+ rekey: {
386
+ skuName: 'optionName',
387
+ vibeIQIdentifier: 'itemNumber'
388
+ }
389
+ },
390
+ flex2vibe: {
391
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
392
+ rekey: {
393
+ itemNumber: 'vibeIQIdentifier',
394
+ optionName: 'skuName',
395
+ }
396
+ }
397
+ },
398
+
399
+ packaging: {
400
+ vibe2flex: {
401
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
402
+ rekey: {
403
+ retailPackType: 'packType',
404
+ retailIntroDate: 'introDate'
405
+ },
406
+ getSoftType: () => 'Revisable Entity\\packaging',
407
+ getClass: () => 'LCSRevisableEntity'
408
+ },
409
+ flex2vibe: {
410
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
411
+ rekey: {
412
+ packType: 'retailPackType',
413
+ introDate: 'retailIntroDate'
414
+ },
415
+ getClass: () => 'custom-entity',
416
+ getSoftType: () => 'custom-entity:pack',
417
+
418
+ }
419
+ },
420
+ prefix: {
421
+ vibe2flex: {
422
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
423
+ rekey: {
424
+ retailOwner: 'owner',
425
+ retailIntroDate: 'introDate'
426
+ },
427
+ getSoftType: () => 'Revisable Entity\\prefix',
428
+ getClass: () => 'LCSRevisableEntity'
429
+ },
430
+ flex2vibe: {
431
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
432
+ rekey: {
433
+ owner: 'retailOwner',
434
+ introDate: 'retailIntroDate'
435
+ },
436
+ getClass: () => 'custom-entity',
437
+ getSoftType: () => 'custom-entity:prefix',
438
+
439
+ }
440
+ },
441
+ catName: {
442
+ getIdentifierProperties: () => ['catName', 'catNumber'],
443
+ getInformationalProperties: () => ['longName'],
444
+ vibe2flex: {
445
+ transformOrder: [],
446
+ getSoftType: () => 'Last\\catName',
447
+ getClass: () => 'LCSLast'
448
+ },
449
+ flex2vibe: {
450
+ transformOrder: [],
451
+ getClass: () => 'custom-entity',
452
+ getSoftType: () => 'custom-entity:catName',
453
+
454
+ }
455
+ },
456
+ partnerOrg: {
457
+ vibe2flex: {
458
+ transformOrder: [],
459
+ getSoftType: () => 'Business Object\\partnerOrg',
460
+ getClass: () => 'LCSLifecycleManaged'
461
+ },
462
+ flex2vibe: {
463
+ transformOrder: [],
464
+ getClass: () => 'custom-entity',
465
+ getSoftType: () => 'custom-entity:partnerOrg',
466
+
467
+ }
468
+ },
469
+ catFamily: {
470
+ vibe2flex: {
471
+ transformOrder: [],
472
+ getSoftType: () => 'Revisable Entity\\catFamily',
473
+ getClass: () => 'LCSRevisableEntity'
474
+ },
475
+ flex2vibe: {
476
+ transformOrder: [],
477
+ getClass: () => 'custom-entity',
478
+ getSoftType: () => 'custom-entity:catFamily',
479
+
480
+ }
481
+ },
482
+ formName: {
483
+ vibe2flex: {
484
+ transformOrder: [],
485
+ getSoftType: () => 'Material\\form',
486
+ getClass: () => 'LCSMaterial'
487
+ },
488
+ flex2vibe: {
489
+ transformOrder: [],
490
+ getClass: () => 'custom-entity',
491
+ getSoftType: () => 'custom-entity:formName',
492
+
493
+ }
494
+ },
495
+
496
+ };