@shushed/helpers 0.0.225 → 0.0.226-fix-erp-631-20260105145100
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/contracts/index.js +1 -5
- package/dist/cjs/dist-dereferenced/index.js +1 -5
- package/dist/cjs/src-public/airtable.js +59 -96
- package/dist/cjs/src-public/bcOrder.js +38 -0
- package/dist/cjs/src-public/centra.js +5 -56
- package/dist/cjs/src-public/env.js +1 -1
- package/dist/cjs/src-public/index.js +1 -3
- package/dist/package.json +2 -3
- package/dist/types/contracts/index.d.ts +0 -2
- package/dist/types/dist-dereferenced/index.d.ts +0 -2
- package/dist/types/dist-types/index.d.ts +0 -2
- package/dist/types/src-public/airtable.d.ts +9 -0
- package/dist/types/src-public/centra.d.ts +0 -3
- package/dist/types/src-public/index.d.ts +0 -1
- package/package.json +3 -4
- package/dist/cjs/contracts/purchase-orderline.schema.json +0 -124
- package/dist/cjs/contracts/stock-movement.schema.json +0 -144
- package/dist/cjs/dist-dereferenced/purchase-orderline.js +0 -4
- package/dist/cjs/dist-dereferenced/stock-movement.js +0 -4
- package/dist/cjs/dist-types/purchase-orderline.js +0 -2
- package/dist/cjs/dist-types/stock-movement.js +0 -2
- package/dist/cjs/src-public/sitoo.js +0 -349
- package/dist/types/dist-dereferenced/purchase-orderline.d.ts +0 -110
- package/dist/types/dist-dereferenced/stock-movement.d.ts +0 -110
- package/dist/types/dist-types/purchase-orderline.d.ts +0 -30
- package/dist/types/dist-types/stock-movement.d.ts +0 -30
- package/dist/types/src-public/sitoo.d.ts +0 -254
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"$id": "https://shushed.example.com/stock-move.schema.json",
|
|
4
|
-
"title": "Stock Movement Schema",
|
|
5
|
-
"type": "object",
|
|
6
|
-
"additionalProperties": false,
|
|
7
|
-
"properties": {
|
|
8
|
-
"style_id": {
|
|
9
|
-
"type": "string",
|
|
10
|
-
"minLength": 1,
|
|
11
|
-
"faker": {
|
|
12
|
-
"custom.style": []
|
|
13
|
-
},
|
|
14
|
-
"description": "Style Code - Example: 000697"
|
|
15
|
-
},
|
|
16
|
-
"colour_id": {
|
|
17
|
-
"type": "string",
|
|
18
|
-
"minLength": 1,
|
|
19
|
-
"faker": {
|
|
20
|
-
"custom.color": []
|
|
21
|
-
},
|
|
22
|
-
"description": "Colour Code - Example: 3203"
|
|
23
|
-
},
|
|
24
|
-
"product_id": {
|
|
25
|
-
"type": "string",
|
|
26
|
-
"minLength": 1,
|
|
27
|
-
"description": "Combination of style_id and colour_id"
|
|
28
|
-
},
|
|
29
|
-
"size_code": {
|
|
30
|
-
"type": "string",
|
|
31
|
-
"minLength": 1,
|
|
32
|
-
"description": "Variant code, e.g., XS, M, XL, ONE, or numeric like 10, 37, 40"
|
|
33
|
-
},
|
|
34
|
-
"sku": {
|
|
35
|
-
"type": "string",
|
|
36
|
-
"minLength": 1,
|
|
37
|
-
"description": "Full sku of the product_id + size_code"
|
|
38
|
-
},
|
|
39
|
-
"season_id": {
|
|
40
|
-
"type": "string",
|
|
41
|
-
"description": "Code must match format like 'AW20'"
|
|
42
|
-
},
|
|
43
|
-
"drop": {
|
|
44
|
-
"type": "string",
|
|
45
|
-
"description": "Code for the drop i.e. AUGUST"
|
|
46
|
-
},
|
|
47
|
-
"document_line_no": {
|
|
48
|
-
"type": "string",
|
|
49
|
-
"description": "Line number for the document of the Purchase Line"
|
|
50
|
-
},
|
|
51
|
-
"document_no": {
|
|
52
|
-
"type": "string",
|
|
53
|
-
"description": "Document No for this purchase line"
|
|
54
|
-
},
|
|
55
|
-
"created_at": {
|
|
56
|
-
"type": "string",
|
|
57
|
-
"format": "date-time",
|
|
58
|
-
"description": "Date time of the creation of the record. Preferably creation time of the item ledger entry",
|
|
59
|
-
"faker": {
|
|
60
|
-
"date.between": [
|
|
61
|
-
"2024-01-01T00:00:00.000Z",
|
|
62
|
-
"2025-04-30T00:00:00.000Z"
|
|
63
|
-
]
|
|
64
|
-
}
|
|
65
|
-
},
|
|
66
|
-
"location_code": {
|
|
67
|
-
"type": "string",
|
|
68
|
-
"description": "Valid location code like 001-DR, JL200, HEADOFFICE"
|
|
69
|
-
},
|
|
70
|
-
"quantity": {
|
|
71
|
-
"type": "number"
|
|
72
|
-
},
|
|
73
|
-
"quantity_received": {
|
|
74
|
-
"type": "number"
|
|
75
|
-
},
|
|
76
|
-
"quantity_to_receive": {
|
|
77
|
-
"type": "number"
|
|
78
|
-
},
|
|
79
|
-
"last_modified_at": {
|
|
80
|
-
"type": "string",
|
|
81
|
-
"format": "date-time",
|
|
82
|
-
"description": "Datetime of the last created_at in the history",
|
|
83
|
-
"faker": {
|
|
84
|
-
"date.between": [
|
|
85
|
-
"2024-01-01T00:00:00.000Z",
|
|
86
|
-
"2025-04-30T00:00:00.000Z"
|
|
87
|
-
]
|
|
88
|
-
}
|
|
89
|
-
},
|
|
90
|
-
"expected_date": {
|
|
91
|
-
"type": "string",
|
|
92
|
-
"format": "date-time",
|
|
93
|
-
"description": "Datetime of item expected date in the inventory. Since the day is expected always keep to the ISO 00:00 of any day",
|
|
94
|
-
"faker": {
|
|
95
|
-
"date.between": [
|
|
96
|
-
"2024-01-01T00:00:00.000Z",
|
|
97
|
-
"2025-04-30T00:00:00.000Z"
|
|
98
|
-
]
|
|
99
|
-
}
|
|
100
|
-
},
|
|
101
|
-
"unit_price": {
|
|
102
|
-
"oneOf": [
|
|
103
|
-
{
|
|
104
|
-
"$ref": "https://shushed.example.com/money.schema.json"
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
"type": "null"
|
|
108
|
-
}
|
|
109
|
-
],
|
|
110
|
-
"description": "Cost/Price of unit, can be null"
|
|
111
|
-
}
|
|
112
|
-
},
|
|
113
|
-
"required": [
|
|
114
|
-
"document_no",
|
|
115
|
-
"document_line_no",
|
|
116
|
-
"style_id",
|
|
117
|
-
"colour_id",
|
|
118
|
-
"size_code",
|
|
119
|
-
"sku",
|
|
120
|
-
"product_id",
|
|
121
|
-
"season_id",
|
|
122
|
-
"drop"
|
|
123
|
-
]
|
|
124
|
-
}
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"$id": "https://shushed.example.com/stock-move.schema.json",
|
|
4
|
-
"title": "Stock Movement Schema",
|
|
5
|
-
"type": "object",
|
|
6
|
-
"additionalProperties": false,
|
|
7
|
-
"properties": {
|
|
8
|
-
"style_id": {
|
|
9
|
-
"type": "string",
|
|
10
|
-
"minLength": 1,
|
|
11
|
-
"faker": {
|
|
12
|
-
"custom.style": []
|
|
13
|
-
},
|
|
14
|
-
"description": "Style Code - Example: 000697"
|
|
15
|
-
},
|
|
16
|
-
"colour_id": {
|
|
17
|
-
"type": "string",
|
|
18
|
-
"minLength": 1,
|
|
19
|
-
"faker": {
|
|
20
|
-
"custom.color": []
|
|
21
|
-
},
|
|
22
|
-
"description": "Colour Code - Example: 3203"
|
|
23
|
-
},
|
|
24
|
-
"size_code": {
|
|
25
|
-
"type": "string",
|
|
26
|
-
"minLength": 1,
|
|
27
|
-
"description": "Variant code, e.g., XS, M, XL, ONE, or numeric like 10, 37, 40"
|
|
28
|
-
},
|
|
29
|
-
"location_code": {
|
|
30
|
-
"type": "string",
|
|
31
|
-
"pattern": "^\\d{3}-[A-Z]+$|^[A-Z]{2,}-?[A-Z]*$|^[A-Z]{2,}\\d{3}$",
|
|
32
|
-
"description": "Valid location code like 001-DR, JL200, HEADOFFICE"
|
|
33
|
-
},
|
|
34
|
-
"source_system": {
|
|
35
|
-
"type": "string",
|
|
36
|
-
"enum": [
|
|
37
|
-
"bc",
|
|
38
|
-
"centra",
|
|
39
|
-
"sitoo"
|
|
40
|
-
]
|
|
41
|
-
},
|
|
42
|
-
"quantity": {
|
|
43
|
-
"type": "integer",
|
|
44
|
-
"minimum": 0,
|
|
45
|
-
"description": "Quantity of stock available on hand"
|
|
46
|
-
},
|
|
47
|
-
"description": {
|
|
48
|
-
"type": "string"
|
|
49
|
-
},
|
|
50
|
-
"entry_no": {
|
|
51
|
-
"type": "string",
|
|
52
|
-
"description": "BC Entry no. Should be empty for other systems"
|
|
53
|
-
},
|
|
54
|
-
"external_entry_no": {
|
|
55
|
-
"type": "string",
|
|
56
|
-
"description": "External Entry no. Might be empty for other systems"
|
|
57
|
-
},
|
|
58
|
-
"document_no": {
|
|
59
|
-
"type": "string",
|
|
60
|
-
"description": "BC Document no. Should be empty for other systems"
|
|
61
|
-
},
|
|
62
|
-
"external_document_no": {
|
|
63
|
-
"type": "string",
|
|
64
|
-
"description": "Original document i.e. Sitoo ID that caused the change"
|
|
65
|
-
},
|
|
66
|
-
"type": {
|
|
67
|
-
"type": "string",
|
|
68
|
-
"enum": [
|
|
69
|
-
"transfer",
|
|
70
|
-
"negative adjustment",
|
|
71
|
-
"positive adjustment",
|
|
72
|
-
"purchase",
|
|
73
|
-
"sale"
|
|
74
|
-
]
|
|
75
|
-
},
|
|
76
|
-
"unit_cost": {
|
|
77
|
-
"oneOf": [
|
|
78
|
-
{
|
|
79
|
-
"$ref": "https://shushed.example.com/money.schema.json"
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
"type": "null"
|
|
83
|
-
}
|
|
84
|
-
],
|
|
85
|
-
"description": "Cost per unit, can be null"
|
|
86
|
-
},
|
|
87
|
-
"document_date": {
|
|
88
|
-
"type": "string",
|
|
89
|
-
"format": "date",
|
|
90
|
-
"description": "Date of the creation of the document. Preferably creation time of the item ledger entry",
|
|
91
|
-
"faker": {
|
|
92
|
-
"date.between": [
|
|
93
|
-
"2024-01-01",
|
|
94
|
-
"2025-04-30"
|
|
95
|
-
]
|
|
96
|
-
}
|
|
97
|
-
},
|
|
98
|
-
"posting_date": {
|
|
99
|
-
"type": "string",
|
|
100
|
-
"format": "date",
|
|
101
|
-
"description": "Date of posting the record in BC. This should be empty for non-BC systems. Preferably creation time of the item ledger entry",
|
|
102
|
-
"faker": {
|
|
103
|
-
"date.between": [
|
|
104
|
-
"2024-01-01",
|
|
105
|
-
"2025-04-30"
|
|
106
|
-
]
|
|
107
|
-
}
|
|
108
|
-
},
|
|
109
|
-
"created_at": {
|
|
110
|
-
"type": "string",
|
|
111
|
-
"format": "date-time",
|
|
112
|
-
"description": "Date time of the creation of the record. Preferably creation time of the item ledger entry",
|
|
113
|
-
"faker": {
|
|
114
|
-
"date.between": [
|
|
115
|
-
"2024-01-01T00:00:00.000Z",
|
|
116
|
-
"2025-04-30T00:00:00.000Z"
|
|
117
|
-
]
|
|
118
|
-
}
|
|
119
|
-
},
|
|
120
|
-
"last_modified_at": {
|
|
121
|
-
"type": "string",
|
|
122
|
-
"format": "date-time",
|
|
123
|
-
"description": "Datetime of the last created_at in the history",
|
|
124
|
-
"faker": {
|
|
125
|
-
"date.between": [
|
|
126
|
-
"2024-01-01T00:00:00.000Z",
|
|
127
|
-
"2025-04-30T00:00:00.000Z"
|
|
128
|
-
]
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
},
|
|
132
|
-
"required": [
|
|
133
|
-
"style_id",
|
|
134
|
-
"source_system",
|
|
135
|
-
"location_code",
|
|
136
|
-
"colour_id",
|
|
137
|
-
"size_code",
|
|
138
|
-
"last_modified_at",
|
|
139
|
-
"quantity",
|
|
140
|
-
"created_at",
|
|
141
|
-
"document_date",
|
|
142
|
-
"type"
|
|
143
|
-
]
|
|
144
|
-
}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const schema = { "$schema": "http://json-schema.org/draft-07/schema#", "title": "Stock Movement Schema", "type": "object", "additionalProperties": false, "properties": { "style_id": { "type": "string", "minLength": 1 }, "colour_id": { "type": "string", "minLength": 1 }, "product_id": { "type": "string", "minLength": 1 }, "size_code": { "type": "string", "minLength": 1 }, "sku": { "type": "string", "minLength": 1 }, "season_id": { "type": "string" }, "drop": { "type": "string" }, "document_line_no": { "type": "string" }, "document_no": { "type": "string" }, "created_at": { "type": "string", "format": "date-time" }, "location_code": { "type": "string" }, "quantity": { "type": "number" }, "quantity_received": { "type": "number" }, "quantity_to_receive": { "type": "number" }, "last_modified_at": { "type": "string", "format": "date-time" }, "expected_date": { "type": "string", "format": "date-time" }, "unit_price": { "oneOf": [{ "$schema": "http://json-schema.org/draft-07/schema#", "title": "Money", "type": "object", "additionalProperties": false, "properties": { "value": { "type": "integer", "minimum": 0 }, "decimal_places": { "type": "integer", "minimum": 0, "maximum": 4 }, "currency": { "title": "Currency", "$schema": "http://json-schema.org/draft-07/schema#", "type": "string", "enum": ["AFN", "ALL", "DZD", "USD", "EUR", "AOA", "XCD", "ARS", "AMD", "AWG", "AUD", "AZN", "BSD", "BHD", "BDT", "BBD", "BYN", "BZD", "XOF", "BMD", "BTN", "INR", "BOB", "BOV", "BAM", "BWP", "NOK", "BRL", "BND", "BGN", "BIF", "CVE", "KHR", "XAF", "CAD", "KYD", "CLF", "CLP", "CNY", "COP", "COU", "KMF", "CDF", "NZD", "CRC", "CUC", "CUP", "ANG", "CZK", "DKK", "DJF", "DOP", "EGP", "SVC", "ERN", "ETB", "FKP", "FJD", "XPF", "GMD", "GEL", "GHS", "GIP", "GTQ", "GBP", "GNF", "GYD", "HTG", "HNL", "HKD", "HUF", "ISK", "IDR", "XDR", "IRR", "IQD", "ILS", "JMD", "JPY", "JOD", "KZT", "KES", "KPW", "KRW", "KWD", "KGS", "LAK", "LBP", "LSL", "ZAR", "LRD", "LYD", "CHF", "MOP", "MGA", "MWK", "MYR", "MVR", "MRU", "MUR", "XUA", "MXN", "MXV", "MDL", "MNT", "MAD", "MZN", "MMK", "NAD", "NPR", "NIO", "NGN", "OMR", "PKR", "PAB", "PGK", "PYG", "PEN", "PHP", "PLN", "QAR", "MKD", "RON", "RUB", "RWF", "SHP", "WST", "STN", "SAR", "RSD", "SCR", "SLE", "SGD", "XSU", "SBD", "SOS", "SSP", "LKR", "SDG", "SRD", "SZL", "SEK", "CHE", "CHW", "SYP", "TWD", "TJS", "TZS", "THB", "TOP", "TTD", "TND", "TRY", "TMT", "UGX", "UAH", "AED", "USN", "UYI", "UYU", "UZS", "VUV", "VEF", "VED", "VND", "YER", "ZMW", "ZWL"] }, "lcy_value": { "type": "integer", "minimum": 0 }, "lcy_currency": { "title": "LCY Currency", "$schema": "http://json-schema.org/draft-07/schema#", "type": "string", "enum": ["AFN", "ALL", "DZD", "USD", "EUR", "AOA", "XCD", "ARS", "AMD", "AWG", "AUD", "AZN", "BSD", "BHD", "BDT", "BBD", "BYN", "BZD", "XOF", "BMD", "BTN", "INR", "BOB", "BOV", "BAM", "BWP", "NOK", "BRL", "BND", "BGN", "BIF", "CVE", "KHR", "XAF", "CAD", "KYD", "CLF", "CLP", "CNY", "COP", "COU", "KMF", "CDF", "NZD", "CRC", "CUC", "CUP", "ANG", "CZK", "DKK", "DJF", "DOP", "EGP", "SVC", "ERN", "ETB", "FKP", "FJD", "XPF", "GMD", "GEL", "GHS", "GIP", "GTQ", "GBP", "GNF", "GYD", "HTG", "HNL", "HKD", "HUF", "ISK", "IDR", "XDR", "IRR", "IQD", "ILS", "JMD", "JPY", "JOD", "KZT", "KES", "KPW", "KRW", "KWD", "KGS", "LAK", "LBP", "LSL", "ZAR", "LRD", "LYD", "CHF", "MOP", "MGA", "MWK", "MYR", "MVR", "MRU", "MUR", "XUA", "MXN", "MXV", "MDL", "MNT", "MAD", "MZN", "MMK", "NAD", "NPR", "NIO", "NGN", "OMR", "PKR", "PAB", "PGK", "PYG", "PEN", "PHP", "PLN", "QAR", "MKD", "RON", "RUB", "RWF", "SHP", "WST", "STN", "SAR", "RSD", "SCR", "SLE", "SGD", "XSU", "SBD", "SOS", "SSP", "LKR", "SDG", "SRD", "SZL", "SEK", "CHE", "CHW", "SYP", "TWD", "TJS", "TZS", "THB", "TOP", "TTD", "TND", "TRY", "TMT", "UGX", "UAH", "AED", "USN", "UYI", "UYU", "UZS", "VUV", "VEF", "VED", "VND", "YER", "ZMW", "ZWL"] }, "lcy_decimal_places": { "type": "integer", "minimum": 0, "maximum": 4 } }, "required": ["value", "currency", "lcy_value", "lcy_currency", "decimal_places", "lcy_decimal_places"] }, { "type": "null" }] } }, "required": ["document_no", "document_line_no", "style_id", "colour_id", "size_code", "sku", "product_id", "season_id", "drop"], "$id": "https://shushed.example.com/stock-move.schema.json" };
|
|
4
|
-
exports.default = schema;
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const schema = { "$schema": "http://json-schema.org/draft-07/schema#", "title": "Stock Movement Schema", "type": "object", "additionalProperties": false, "properties": { "style_id": { "type": "string", "minLength": 1 }, "colour_id": { "type": "string", "minLength": 1 }, "size_code": { "type": "string", "minLength": 1 }, "location_code": { "type": "string", "pattern": "^\\d{3}-[A-Z]+$|^[A-Z]{2,}-?[A-Z]*$|^[A-Z]{2,}\\d{3}$" }, "source_system": { "type": "string", "enum": ["bc", "centra", "sitoo"] }, "quantity": { "type": "integer", "minimum": 0 }, "entry_no": { "type": "string" }, "external_entry_no": { "type": "string" }, "document_no": { "type": "string" }, "external_document_no": { "type": "string" }, "type": { "type": "string", "enum": ["transfer", "negative adjustment", "positive adjustment", "purchase", "sale"] }, "unit_cost": { "oneOf": [{ "$schema": "http://json-schema.org/draft-07/schema#", "title": "Money", "type": "object", "additionalProperties": false, "properties": { "value": { "type": "integer", "minimum": 0 }, "decimal_places": { "type": "integer", "minimum": 0, "maximum": 4 }, "currency": { "title": "Currency", "$schema": "http://json-schema.org/draft-07/schema#", "type": "string", "enum": ["AFN", "ALL", "DZD", "USD", "EUR", "AOA", "XCD", "ARS", "AMD", "AWG", "AUD", "AZN", "BSD", "BHD", "BDT", "BBD", "BYN", "BZD", "XOF", "BMD", "BTN", "INR", "BOB", "BOV", "BAM", "BWP", "NOK", "BRL", "BND", "BGN", "BIF", "CVE", "KHR", "XAF", "CAD", "KYD", "CLF", "CLP", "CNY", "COP", "COU", "KMF", "CDF", "NZD", "CRC", "CUC", "CUP", "ANG", "CZK", "DKK", "DJF", "DOP", "EGP", "SVC", "ERN", "ETB", "FKP", "FJD", "XPF", "GMD", "GEL", "GHS", "GIP", "GTQ", "GBP", "GNF", "GYD", "HTG", "HNL", "HKD", "HUF", "ISK", "IDR", "XDR", "IRR", "IQD", "ILS", "JMD", "JPY", "JOD", "KZT", "KES", "KPW", "KRW", "KWD", "KGS", "LAK", "LBP", "LSL", "ZAR", "LRD", "LYD", "CHF", "MOP", "MGA", "MWK", "MYR", "MVR", "MRU", "MUR", "XUA", "MXN", "MXV", "MDL", "MNT", "MAD", "MZN", "MMK", "NAD", "NPR", "NIO", "NGN", "OMR", "PKR", "PAB", "PGK", "PYG", "PEN", "PHP", "PLN", "QAR", "MKD", "RON", "RUB", "RWF", "SHP", "WST", "STN", "SAR", "RSD", "SCR", "SLE", "SGD", "XSU", "SBD", "SOS", "SSP", "LKR", "SDG", "SRD", "SZL", "SEK", "CHE", "CHW", "SYP", "TWD", "TJS", "TZS", "THB", "TOP", "TTD", "TND", "TRY", "TMT", "UGX", "UAH", "AED", "USN", "UYI", "UYU", "UZS", "VUV", "VEF", "VED", "VND", "YER", "ZMW", "ZWL"] }, "lcy_value": { "type": "integer", "minimum": 0 }, "lcy_currency": { "title": "LCY Currency", "$schema": "http://json-schema.org/draft-07/schema#", "type": "string", "enum": ["AFN", "ALL", "DZD", "USD", "EUR", "AOA", "XCD", "ARS", "AMD", "AWG", "AUD", "AZN", "BSD", "BHD", "BDT", "BBD", "BYN", "BZD", "XOF", "BMD", "BTN", "INR", "BOB", "BOV", "BAM", "BWP", "NOK", "BRL", "BND", "BGN", "BIF", "CVE", "KHR", "XAF", "CAD", "KYD", "CLF", "CLP", "CNY", "COP", "COU", "KMF", "CDF", "NZD", "CRC", "CUC", "CUP", "ANG", "CZK", "DKK", "DJF", "DOP", "EGP", "SVC", "ERN", "ETB", "FKP", "FJD", "XPF", "GMD", "GEL", "GHS", "GIP", "GTQ", "GBP", "GNF", "GYD", "HTG", "HNL", "HKD", "HUF", "ISK", "IDR", "XDR", "IRR", "IQD", "ILS", "JMD", "JPY", "JOD", "KZT", "KES", "KPW", "KRW", "KWD", "KGS", "LAK", "LBP", "LSL", "ZAR", "LRD", "LYD", "CHF", "MOP", "MGA", "MWK", "MYR", "MVR", "MRU", "MUR", "XUA", "MXN", "MXV", "MDL", "MNT", "MAD", "MZN", "MMK", "NAD", "NPR", "NIO", "NGN", "OMR", "PKR", "PAB", "PGK", "PYG", "PEN", "PHP", "PLN", "QAR", "MKD", "RON", "RUB", "RWF", "SHP", "WST", "STN", "SAR", "RSD", "SCR", "SLE", "SGD", "XSU", "SBD", "SOS", "SSP", "LKR", "SDG", "SRD", "SZL", "SEK", "CHE", "CHW", "SYP", "TWD", "TJS", "TZS", "THB", "TOP", "TTD", "TND", "TRY", "TMT", "UGX", "UAH", "AED", "USN", "UYI", "UYU", "UZS", "VUV", "VEF", "VED", "VND", "YER", "ZMW", "ZWL"] }, "lcy_decimal_places": { "type": "integer", "minimum": 0, "maximum": 4 } }, "required": ["value", "currency", "lcy_value", "lcy_currency", "decimal_places", "lcy_decimal_places"] }, { "type": "null" }] }, "document_date": { "type": "string", "format": "date" }, "posting_date": { "type": "string", "format": "date" }, "created_at": { "type": "string", "format": "date-time" }, "last_modified_at": { "type": "string", "format": "date-time" } }, "required": ["style_id", "source_system", "location_code", "colour_id", "size_code", "last_modified_at", "quantity", "created_at", "document_date", "type"], "$id": "https://shushed.example.com/stock-move.schema.json" };
|
|
4
|
-
exports.default = schema;
|
|
@@ -1,349 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.SitooOrderItemType = exports.SitooPaymentState = exports.SitooOrderType = exports.SitooOrderState = void 0;
|
|
7
|
-
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
-
const lodash_groupby_1 = __importDefault(require("lodash.groupby"));
|
|
9
|
-
const env_1 = __importDefault(require("./env"));
|
|
10
|
-
const SITOO_TR_TYPE_MANUAL_IN = 10;
|
|
11
|
-
const SITOO_TR_TYPE_MANUAL_OUT = 20;
|
|
12
|
-
var SitooOrderState;
|
|
13
|
-
(function (SitooOrderState) {
|
|
14
|
-
SitooOrderState[SitooOrderState["Abandoned"] = -1] = "Abandoned";
|
|
15
|
-
SitooOrderState[SitooOrderState["Open"] = 0] = "Open";
|
|
16
|
-
SitooOrderState[SitooOrderState["Closed"] = 10] = "Closed";
|
|
17
|
-
SitooOrderState[SitooOrderState["Cancelled"] = 20] = "Cancelled";
|
|
18
|
-
})(SitooOrderState || (exports.SitooOrderState = SitooOrderState = {}));
|
|
19
|
-
var SitooOrderType;
|
|
20
|
-
(function (SitooOrderType) {
|
|
21
|
-
SitooOrderType[SitooOrderType["Order"] = 10] = "Order";
|
|
22
|
-
SitooOrderType[SitooOrderType["Booking"] = 100] = "Booking";
|
|
23
|
-
SitooOrderType[SitooOrderType["POSParked"] = 110] = "POSParked";
|
|
24
|
-
})(SitooOrderType || (exports.SitooOrderType = SitooOrderType = {}));
|
|
25
|
-
var SitooPaymentState;
|
|
26
|
-
(function (SitooPaymentState) {
|
|
27
|
-
SitooPaymentState[SitooPaymentState["None"] = 0] = "None";
|
|
28
|
-
SitooPaymentState[SitooPaymentState["Pending"] = 10] = "Pending";
|
|
29
|
-
SitooPaymentState[SitooPaymentState["Reserved"] = 15] = "Reserved";
|
|
30
|
-
SitooPaymentState[SitooPaymentState["Successful"] = 20] = "Successful";
|
|
31
|
-
SitooPaymentState[SitooPaymentState["Cancelled"] = 30] = "Cancelled";
|
|
32
|
-
SitooPaymentState[SitooPaymentState["Failed"] = 40] = "Failed";
|
|
33
|
-
})(SitooPaymentState || (exports.SitooPaymentState = SitooPaymentState = {}));
|
|
34
|
-
var SitooOrderItemType;
|
|
35
|
-
(function (SitooOrderItemType) {
|
|
36
|
-
SitooOrderItemType[SitooOrderItemType["Product"] = 10] = "Product";
|
|
37
|
-
SitooOrderItemType[SitooOrderItemType["Discount"] = 20] = "Discount";
|
|
38
|
-
})(SitooOrderItemType || (exports.SitooOrderItemType = SitooOrderItemType = {}));
|
|
39
|
-
const BATCH_SIZE = 900;
|
|
40
|
-
class SitooHelper extends env_1.default {
|
|
41
|
-
opts;
|
|
42
|
-
shaToken;
|
|
43
|
-
baseUrl;
|
|
44
|
-
siteId;
|
|
45
|
-
constructor(options, opts) {
|
|
46
|
-
super(options);
|
|
47
|
-
this.opts = opts;
|
|
48
|
-
this.shaToken = crypto_1.default.createHash('sha256').update(opts.accessToken).digest('hex').slice(0, 8);
|
|
49
|
-
this.baseUrl = opts.sitooBaseUrl.replace(/\/$/, '');
|
|
50
|
-
this.siteId = opts.sitooSiteId;
|
|
51
|
-
}
|
|
52
|
-
async getAllOrders(options) {
|
|
53
|
-
const allOrders = [];
|
|
54
|
-
const pageSize = 100;
|
|
55
|
-
let start = 0;
|
|
56
|
-
let hasMore = true;
|
|
57
|
-
while (hasMore) {
|
|
58
|
-
const queryParams = new URLSearchParams();
|
|
59
|
-
queryParams.set('num', pageSize.toString());
|
|
60
|
-
queryParams.set('start', start.toString());
|
|
61
|
-
queryParams.set('sort', 'orderid');
|
|
62
|
-
if (options?.fromTimestamp !== undefined) {
|
|
63
|
-
queryParams.set('orderdatefrom', options.fromTimestamp.toString());
|
|
64
|
-
}
|
|
65
|
-
if (options?.untilTimestamp !== undefined) {
|
|
66
|
-
queryParams.set('orderdateto', options.untilTimestamp.toString());
|
|
67
|
-
}
|
|
68
|
-
if (options?.filterByState !== undefined) {
|
|
69
|
-
queryParams.set('orderstate', options.filterByState.toString());
|
|
70
|
-
}
|
|
71
|
-
const url = `${this.baseUrl}/sites/${this.siteId}/orders.json?${queryParams.toString()}`;
|
|
72
|
-
const response = await fetch(url, {
|
|
73
|
-
method: 'GET',
|
|
74
|
-
headers: {
|
|
75
|
-
'Authorization': `Basic ${this.opts.accessToken}`,
|
|
76
|
-
'Content-Type': 'application/json',
|
|
77
|
-
},
|
|
78
|
-
});
|
|
79
|
-
if (!response.ok) {
|
|
80
|
-
const errorText = await response.text().catch(() => 'Unknown error');
|
|
81
|
-
throw new Error(`Sitoo API error: ${response.status} ${response.statusText} - ${errorText}`);
|
|
82
|
-
}
|
|
83
|
-
const envelope = await response.json();
|
|
84
|
-
allOrders.push(...envelope.items);
|
|
85
|
-
if (envelope.items.length < pageSize) {
|
|
86
|
-
hasMore = false;
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
start += envelope.items.length;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return allOrders;
|
|
93
|
-
}
|
|
94
|
-
async getSitooWarehouses() {
|
|
95
|
-
const url = `${this.baseUrl}/sites/${this.siteId}/warehouses.json`;
|
|
96
|
-
const response = await fetch(url, {
|
|
97
|
-
method: 'GET',
|
|
98
|
-
headers: {
|
|
99
|
-
'Authorization': `Basic ${this.opts.accessToken}`,
|
|
100
|
-
'Content-Type': 'application/json',
|
|
101
|
-
},
|
|
102
|
-
});
|
|
103
|
-
if (!response.ok) {
|
|
104
|
-
const errorText = await response.text().catch(() => 'Unknown error');
|
|
105
|
-
throw new Error(`Sitoo API error: ${response.status} ${response.statusText} - ${errorText}`);
|
|
106
|
-
}
|
|
107
|
-
const data = await response.json();
|
|
108
|
-
const nameToId = {};
|
|
109
|
-
const warehouses = {};
|
|
110
|
-
for (const warehouse of data.items) {
|
|
111
|
-
nameToId[warehouse.name] = warehouse.warehouseid;
|
|
112
|
-
warehouses[warehouse.warehouseid] = warehouse;
|
|
113
|
-
}
|
|
114
|
-
return { nameToId, warehouses };
|
|
115
|
-
}
|
|
116
|
-
async fetchWarehouseTransactionsWithFilter(params) {
|
|
117
|
-
const queryParams = new URLSearchParams();
|
|
118
|
-
queryParams.set('num', (params.num || 100).toString());
|
|
119
|
-
if (params.transactiontype !== undefined) {
|
|
120
|
-
queryParams.set('transactiontype', params.transactiontype.toString());
|
|
121
|
-
}
|
|
122
|
-
if (params.datecreatedfrom !== undefined) {
|
|
123
|
-
queryParams.set('datecreatedfrom', params.datecreatedfrom.toString());
|
|
124
|
-
}
|
|
125
|
-
if (params.start !== undefined) {
|
|
126
|
-
queryParams.set('start', params.start.toString());
|
|
127
|
-
}
|
|
128
|
-
queryParams.set('sort', params.ascending ? 'warehousetransactionid' : '-warehousetransactionid');
|
|
129
|
-
const url = `${this.baseUrl}/sites/${this.siteId}/warehouses/${params.warehouseid}/warehousetransactions.json?${queryParams.toString()}`;
|
|
130
|
-
const response = await fetch(url, {
|
|
131
|
-
method: 'GET',
|
|
132
|
-
headers: {
|
|
133
|
-
'Authorization': `Basic ${this.opts.accessToken}`,
|
|
134
|
-
'Content-Type': 'application/json',
|
|
135
|
-
},
|
|
136
|
-
});
|
|
137
|
-
if (!response.ok) {
|
|
138
|
-
const errorText = await response.text().catch(() => 'Unknown error');
|
|
139
|
-
throw new Error(`Sitoo API error: ${response.status} ${response.statusText} - ${errorText}`);
|
|
140
|
-
}
|
|
141
|
-
return await response.json();
|
|
142
|
-
}
|
|
143
|
-
async searchTransactionsInApi(warehouseId, entryNosToFind, transactionType, datecreatedfrom) {
|
|
144
|
-
const found = new Map();
|
|
145
|
-
let lowestTransactionId = undefined;
|
|
146
|
-
if (entryNosToFind.size === 0) {
|
|
147
|
-
return { found, lowestTransactionId };
|
|
148
|
-
}
|
|
149
|
-
let hasMore = true;
|
|
150
|
-
const pageSize = 100;
|
|
151
|
-
const currentDateFrom = datecreatedfrom;
|
|
152
|
-
let currentStart = 0;
|
|
153
|
-
while (hasMore && found.size < entryNosToFind.size) {
|
|
154
|
-
const envelope = await this.fetchWarehouseTransactionsWithFilter({
|
|
155
|
-
warehouseid: warehouseId,
|
|
156
|
-
datecreatedfrom: currentDateFrom,
|
|
157
|
-
transactiontype: transactionType,
|
|
158
|
-
ascending: false,
|
|
159
|
-
num: pageSize,
|
|
160
|
-
start: currentStart,
|
|
161
|
-
});
|
|
162
|
-
const transactions = envelope.items;
|
|
163
|
-
if (transactions.length === 0) {
|
|
164
|
-
hasMore = false;
|
|
165
|
-
break;
|
|
166
|
-
}
|
|
167
|
-
for (const transaction of transactions) {
|
|
168
|
-
if (lowestTransactionId === undefined || transaction.warehousetransactionid < lowestTransactionId) {
|
|
169
|
-
lowestTransactionId = transaction.warehousetransactionid;
|
|
170
|
-
}
|
|
171
|
-
if (transaction.description) {
|
|
172
|
-
for (const entryNo of entryNosToFind) {
|
|
173
|
-
if (!found.has(entryNo) && transaction.description.includes(`'${entryNo}'`)) {
|
|
174
|
-
found.set(entryNo, transaction);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
if (found.size === entryNosToFind.size) {
|
|
179
|
-
break;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
currentStart = currentStart ? currentStart + transactions.length : transactions.length;
|
|
183
|
-
if (transactions.length < pageSize) {
|
|
184
|
-
hasMore = false;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
return { found, lowestTransactionId };
|
|
188
|
-
}
|
|
189
|
-
async batchAddWarehouseTransactions(transactions) {
|
|
190
|
-
if (transactions.length === 0)
|
|
191
|
-
return [];
|
|
192
|
-
if (transactions.length > BATCH_SIZE) {
|
|
193
|
-
throw new Error(`Batch size exceeds maximum of ${BATCH_SIZE}. Got ${transactions.length}`);
|
|
194
|
-
}
|
|
195
|
-
const url = `${this.baseUrl}/sites/${this.siteId}/warehousetransactions.json`;
|
|
196
|
-
const response = await fetch(url, {
|
|
197
|
-
method: 'POST',
|
|
198
|
-
headers: {
|
|
199
|
-
'Authorization': `Basic ${this.opts.accessToken}`,
|
|
200
|
-
'Content-Type': 'application/json',
|
|
201
|
-
},
|
|
202
|
-
body: JSON.stringify(transactions),
|
|
203
|
-
});
|
|
204
|
-
if (!response.ok) {
|
|
205
|
-
const errorText = await response.text().catch(() => 'Unknown error');
|
|
206
|
-
throw new Error(`Sitoo API error: ${response.status} ${response.statusText} - ${errorText}`);
|
|
207
|
-
}
|
|
208
|
-
const result = await response.json();
|
|
209
|
-
return result;
|
|
210
|
-
}
|
|
211
|
-
async syncWarehouseTransactions(items, options) {
|
|
212
|
-
if (items.length === 0) {
|
|
213
|
-
return [];
|
|
214
|
-
}
|
|
215
|
-
const locationCodeToWarehouse = (await this.getSitooWarehouses()).nameToId;
|
|
216
|
-
const foundEntryNos = new Map();
|
|
217
|
-
const results = {};
|
|
218
|
-
const entryNoToIdx = {};
|
|
219
|
-
const entriesByWarehouseAndTransactionType = new Map();
|
|
220
|
-
for (let i = 0; i < items.length; i++) {
|
|
221
|
-
const entry = items[i];
|
|
222
|
-
const warehouseId = locationCodeToWarehouse[entry.location_code];
|
|
223
|
-
const transactionType = entry.type === 'transfer' ? (entry.quantity > 0 ? SITOO_TR_TYPE_MANUAL_IN : SITOO_TR_TYPE_MANUAL_OUT) : undefined;
|
|
224
|
-
entryNoToIdx[entry.entry_no] = i;
|
|
225
|
-
if (transactionType === undefined) {
|
|
226
|
-
results[i] = {
|
|
227
|
-
error: false,
|
|
228
|
-
message: `Not supported transaction type: ${entry.type}`,
|
|
229
|
-
};
|
|
230
|
-
continue;
|
|
231
|
-
}
|
|
232
|
-
if (warehouseId === undefined) {
|
|
233
|
-
results[i] = {
|
|
234
|
-
error: false,
|
|
235
|
-
message: `Not supported warehouse in Sitoo: ${entry.location_code}`,
|
|
236
|
-
};
|
|
237
|
-
continue;
|
|
238
|
-
}
|
|
239
|
-
const key = `${warehouseId}-${transactionType}`;
|
|
240
|
-
if (!entriesByWarehouseAndTransactionType.has(key)) {
|
|
241
|
-
entriesByWarehouseAndTransactionType.set(key, []);
|
|
242
|
-
}
|
|
243
|
-
entriesByWarehouseAndTransactionType.get(key).push(entry);
|
|
244
|
-
}
|
|
245
|
-
for (const [_, warehouseEntries] of entriesByWarehouseAndTransactionType) {
|
|
246
|
-
if (warehouseEntries.length > 0) {
|
|
247
|
-
let datecreatedfrom = undefined;
|
|
248
|
-
for (const entry of warehouseEntries) {
|
|
249
|
-
const entryCreatedAt = Math.floor(new Date(entry.created_at).getTime() / 1000);
|
|
250
|
-
if (datecreatedfrom === undefined || entryCreatedAt < datecreatedfrom) {
|
|
251
|
-
datecreatedfrom = entryCreatedAt;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
const { found: apiFound } = await this.searchTransactionsInApi(locationCodeToWarehouse[warehouseEntries[0].location_code], new Set(warehouseEntries.map(e => e.entry_no.toString())), warehouseEntries[0].quantity > 0 ? SITOO_TR_TYPE_MANUAL_IN : SITOO_TR_TYPE_MANUAL_OUT, datecreatedfrom);
|
|
255
|
-
for (const [entryNo, transaction] of apiFound) {
|
|
256
|
-
foundEntryNos.set(entryNo, transaction.warehousetransactionid);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
for (const [entryNo, transactionId] of foundEntryNos) {
|
|
261
|
-
const idx = entryNoToIdx[entryNo];
|
|
262
|
-
results[idx] = {
|
|
263
|
-
error: false,
|
|
264
|
-
message: `Found transaction in Sitoo: ${transactionId} for the entry ${entryNo}`,
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
const batches = [[]];
|
|
268
|
-
for (const [_, warehouseEntries] of entriesByWarehouseAndTransactionType) {
|
|
269
|
-
for (let i = 0; i < warehouseEntries.length; i += 1) {
|
|
270
|
-
if (!foundEntryNos.has(warehouseEntries[i].entry_no)) {
|
|
271
|
-
if ((batches[batches.length - 1].length + 1) >= BATCH_SIZE) {
|
|
272
|
-
batches.push([]);
|
|
273
|
-
}
|
|
274
|
-
batches[batches.length - 1].push(warehouseEntries[i]);
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
const hasMissingEntries = batches[0].length > 0;
|
|
279
|
-
if (!options?.preview && hasMissingEntries) {
|
|
280
|
-
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'}`);
|
|
282
|
-
const entryNosInBatches = {};
|
|
283
|
-
const transactionsToCreate = [];
|
|
284
|
-
for (const k in warehouseEntities) {
|
|
285
|
-
const entriesToCreate = warehouseEntities[k];
|
|
286
|
-
const warehouseId = locationCodeToWarehouse[entriesToCreate[0].location_code];
|
|
287
|
-
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);
|
|
289
|
-
transactionsToCreate.push({
|
|
290
|
-
warehouseid: warehouseId,
|
|
291
|
-
transactiontype: entryType,
|
|
292
|
-
description: entriesToCreate.map(e => `'${e.entry_no}'`).join(', '),
|
|
293
|
-
items: entriesToCreate.map(e => ({
|
|
294
|
-
sku: [e.style_id, e.colour_id, e.size_code].filter(Boolean).join('-'),
|
|
295
|
-
decimalquantity: `${e.quantity.toFixed(3)}`,
|
|
296
|
-
moneypricein: (((e.unit_cost?.value ?? 0) / 100) * e.quantity).toFixed(2),
|
|
297
|
-
})),
|
|
298
|
-
});
|
|
299
|
-
}
|
|
300
|
-
try {
|
|
301
|
-
const createdIds = await this.batchAddWarehouseTransactions(transactionsToCreate);
|
|
302
|
-
for (let j = 0; j < transactionsToCreate.length; j++) {
|
|
303
|
-
const transactionId = createdIds[j];
|
|
304
|
-
for (let k = 0; k < entryNosInBatches[j].length; k += 1) {
|
|
305
|
-
const entryNo = entryNosInBatches[j][k];
|
|
306
|
-
const idx = entryNoToIdx[entryNo];
|
|
307
|
-
results[idx] = {
|
|
308
|
-
entryNo: entryNo,
|
|
309
|
-
transactionId: transactionId,
|
|
310
|
-
};
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
catch (error) {
|
|
315
|
-
for (const entry of batches[i]) {
|
|
316
|
-
const idx = entryNoToIdx[entry.entry_no];
|
|
317
|
-
results[idx] = error;
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
else {
|
|
323
|
-
for (let i = 0; i < batches.length; i++) {
|
|
324
|
-
for (let j = 0; j < batches[i].length; j += 1) {
|
|
325
|
-
const entry = batches[i][j];
|
|
326
|
-
const idx = entryNoToIdx[entry.entry_no];
|
|
327
|
-
const warehouseId = locationCodeToWarehouse[entry.location_code];
|
|
328
|
-
const transactionType = entry.quantity > 0 ? SITOO_TR_TYPE_MANUAL_IN : SITOO_TR_TYPE_MANUAL_OUT;
|
|
329
|
-
results[idx] = {
|
|
330
|
-
error: false,
|
|
331
|
-
message: `In Preview Mode. ${entry.entry_no} scheduled to be created as transction type: ${transactionType} in the warehouse: ${warehouseId}. Batch: ${i}`
|
|
332
|
-
};
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
const resultsAsArray = [];
|
|
337
|
-
for (let i = 0; i < items.length; i += 1) {
|
|
338
|
-
const result = results[i];
|
|
339
|
-
if (!result) {
|
|
340
|
-
resultsAsArray.push(new Error(`${items[i].entry_no} got missed in processing`));
|
|
341
|
-
}
|
|
342
|
-
else {
|
|
343
|
-
resultsAsArray.push(result);
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
return resultsAsArray;
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
exports.default = SitooHelper;
|