@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.
- package/dist/cjs/src-public/airtable.js +44 -4
- package/dist/cjs/src-public/index.js +4 -1
- package/dist/cjs/src-public/sitoo.js +19 -10
- package/dist/types/src-public/airtable.d.ts +1 -0
- package/dist/types/src-public/index.d.ts +2 -0
- package/dist/types/src-public/sitoo.d.ts +20 -0
- package/package.json +1 -1
|
@@ -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
|
-
|
|
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
|
|
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
|
|
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,
|
|
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>;
|