@shushed/helpers 0.0.263 → 0.0.265-s2-20260217170910

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.
@@ -28,6 +28,42 @@ class AirtableHelper extends runtime_1.default {
28
28
  this.viewId = airtableOpts.viewId;
29
29
  }
30
30
  }
31
+ static normalizeWebhookCellValues(cellValuesByFieldId) {
32
+ const isSelectOption = (v) => v && typeof v === 'object' && !Array.isArray(v) && typeof v.id === 'string' && v.id.startsWith('sel');
33
+ const isLinkedRecord = (v) => v && typeof v === 'object' && !Array.isArray(v) && typeof v.id === 'string' && v.id.startsWith('rec');
34
+ const normalizeValue = (v) => {
35
+ if (isSelectOption(v))
36
+ return v.name;
37
+ if (isLinkedRecord(v))
38
+ return v.id;
39
+ return v;
40
+ };
41
+ const normalized = {};
42
+ for (const fieldId in cellValuesByFieldId) {
43
+ const val = cellValuesByFieldId[fieldId];
44
+ if (val && typeof val === 'object' && !Array.isArray(val) && Array.isArray(val.linkedRecordIds)) {
45
+ if (val.valuesByLinkedRecordId) {
46
+ normalized[fieldId] = val.linkedRecordIds.flatMap((id) => (val.valuesByLinkedRecordId[id] ?? []).map(normalizeValue));
47
+ }
48
+ else {
49
+ normalized[fieldId] = val.linkedRecordIds;
50
+ }
51
+ }
52
+ else if (isSelectOption(val)) {
53
+ normalized[fieldId] = val.name;
54
+ }
55
+ else if (Array.isArray(val) && val.length > 0 && isSelectOption(val[0])) {
56
+ normalized[fieldId] = val.map((opt) => opt.name);
57
+ }
58
+ else if (Array.isArray(val) && val.length > 0 && isLinkedRecord(val[0])) {
59
+ normalized[fieldId] = val.map((rec) => rec.id);
60
+ }
61
+ else {
62
+ normalized[fieldId] = val;
63
+ }
64
+ }
65
+ return normalized;
66
+ }
31
67
  static translateFields(dictionary, y) {
32
68
  const nextFields = {};
33
69
  for (const k in dictionary) {
@@ -421,7 +457,11 @@ class AirtableHelper extends runtime_1.default {
421
457
  let collectedRecords = [];
422
458
  let resp = null;
423
459
  try {
424
- resp = await fetch(`https://api.airtable.com/v0/bases/${this.baseId}/webhooks/${input.webhook.id}/payloads`, {
460
+ const payloadsUrl = new URL(`https://api.airtable.com/v0/bases/${this.baseId}/webhooks/${input.webhook.id}/payloads`);
461
+ if (startingCursor) {
462
+ payloadsUrl.searchParams.set('cursor', String(startingCursor));
463
+ }
464
+ resp = await fetch(payloadsUrl.toString(), {
425
465
  method: 'GET',
426
466
  headers: {
427
467
  'Authorization': 'Bearer ' + this.apiKey,
@@ -450,11 +490,11 @@ class AirtableHelper extends runtime_1.default {
450
490
  this.logging.log(`Received ${res.payloads.length} records from the ${scope}.`);
451
491
  for (const payload of res.payloads) {
452
492
  const changes = this.viewId
453
- ? payload.changedViewsById?.[this.viewId]
493
+ ? payload.changedTablesById?.[this.tableId]?.changedViewsById?.[this.viewId]
454
494
  : payload.changedTablesById?.[this.tableId];
455
495
  const airtableCreated = Object.entries(changes?.createdRecordsById || {}).map(([k, v]) => ({
456
496
  id: k,
457
- fields: AirtableHelper.translateFields(this.dictionary, { fields: v.cellValuesByFieldId || {} }).fields,
497
+ fields: AirtableHelper.translateFields(this.dictionary, { fields: AirtableHelper.normalizeWebhookCellValues(v.cellValuesByFieldId || {}) }).fields,
458
498
  created_at: v.createdTime || payload.timestamp,
459
499
  last_modified_at: v.createdTime || payload.timestamp,
460
500
  previous_fields: null
@@ -462,7 +502,7 @@ class AirtableHelper extends runtime_1.default {
462
502
  const airtableChanged = Object.entries(changes?.changedRecordsById || {}).map(([k, v]) => ({
463
503
  id: k,
464
504
  fields: AirtableHelper.translateFields(this.dictionary, {
465
- fields: Object.assign({}, v.unchanged?.cellValuesByFieldId, v.current?.cellValuesByFieldId)
505
+ fields: AirtableHelper.normalizeWebhookCellValues(Object.assign({}, v.unchanged?.cellValuesByFieldId, v.current?.cellValuesByFieldId))
466
506
  }).fields,
467
507
  last_modified_at: payload.timestamp
468
508
  }));
@@ -17,7 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.RedisConnectionError = exports.RateLimit = exports.setHeaders = exports.BCOrderHelper = exports.DatoHelper = exports.AirtableHelper = exports.CentraHelper = exports.BigQueryHelper = exports.JWKSHelper = exports.CloudTasksHelper = exports.Secrets = exports.SchedulerHelper = exports.Logging = exports.Runtime = exports.PubSubHelper = exports.EnvEngine = exports.validate = void 0;
20
+ exports.SitooHelper = exports.RedisConnectionError = exports.RateLimit = exports.setHeaders = exports.BCOrderHelper = exports.DatoHelper = exports.AirtableHelper = exports.CentraHelper = exports.BigQueryHelper = exports.JWKSHelper = exports.CloudTasksHelper = exports.Secrets = exports.SchedulerHelper = exports.Logging = exports.Runtime = exports.PubSubHelper = exports.EnvEngine = exports.validate = void 0;
21
21
  var validate_1 = require("./validate");
22
22
  Object.defineProperty(exports, "validate", { enumerable: true, get: function () { return __importDefault(validate_1).default; } });
23
23
  __exportStar(require("./sanitize"), exports);
@@ -53,3 +53,6 @@ var rateLimit_1 = require("./rateLimit");
53
53
  Object.defineProperty(exports, "RateLimit", { enumerable: true, get: function () { return __importDefault(rateLimit_1).default; } });
54
54
  Object.defineProperty(exports, "RedisConnectionError", { enumerable: true, get: function () { return rateLimit_1.RedisConnectionError; } });
55
55
  __exportStar(require("./fredhopper"), exports);
56
+ __exportStar(require("./sitoo"), exports);
57
+ var sitoo_1 = require("./sitoo");
58
+ Object.defineProperty(exports, "SitooHelper", { enumerable: true, get: function () { return __importDefault(sitoo_1).default; } });
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.SitooOrderItemType = exports.SitooPaymentState = exports.SitooOrderType = exports.SitooOrderState = void 0;
7
7
  const crypto_1 = __importDefault(require("crypto"));
8
- const lodash_groupby_1 = __importDefault(require("lodash.groupby"));
8
+ const lodash_1 = require("lodash");
9
9
  const env_1 = __importDefault(require("./env"));
10
10
  const SITOO_TR_TYPE_MANUAL_IN = 10;
11
11
  const SITOO_TR_TYPE_MANUAL_OUT = 20;
@@ -49,8 +49,9 @@ class SitooHelper extends env_1.default {
49
49
  this.baseUrl = opts.sitooBaseUrl.replace(/\/$/, '');
50
50
  this.siteId = opts.sitooSiteId;
51
51
  }
52
- async getAllOrders(options) {
52
+ async getOrders(options) {
53
53
  const allOrders = [];
54
+ let totalcount = 0;
54
55
  const pageSize = 100;
55
56
  let start = 0;
56
57
  let hasMore = true;
@@ -68,12 +69,17 @@ class SitooHelper extends env_1.default {
68
69
  if (options?.filterByState !== undefined) {
69
70
  queryParams.set('orderstate', options.filterByState.toString());
70
71
  }
72
+ if (options?.orderids) {
73
+ queryParams.set('orderids', options.orderids.join(','));
74
+ }
75
+ if (options?.orderIdFrom !== undefined) {
76
+ queryParams.set('orderidfrom', options.orderIdFrom.toString());
77
+ }
71
78
  const url = `${this.baseUrl}/sites/${this.siteId}/orders.json?${queryParams.toString()}`;
72
79
  const response = await fetch(url, {
73
80
  method: 'GET',
74
81
  headers: {
75
82
  'Authorization': `Basic ${this.opts.accessToken}`,
76
- 'Content-Type': 'application/json',
77
83
  },
78
84
  });
79
85
  if (!response.ok) {
@@ -82,6 +88,7 @@ class SitooHelper extends env_1.default {
82
88
  }
83
89
  const envelope = await response.json();
84
90
  allOrders.push(...envelope.items);
91
+ totalcount = envelope.totalcount;
85
92
  if (envelope.items.length < pageSize) {
86
93
  hasMore = false;
87
94
  }
@@ -89,7 +96,11 @@ class SitooHelper extends env_1.default {
89
96
  start += envelope.items.length;
90
97
  }
91
98
  }
92
- return allOrders;
99
+ return { items: allOrders, totalcount };
100
+ }
101
+ async getAllOrders(options) {
102
+ const { items } = await this.getOrders(options);
103
+ return items;
93
104
  }
94
105
  async getSitooWarehouses() {
95
106
  const url = `${this.baseUrl}/sites/${this.siteId}/warehouses.json`;
@@ -97,7 +108,6 @@ class SitooHelper extends env_1.default {
97
108
  method: 'GET',
98
109
  headers: {
99
110
  'Authorization': `Basic ${this.opts.accessToken}`,
100
- 'Content-Type': 'application/json',
101
111
  },
102
112
  });
103
113
  if (!response.ok) {
@@ -131,7 +141,6 @@ class SitooHelper extends env_1.default {
131
141
  method: 'GET',
132
142
  headers: {
133
143
  'Authorization': `Basic ${this.opts.accessToken}`,
134
- 'Content-Type': 'application/json',
135
144
  },
136
145
  });
137
146
  if (!response.ok) {
@@ -278,19 +287,19 @@ class SitooHelper extends env_1.default {
278
287
  const hasMissingEntries = batches[0].length > 0;
279
288
  if (!options?.preview && hasMissingEntries) {
280
289
  for (let i = 0; i < batches.length; i++) {
281
- const warehouseEntities = (0, lodash_groupby_1.default)(batches[i], e => `${locationCodeToWarehouse[e.location_code]}-${e.quantity > 0 ? 'positive' : 'negative'}`);
290
+ const warehouseEntities = (0, lodash_1.groupBy)(batches[i], (e) => `${locationCodeToWarehouse[e.location_code]}-${e.quantity > 0 ? 'positive' : 'negative'}`);
282
291
  const entryNosInBatches = {};
283
292
  const transactionsToCreate = [];
284
293
  for (const k in warehouseEntities) {
285
294
  const entriesToCreate = warehouseEntities[k];
286
295
  const warehouseId = locationCodeToWarehouse[entriesToCreate[0].location_code];
287
296
  const entryType = entriesToCreate[0].quantity > 0 ? SITOO_TR_TYPE_MANUAL_IN : SITOO_TR_TYPE_MANUAL_OUT;
288
- entryNosInBatches[transactionsToCreate.length] = entriesToCreate.map(e => e.entry_no);
297
+ entryNosInBatches[transactionsToCreate.length] = entriesToCreate.map((e) => e.entry_no);
289
298
  transactionsToCreate.push({
290
299
  warehouseid: warehouseId,
291
300
  transactiontype: entryType,
292
- description: entriesToCreate.map(e => `'${e.entry_no}'`).join(', '),
293
- items: entriesToCreate.map(e => ({
301
+ description: entriesToCreate.map((e) => `'${e.entry_no}'`).join(', '),
302
+ items: entriesToCreate.map((e) => ({
294
303
  sku: [e.style_id, e.colour_id, e.size_code].filter(Boolean).join('-'),
295
304
  decimalquantity: `${e.quantity.toFixed(3)}`,
296
305
  moneypricein: (((e.unit_cost?.value ?? 0) / 100) * e.quantity).toFixed(2),
@@ -22,6 +22,7 @@ declare class AirtableHelper<T extends Record<string, string>, K extends keyof T
22
22
  primaryKeyWritable?: boolean;
23
23
  viewId?: string;
24
24
  });
25
+ static normalizeWebhookCellValues(cellValuesByFieldId: Record<string, any>): Record<string, any>;
25
26
  static translateFields<T extends Record<string, string>, S extends {
26
27
  fields: Record<string, any>;
27
28
  }>(dictionary: T, y: S): S & {
@@ -18,3 +18,5 @@ export { type CentraError, type CentraErrors, type BasicCentraCountry, type Basi
18
18
  export { default as RateLimit, RedisConnectionError } from './rateLimit';
19
19
  export { type TriggerOnCreateOptions, type TriggerOnExecuteOptions, type NodeOptions, type RNConfiguration, type TriggerExtraOptions } from './types';
20
20
  export * from './fredhopper';
21
+ export * from './sitoo';
22
+ export { default as SitooHelper } from './sitoo';
@@ -46,6 +46,8 @@ export interface SitooOrderItem {
46
46
  productattributes?: string;
47
47
  externalid?: string | null;
48
48
  externalidaliased?: string | null;
49
+ externalinput?: string;
50
+ externalinputtitle?: string;
49
51
  unitlabel?: string;
50
52
  decimalunitquantity?: string;
51
53
  quantity: number;
@@ -53,10 +55,22 @@ export interface SitooOrderItem {
53
55
  moneyrowprice: SitooMoney;
54
56
  moneyrowdiscount?: SitooMoney;
55
57
  moneyrow: SitooMoney;
58
+ moneynetpriceperunit?: string;
59
+ moneynetpriceperquantity?: string;
60
+ moneypriceorg?: string;
61
+ moneyitemtotal_net?: string;
62
+ moneyitemtotal_vat?: string;
63
+ moneyoriginalprice?: string;
64
+ moneydiscountedprice?: string;
65
+ moneydiscount?: string;
56
66
  vatvalue?: number;
57
67
  deliveryinfo?: string | null;
68
+ voucherid?: number;
69
+ vouchercode?: string;
70
+ vouchername?: string;
58
71
  salestaxes?: SitooOrderItemSalesTax[];
59
72
  additionaldata?: Record<string, string>;
73
+ decimalquantitytotal?: string;
60
74
  }
61
75
  export interface SitooOrderPayment {
62
76
  name: string;
@@ -81,6 +95,7 @@ export interface SitooOrderReservedPayment {
81
95
  export interface SitooOrder {
82
96
  orderid: number;
83
97
  orderstate: SitooOrderState;
98
+ orderstateid?: number;
84
99
  ordertype: SitooOrderType;
85
100
  paymentstate: SitooPaymentState;
86
101
  datecreated: number;
@@ -105,6 +120,8 @@ export interface SitooOrder {
105
120
  moneyrounding?: SitooMoney;
106
121
  moneytotalpayments?: SitooMoney;
107
122
  moneytotalreservedpayments?: SitooMoney;
123
+ moneyfinal_net?: string;
124
+ moneyfinal_vat?: string;
108
125
  orderitems?: SitooOrderItem[];
109
126
  payments?: SitooOrderPayment[];
110
127
  reservedpayments?: SitooOrderReservedPayment[];
@@ -129,6 +146,8 @@ export interface GetAllOrdersOptions {
129
146
  fromTimestamp?: number;
130
147
  untilTimestamp?: number;
131
148
  filterByState?: SitooOrderState;
149
+ orderids?: number[];
150
+ orderIdFrom?: number;
132
151
  }
133
152
  export interface SitooOrdersEnvelope {
134
153
  totalcount: number;
@@ -236,6 +255,7 @@ export default class SitooHelper extends EnvEngine {
236
255
  sitooBaseUrl: string;
237
256
  sitooSiteId: number;
238
257
  });
258
+ getOrders(options?: GetAllOrdersOptions): Promise<SitooOrdersEnvelope>;
239
259
  getAllOrders(options?: GetAllOrdersOptions): Promise<SitooOrder[]>;
240
260
  getSitooWarehouses(): Promise<{
241
261
  nameToId: Record<string, number>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shushed/helpers",
3
- "version": "0.0.263",
3
+ "version": "0.0.265-s2-20260217170910",
4
4
  "author": "",
5
5
  "license": "UNLICENSED",
6
6
  "description": "",