@orchesty/connector-base 1.0.0

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 (165) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE +190 -0
  3. package/coverage/clover.xml +328 -0
  4. package/coverage/coverage-final.json +21 -0
  5. package/coverage/lcov-report/base.css +224 -0
  6. package/coverage/lcov-report/block-navigation.js +87 -0
  7. package/coverage/lcov-report/favicon.png +0 -0
  8. package/coverage/lcov-report/index.html +161 -0
  9. package/coverage/lcov-report/prettify.css +1 -0
  10. package/coverage/lcov-report/prettify.js +2 -0
  11. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  12. package/coverage/lcov-report/sorter.js +210 -0
  13. package/coverage/lcov-report/src/BaseApplication.ts.html +286 -0
  14. package/coverage/lcov-report/src/Batch/ABaseBatch.ts.html +337 -0
  15. package/coverage/lcov-report/src/Batch/InventoryProductsData.ts.html +385 -0
  16. package/coverage/lcov-report/src/Batch/InventoryProductsList.ts.html +388 -0
  17. package/coverage/lcov-report/src/Batch/JournalList.ts.html +319 -0
  18. package/coverage/lcov-report/src/Batch/OrderExtraFields.ts.html +220 -0
  19. package/coverage/lcov-report/src/Batch/index.html +176 -0
  20. package/coverage/lcov-report/src/Connector/ABaseConnector.ts.html +250 -0
  21. package/coverage/lcov-report/src/Connector/CourierFields.ts.html +244 -0
  22. package/coverage/lcov-report/src/Connector/CouriersList.ts.html +151 -0
  23. package/coverage/lcov-report/src/Connector/CreatePackage.ts.html +268 -0
  24. package/coverage/lcov-report/src/Connector/CreatePackageManual.ts.html +223 -0
  25. package/coverage/lcov-report/src/Connector/GetLabel.ts.html +205 -0
  26. package/coverage/lcov-report/src/Connector/Inventories.ts.html +187 -0
  27. package/coverage/lcov-report/src/Connector/InventoryWarehouses.ts.html +172 -0
  28. package/coverage/lcov-report/src/Connector/OrderPaymentsHistory.ts.html +229 -0
  29. package/coverage/lcov-report/src/Connector/OrderStatusList.ts.html +163 -0
  30. package/coverage/lcov-report/src/Connector/Orders.ts.html +529 -0
  31. package/coverage/lcov-report/src/Connector/SetOrderStatus.ts.html +178 -0
  32. package/coverage/lcov-report/src/Connector/UpdateInventoryProductsStock.ts.html +193 -0
  33. package/coverage/lcov-report/src/Connector/index.html +296 -0
  34. package/coverage/lcov-report/src/index.html +116 -0
  35. package/coverage/lcov-report/test/dataProvider.ts.html +232 -0
  36. package/coverage/lcov-report/test/index.html +116 -0
  37. package/coverage/lcov.info +620 -0
  38. package/dist/BaseApplication.d.ts +17 -0
  39. package/dist/BaseApplication.js +50 -0
  40. package/dist/Batch/ABaseBatch.d.ts +19 -0
  41. package/dist/Batch/ABaseBatch.js +60 -0
  42. package/dist/Batch/InventoryProductsData.d.ts +53 -0
  43. package/dist/Batch/InventoryProductsData.js +43 -0
  44. package/dist/Batch/InventoryProductsList.d.ts +37 -0
  45. package/dist/Batch/InventoryProductsList.js +51 -0
  46. package/dist/Batch/JournalList.d.ts +27 -0
  47. package/dist/Batch/JournalList.js +39 -0
  48. package/dist/Batch/OrderExtraFields.d.ts +17 -0
  49. package/dist/Batch/OrderExtraFields.js +26 -0
  50. package/dist/Connector/ABaseConnector.d.ts +16 -0
  51. package/dist/Connector/ABaseConnector.js +39 -0
  52. package/dist/Connector/CourierFields.d.ts +30 -0
  53. package/dist/Connector/CourierFields.js +23 -0
  54. package/dist/Connector/CouriersList.d.ts +12 -0
  55. package/dist/Connector/CouriersList.js +17 -0
  56. package/dist/Connector/CreatePackage.d.ts +28 -0
  57. package/dist/Connector/CreatePackage.js +32 -0
  58. package/dist/Connector/CreatePackageManual.d.ts +19 -0
  59. package/dist/Connector/CreatePackageManual.js +27 -0
  60. package/dist/Connector/GetLabel.d.ts +17 -0
  61. package/dist/Connector/GetLabel.js +25 -0
  62. package/dist/Connector/Inventories.d.ts +21 -0
  63. package/dist/Connector/Inventories.js +17 -0
  64. package/dist/Connector/InventoryWarehouses.d.ts +16 -0
  65. package/dist/Connector/InventoryWarehouses.js +17 -0
  66. package/dist/Connector/OrderPaymentsHistory.d.ts +23 -0
  67. package/dist/Connector/OrderPaymentsHistory.js +24 -0
  68. package/dist/Connector/OrderStatusList.d.ts +13 -0
  69. package/dist/Connector/OrderStatusList.js +17 -0
  70. package/dist/Connector/Orders.d.ts +101 -0
  71. package/dist/Connector/Orders.js +33 -0
  72. package/dist/Connector/SetOrderStatus.d.ts +12 -0
  73. package/dist/Connector/SetOrderStatus.js +24 -0
  74. package/dist/Connector/UpdateInventoryProductsStock.d.ts +16 -0
  75. package/dist/Connector/UpdateInventoryProductsStock.js +24 -0
  76. package/dist/package.json +23 -0
  77. package/jest.config.js +13 -0
  78. package/package.json +23 -0
  79. package/src/BaseApplication.ts +67 -0
  80. package/src/Batch/ABaseBatch.ts +84 -0
  81. package/src/Batch/InventoryProductsData.ts +100 -0
  82. package/src/Batch/InventoryProductsList.ts +101 -0
  83. package/src/Batch/JournalList.ts +78 -0
  84. package/src/Batch/OrderExtraFields.ts +45 -0
  85. package/src/Batch/__tests__/Data/InventoryProductsData/input.json +6 -0
  86. package/src/Batch/__tests__/Data/InventoryProductsData/mock.json +82 -0
  87. package/src/Batch/__tests__/Data/InventoryProductsData/output.json +11 -0
  88. package/src/Batch/__tests__/Data/InventoryProductsList/input.json +8 -0
  89. package/src/Batch/__tests__/Data/InventoryProductsList/mock.json +37 -0
  90. package/src/Batch/__tests__/Data/InventoryProductsList/output.json +15 -0
  91. package/src/Batch/__tests__/Data/JournalList/input.json +9 -0
  92. package/src/Batch/__tests__/Data/JournalList/mock.json +23 -0
  93. package/src/Batch/__tests__/Data/JournalList/output.json +15 -0
  94. package/src/Batch/__tests__/Data/OrderExtraFields/input.json +6 -0
  95. package/src/Batch/__tests__/Data/OrderExtraFields/mock.json +23 -0
  96. package/src/Batch/__tests__/Data/OrderExtraFields/output.json +15 -0
  97. package/src/Batch/__tests__/InventoryProductsData.ts +17 -0
  98. package/src/Batch/__tests__/InventoryProductsList.ts +17 -0
  99. package/src/Batch/__tests__/JournalList.ts +17 -0
  100. package/src/Batch/__tests__/OrderExtraFields.ts +17 -0
  101. package/src/Connector/ABaseConnector.ts +55 -0
  102. package/src/Connector/CourierFields.ts +53 -0
  103. package/src/Connector/CouriersList.ts +22 -0
  104. package/src/Connector/CreatePackage.ts +61 -0
  105. package/src/Connector/CreatePackageManual.ts +46 -0
  106. package/src/Connector/GetLabel.ts +40 -0
  107. package/src/Connector/Inventories.ts +34 -0
  108. package/src/Connector/InventoryWarehouses.ts +29 -0
  109. package/src/Connector/OrderPaymentsHistory.ts +48 -0
  110. package/src/Connector/OrderStatusList.ts +26 -0
  111. package/src/Connector/Orders.ts +148 -0
  112. package/src/Connector/SetOrderStatus.ts +31 -0
  113. package/src/Connector/UpdateInventoryProductsStock.ts +36 -0
  114. package/src/Connector/__tests__/CourierFields.ts +17 -0
  115. package/src/Connector/__tests__/CouriersList.ts +17 -0
  116. package/src/Connector/__tests__/CreatePackage.ts +17 -0
  117. package/src/Connector/__tests__/CreatePackageManual.ts +17 -0
  118. package/src/Connector/__tests__/Data/CourierFields/input.json +8 -0
  119. package/src/Connector/__tests__/Data/CourierFields/mock.json +106 -0
  120. package/src/Connector/__tests__/Data/CourierFields/output.json +106 -0
  121. package/src/Connector/__tests__/Data/CouriersList/input.json +6 -0
  122. package/src/Connector/__tests__/Data/CouriersList/mock.json +57 -0
  123. package/src/Connector/__tests__/Data/CouriersList/output.json +57 -0
  124. package/src/Connector/__tests__/Data/CreatePackage/input.json +37 -0
  125. package/src/Connector/__tests__/Data/CreatePackage/mock.json +10 -0
  126. package/src/Connector/__tests__/Data/CreatePackage/output.json +10 -0
  127. package/src/Connector/__tests__/Data/CreatePackageManual/input.json +12 -0
  128. package/src/Connector/__tests__/Data/CreatePackageManual/mock.json +9 -0
  129. package/src/Connector/__tests__/Data/CreatePackageManual/output.json +9 -0
  130. package/src/Connector/__tests__/Data/GetLabel/input.json +9 -0
  131. package/src/Connector/__tests__/Data/GetLabel/mock.json +9 -0
  132. package/src/Connector/__tests__/Data/GetLabel/output.json +9 -0
  133. package/src/Connector/__tests__/Data/Inventories/input.json +6 -0
  134. package/src/Connector/__tests__/Data/Inventories/mock.json +51 -0
  135. package/src/Connector/__tests__/Data/Inventories/output.json +51 -0
  136. package/src/Connector/__tests__/Data/InventoryWarehouses/input.json +6 -0
  137. package/src/Connector/__tests__/Data/InventoryWarehouses/mock.json +25 -0
  138. package/src/Connector/__tests__/Data/InventoryWarehouses/output.json +25 -0
  139. package/src/Connector/__tests__/Data/OrderPaymentsHistory/input.json +8 -0
  140. package/src/Connector/__tests__/Data/OrderPaymentsHistory/mock.json +18 -0
  141. package/src/Connector/__tests__/Data/OrderPaymentsHistory/output.json +18 -0
  142. package/src/Connector/__tests__/Data/OrderStatusList/input.json +6 -0
  143. package/src/Connector/__tests__/Data/OrderStatusList/mock.json +54 -0
  144. package/src/Connector/__tests__/Data/OrderStatusList/output.json +54 -0
  145. package/src/Connector/__tests__/Data/Orders/input.json +8 -0
  146. package/src/Connector/__tests__/Data/Orders/mock.json +89 -0
  147. package/src/Connector/__tests__/Data/Orders/output.json +89 -0
  148. package/src/Connector/__tests__/Data/SetOrderStatus/input.json +9 -0
  149. package/src/Connector/__tests__/Data/SetOrderStatus/mock.json +7 -0
  150. package/src/Connector/__tests__/Data/SetOrderStatus/output.json +6 -0
  151. package/src/Connector/__tests__/Data/UpdateInventoryProductsStock/input.json +18 -0
  152. package/src/Connector/__tests__/Data/UpdateInventoryProductsStock/mock.json +9 -0
  153. package/src/Connector/__tests__/Data/UpdateInventoryProductsStock/output.json +9 -0
  154. package/src/Connector/__tests__/GetLabel.ts +17 -0
  155. package/src/Connector/__tests__/Inventories.ts +17 -0
  156. package/src/Connector/__tests__/InventoryWarehouses.ts +17 -0
  157. package/src/Connector/__tests__/OrderPaymentsHistory.ts +17 -0
  158. package/src/Connector/__tests__/OrderStatusList.ts +17 -0
  159. package/src/Connector/__tests__/Orders.ts +17 -0
  160. package/src/Connector/__tests__/SetOrderStatus.ts +17 -0
  161. package/src/Connector/__tests__/UpdateInventoryProductsStock.ts +17 -0
  162. package/test/dataProvider.ts +49 -0
  163. package/tsconfig.json +8 -0
  164. package/tsconfig.prod.json +13 -0
  165. package/tsconfig.prod.tsbuildinfo +1 -0
@@ -0,0 +1,17 @@
1
+ import { ApplicationInstall } from '@orchesty/nodejs-sdk/dist/lib/Application/Database/ApplicationInstall';
2
+ import FormStack from '@orchesty/nodejs-sdk/dist/lib/Application/Model/Form/FormStack';
3
+ import { ABasicApplication } from '@orchesty/nodejs-sdk/dist/lib/Authorization/Type/Basic/ABasicApplication';
4
+ import RequestDto from '@orchesty/nodejs-sdk/dist/lib/Transport/Curl/RequestDto';
5
+ import { HttpMethods } from '@orchesty/nodejs-sdk/dist/lib/Transport/HttpMethods';
6
+ import AProcessDto from '@orchesty/nodejs-sdk/dist/lib/Utils/AProcessDto';
7
+ export declare const TOKEN_HEADER = "X-BLToken";
8
+ export declare const BASE_URL = "https://api.baselinker.com/connector.php";
9
+ export declare const NAME = "base";
10
+ export default class BaseApplication extends ABasicApplication {
11
+ getName(): string;
12
+ getPublicName(): string;
13
+ getDescription(): string;
14
+ getLogo(): string;
15
+ getFormStack(): FormStack;
16
+ getRequestDto(dto: AProcessDto, applicationInstall: ApplicationInstall, method: HttpMethods, url?: string, data?: unknown): RequestDto;
17
+ }
@@ -0,0 +1,50 @@
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.NAME = exports.BASE_URL = exports.TOKEN_HEADER = void 0;
7
+ const CoreFormsEnum_1 = __importDefault(require("@orchesty/nodejs-sdk/dist/lib/Application/Base/CoreFormsEnum"));
8
+ const Field_1 = __importDefault(require("@orchesty/nodejs-sdk/dist/lib/Application/Model/Form/Field"));
9
+ const FieldType_1 = __importDefault(require("@orchesty/nodejs-sdk/dist/lib/Application/Model/Form/FieldType"));
10
+ const Form_1 = __importDefault(require("@orchesty/nodejs-sdk/dist/lib/Application/Model/Form/Form"));
11
+ const FormStack_1 = __importDefault(require("@orchesty/nodejs-sdk/dist/lib/Application/Model/Form/FormStack"));
12
+ const ABasicApplication_1 = require("@orchesty/nodejs-sdk/dist/lib/Authorization/Type/Basic/ABasicApplication");
13
+ const RequestDto_1 = __importDefault(require("@orchesty/nodejs-sdk/dist/lib/Transport/Curl/RequestDto"));
14
+ const Headers_1 = require("@orchesty/nodejs-sdk/dist/lib/Utils/Headers");
15
+ exports.TOKEN_HEADER = 'X-BLToken';
16
+ exports.BASE_URL = 'https://api.baselinker.com/connector.php';
17
+ exports.NAME = 'base';
18
+ class BaseApplication extends ABasicApplication_1.ABasicApplication {
19
+ getName() {
20
+ return exports.NAME;
21
+ }
22
+ getPublicName() {
23
+ return 'Base.com';
24
+ }
25
+ getDescription() {
26
+ return 'Base.com is an e-commerce marketplace management tool for orders, shipments and warehouse.';
27
+ }
28
+ getLogo() {
29
+ return 'data:image/png;base64,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AAAA1gQWAAAAAGsCCwAAAIA1gQUAAADAmsACAAAAYE1gAQAAALAmsAAAAABYE1gAAAAArAksAAAAANYEFgAAAABrAgsAAACANYEFAAAAwJrAAgAAAGBNYAEAAACwJrAAAAAAWBNYAAAAAKwJLAAAAADWBBYAAAAAawILAAAAgDWBBQAAAMCawAIAAABgTWABAAAAsCawAAAAAFgTWAAAAACsCSwAAAAA1gQWAAAAAGsCCwAAAIA1gQUAAADAmsACAAAAYE1gAQAAALAmsAAAAABYE1gAAAAArAksAAAAANYEFgAAAABrAgsAAACANYEFAAAAwJrAAgAAAGBNYAEAAACwJrAAAAAAWBNYAAAAAKwJLAAAAADWBBYAAAAAawILAAAAgDWBBQAAAMCawAIAAABgTWABAAAAsCawAAAAAFgTWAAAAACsCSwAAAAA1gQWAAAAAGsCCwAAAIA1gQUAAADAmsACAAAAYE1gAQAAALAmsAAAAABYE1gAAAAArAksAAAAANYEFgAAAABrAgsAAACANYEFAAAAwJrAAgAAAGBNYAEAAACwJrAAAAAAWBNYAAAAAKwJLAAAAADWBBYAAAAAawILAAAAgDWBBQAAAMCawAIAAABgTWABAAAAsCawAAAAAFgTWAAAAACsCSwAAAAA1gQWAAAAAGsCCwAAAIA1gQUAAADAmsACAAAAYE1gAQAAALAmsAAAAABYE1gAAAAArAksAAAAANYEFgAAAABrAgsAAACANYEFAAAAwJrAAgAAAGBNYAEAAACwJrAAAAAAWBNYAAAAAKwJLAAAAADWBBYAAAAAawILAAAAgDWBBQAAAMCawAIAAABgTWABAAAAsBbDiupKW/dR8AAAAABJRU5ErkJggg==';
30
+ }
31
+ getFormStack() {
32
+ const form = new Form_1.default(CoreFormsEnum_1.default.AUTHORIZATION_FORM, 'Authorization settings');
33
+ form.addField(new Field_1.default(FieldType_1.default.TEXT, ABasicApplication_1.TOKEN, 'API token', undefined, true));
34
+ return new FormStack_1.default().addForm(form);
35
+ }
36
+ getRequestDto(dto, applicationInstall, method, url, data) {
37
+ const token = applicationInstall.getSettings()[CoreFormsEnum_1.default.AUTHORIZATION_FORM][ABasicApplication_1.TOKEN];
38
+ const request = new RequestDto_1.default(exports.BASE_URL, method, dto);
39
+ request.setHeaders({
40
+ [Headers_1.CommonHeaders.CONTENT_TYPE]: 'multipart/form-data',
41
+ [Headers_1.CommonHeaders.ACCEPT]: Headers_1.JSON_TYPE,
42
+ [exports.TOKEN_HEADER]: token,
43
+ });
44
+ if (data) {
45
+ request.setBody(data);
46
+ }
47
+ return request;
48
+ }
49
+ }
50
+ exports.default = BaseApplication;
@@ -0,0 +1,19 @@
1
+ import ABatchNode from '@orchesty/nodejs-sdk/dist/lib/Batch/ABatchNode';
2
+ import BatchProcessDto from '@orchesty/nodejs-sdk/dist/lib/Utils/BatchProcessDto';
3
+ import FormData from 'form-data';
4
+ export declare abstract class ABaseBatch<T> extends ABatchNode {
5
+ private readonly useInForm;
6
+ constructor(useInForm?: boolean);
7
+ protected abstract getMethod(): string;
8
+ protected abstract processOutputData(dto: BatchProcessDto, body: object): Promise<BatchProcessDto>;
9
+ protected abstract hasNextPage(jsonBody: object): boolean;
10
+ processAction(dto: BatchProcessDto<T>): Promise<BatchProcessDto>;
11
+ protected getLastRunKey(): string;
12
+ protected prepareLastRun(lastRun: string | null | undefined): Date | number | undefined;
13
+ protected getNewLastRun(_jsonBody: object, _lastRun?: string): string;
14
+ protected getParameters(_dto: BatchProcessDto<T>, _page: number, _lastRun?: Date | number): Promise<object>;
15
+ protected prepareBody(method: string, parameters: object): FormData;
16
+ }
17
+ export interface IResponse {
18
+ status: string;
19
+ }
@@ -0,0 +1,60 @@
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.ABaseBatch = void 0;
7
+ const ABatchNode_1 = __importDefault(require("@orchesty/nodejs-sdk/dist/lib/Batch/ABatchNode"));
8
+ const HttpMethods_1 = require("@orchesty/nodejs-sdk/dist/lib/Transport/HttpMethods");
9
+ const form_data_1 = __importDefault(require("form-data"));
10
+ const ABaseConnector_1 = require("../Connector/ABaseConnector");
11
+ class ABaseBatch extends ABatchNode_1.default {
12
+ useInForm;
13
+ constructor(useInForm = false) {
14
+ super();
15
+ this.useInForm = useInForm;
16
+ }
17
+ async processAction(dto) {
18
+ let page = Number(dto.getBatchCursor('1'));
19
+ const appInstall = await this.getApplicationInstallFromProcess(dto, this.useInForm ? null : true);
20
+ const lastRun = appInstall.getNonEncryptedSettings()[this.getLastRunKey()];
21
+ const req = await this.getApplication().getRequestDto(dto, appInstall, HttpMethods_1.HttpMethods.POST, undefined, this.prepareBody(this.getMethod(), await this.getParameters(dto, page, this.prepareLastRun(lastRun))));
22
+ const resp = await this.getSender().send(req, [200]);
23
+ const { status, ...jsonBody } = resp.getJsonBody();
24
+ if (status !== ABaseConnector_1.SUCCESS) {
25
+ throw new Error(`Request failed. Reason: ${resp.getBody()}`);
26
+ }
27
+ await this.processOutputData(dto, jsonBody);
28
+ const hasNextPage = this.hasNextPage(jsonBody);
29
+ if (hasNextPage) {
30
+ page++;
31
+ dto.setBatchCursor(String(page));
32
+ }
33
+ else {
34
+ dto.removeBatchCursor();
35
+ appInstall.addNonEncryptedSettings({ [this.getLastRunKey()]: this.getNewLastRun(jsonBody, lastRun) });
36
+ const repo = this.getDbClient().getApplicationRepository();
37
+ await repo.update(appInstall);
38
+ }
39
+ return dto;
40
+ }
41
+ getLastRunKey() {
42
+ return this.getMethod();
43
+ }
44
+ prepareLastRun(lastRun) {
45
+ return lastRun ? new Date(lastRun) : undefined;
46
+ }
47
+ getNewLastRun(_jsonBody, _lastRun) {
48
+ return new Date().toISOString();
49
+ }
50
+ async getParameters(_dto, _page, _lastRun) {
51
+ return [];
52
+ }
53
+ prepareBody(method, parameters) {
54
+ const body = new form_data_1.default();
55
+ body.append('method', method);
56
+ body.append('parameters', JSON.stringify(parameters));
57
+ return body;
58
+ }
59
+ }
60
+ exports.ABaseBatch = ABaseBatch;
@@ -0,0 +1,53 @@
1
+ import BatchProcessDto from '@orchesty/nodejs-sdk/dist/lib/Utils/BatchProcessDto';
2
+ import { ABaseBatch } from './ABaseBatch';
3
+ export declare const NAME = "inventory-products-data";
4
+ export default class InventoryProductsData extends ABaseBatch<IInput> {
5
+ private readonly useAsBatch;
6
+ constructor(useAsBatch?: boolean);
7
+ getName(): string;
8
+ protected getMethod(): string;
9
+ protected getParameters(dto: BatchProcessDto<IInput>): Promise<object>;
10
+ protected processOutputData(dto: BatchProcessDto, body: IOutput): Promise<BatchProcessDto>;
11
+ protected hasNextPage(jsonBody: IOutput): boolean;
12
+ }
13
+ export interface IInput {
14
+ inventoryId: string;
15
+ products: number[];
16
+ includeErpUnits: boolean;
17
+ includeWmsUnits: boolean;
18
+ includeAdditionalEans: boolean;
19
+ }
20
+ export interface Variant {
21
+ name: string;
22
+ sku: string;
23
+ ean: number;
24
+ prices: Record<string, string>;
25
+ stock: Record<string, number>;
26
+ locations: Record<string, string>;
27
+ }
28
+ export interface Product {
29
+ is_bundle: boolean;
30
+ ean: number;
31
+ sku: string;
32
+ tags: string[];
33
+ tax_rate: number;
34
+ weight: number;
35
+ height: number;
36
+ width: number;
37
+ length: number;
38
+ star: number;
39
+ category_id: number;
40
+ manufacturer_id: number;
41
+ prices: Record<string, string>;
42
+ stock: Record<string, number>;
43
+ locations: Record<string, string>;
44
+ text_fields: Record<string, string>;
45
+ average_cost: number;
46
+ average_landed_cost: number;
47
+ images: Record<number, string>;
48
+ links: Record<string, Record<string, string>>;
49
+ variants: Record<string, Variant>;
50
+ }
51
+ export interface IOutput {
52
+ products: Record<string, Product>;
53
+ }
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NAME = void 0;
4
+ const ABaseBatch_1 = require("./ABaseBatch");
5
+ exports.NAME = 'inventory-products-data';
6
+ class InventoryProductsData extends ABaseBatch_1.ABaseBatch {
7
+ useAsBatch;
8
+ constructor(useAsBatch = false) {
9
+ super();
10
+ this.useAsBatch = useAsBatch;
11
+ }
12
+ getName() {
13
+ return exports.NAME;
14
+ }
15
+ getMethod() {
16
+ return 'getInventoryProductsData';
17
+ }
18
+ async getParameters(dto) {
19
+ const { inventoryId, products, includeErpUnits, includeWmsUnits, includeAdditionalEans } = dto.getJsonData();
20
+ return {
21
+ inventory_id: inventoryId,
22
+ products,
23
+ include_erp_units: includeErpUnits,
24
+ include_wms_units: includeWmsUnits,
25
+ include_additional_eans: includeAdditionalEans,
26
+ };
27
+ }
28
+ async processOutputData(dto, body) {
29
+ if (this.useAsBatch) {
30
+ dto.addItem(body);
31
+ }
32
+ else {
33
+ Object.values(body.products).forEach((product) => {
34
+ dto.addItem(product);
35
+ });
36
+ }
37
+ return dto;
38
+ }
39
+ hasNextPage(jsonBody) {
40
+ return false;
41
+ }
42
+ }
43
+ exports.default = InventoryProductsData;
@@ -0,0 +1,37 @@
1
+ import BatchProcessDto from '@orchesty/nodejs-sdk/dist/lib/Utils/BatchProcessDto';
2
+ import { ABaseBatch } from './ABaseBatch';
3
+ export declare const NAME = "inventory-products-list";
4
+ export default class InventoryProductsList extends ABaseBatch<IInput> {
5
+ private readonly useAsBatch;
6
+ constructor(useAsBatch?: boolean);
7
+ getName(): string;
8
+ protected getMethod(): string;
9
+ protected getParameters(dto: BatchProcessDto<IInput>, page: number, _lastRun?: Date): Promise<object>;
10
+ protected processOutputData(dto: BatchProcessDto, body: IOutput): Promise<BatchProcessDto>;
11
+ protected hasNextPage(jsonBody: IOutput): boolean;
12
+ }
13
+ export interface IInput {
14
+ inventoryId: string;
15
+ filterId?: number;
16
+ filterCategoryId?: number;
17
+ filterEan?: string;
18
+ filterSku?: string;
19
+ filterName?: string;
20
+ filterPriceFrom?: number;
21
+ filterPriceTo?: number;
22
+ filterStockFrom?: number;
23
+ filterStockTo?: number;
24
+ filterSort?: string;
25
+ includeVariants?: boolean;
26
+ }
27
+ export interface Product {
28
+ id: number;
29
+ ean: string;
30
+ sku: string;
31
+ name: string;
32
+ prices: Record<string, number>;
33
+ stock: Record<string, number>;
34
+ }
35
+ export interface IOutput {
36
+ products: Record<string, Product>;
37
+ }
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NAME = void 0;
4
+ const ABaseBatch_1 = require("./ABaseBatch");
5
+ exports.NAME = 'inventory-products-list';
6
+ class InventoryProductsList extends ABaseBatch_1.ABaseBatch {
7
+ useAsBatch;
8
+ constructor(useAsBatch = false) {
9
+ super();
10
+ this.useAsBatch = useAsBatch;
11
+ }
12
+ getName() {
13
+ return exports.NAME;
14
+ }
15
+ getMethod() {
16
+ return 'getInventoryProductsList';
17
+ }
18
+ async getParameters(dto, page, _lastRun) {
19
+ const { inventoryId, filterId, filterCategoryId, filterEan, filterSku, filterName, filterPriceFrom, filterPriceTo, filterStockFrom, filterStockTo, filterSort, includeVariants, } = dto.getJsonData();
20
+ return {
21
+ inventory_id: inventoryId,
22
+ filter_id: filterId,
23
+ filter_category_id: filterCategoryId,
24
+ filter_ean: filterEan,
25
+ filter_sku: filterSku,
26
+ filter_name: filterName,
27
+ filter_price_from: filterPriceFrom,
28
+ filter_price_to: filterPriceTo,
29
+ filter_stock_from: filterStockFrom,
30
+ filter_stock_to: filterStockTo,
31
+ filter_sort: filterSort,
32
+ include_variants: includeVariants,
33
+ page,
34
+ };
35
+ }
36
+ async processOutputData(dto, body) {
37
+ if (this.useAsBatch) {
38
+ dto.addItem(body);
39
+ }
40
+ else {
41
+ Object.values(body.products).forEach((product) => {
42
+ dto.addItem(product);
43
+ });
44
+ }
45
+ return dto;
46
+ }
47
+ hasNextPage(jsonBody) {
48
+ return Object.keys(jsonBody.products).length >= 1000;
49
+ }
50
+ }
51
+ exports.default = InventoryProductsList;
@@ -0,0 +1,27 @@
1
+ import BatchProcessDto from '@orchesty/nodejs-sdk/dist/lib/Utils/BatchProcessDto';
2
+ import { ABaseBatch } from './ABaseBatch';
3
+ export declare const NAME = "journal-list";
4
+ export default class JournalList extends ABaseBatch<IInput> {
5
+ getName(): string;
6
+ protected getMethod(): string;
7
+ protected getParameters(dto: BatchProcessDto<IInput>, _page: number, _lastRun?: Date | number): Promise<object>;
8
+ protected prepareLastRun(lastRun: string | null | undefined): Date | number | undefined;
9
+ protected processOutputData(dto: BatchProcessDto, body: IOutput): Promise<BatchProcessDto>;
10
+ protected hasNextPage(_jsonBody: IOutput): boolean;
11
+ protected getNewLastRun(_jsonBody: IOutput, _lastRun?: string): string;
12
+ }
13
+ export interface IInput {
14
+ logsTypes: number[];
15
+ lastLogId?: number;
16
+ orderId?: number;
17
+ }
18
+ export interface Log {
19
+ log_id: number;
20
+ log_type: number;
21
+ order_id: number;
22
+ object_id: number;
23
+ date: number;
24
+ }
25
+ export interface IOutput {
26
+ logs: Record<string, Log>;
27
+ }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NAME = void 0;
4
+ const ABaseBatch_1 = require("./ABaseBatch");
5
+ exports.NAME = 'journal-list';
6
+ class JournalList extends ABaseBatch_1.ABaseBatch {
7
+ getName() {
8
+ return exports.NAME;
9
+ }
10
+ getMethod() {
11
+ return 'getJournalList';
12
+ }
13
+ async getParameters(dto, _page, _lastRun) {
14
+ const { lastLogId, logsTypes, orderId } = dto.getJsonData();
15
+ const lastLog = Number((lastLogId ?? _lastRun) ?? 0);
16
+ return {
17
+ last_log_id: lastLog + 1,
18
+ logs_types: logsTypes,
19
+ order_id: orderId,
20
+ };
21
+ }
22
+ prepareLastRun(lastRun) {
23
+ return lastRun ? Number(lastRun) : undefined;
24
+ }
25
+ async processOutputData(dto, body) {
26
+ Object.values(body.logs).forEach((log) => {
27
+ dto.addItem(log);
28
+ });
29
+ return dto;
30
+ }
31
+ hasNextPage(_jsonBody) {
32
+ return false;
33
+ }
34
+ getNewLastRun(_jsonBody, _lastRun) {
35
+ const lastLog = Object.values(_jsonBody.logs).pop();
36
+ return String(lastLog?.log_id ?? _lastRun ?? 0);
37
+ }
38
+ }
39
+ exports.default = JournalList;
@@ -0,0 +1,17 @@
1
+ import BatchProcessDto from '@orchesty/nodejs-sdk/dist/lib/Utils/BatchProcessDto';
2
+ import { ABaseBatch } from './ABaseBatch';
3
+ export declare const NAME = "order-extra-fields";
4
+ export default class OrderExtraFields extends ABaseBatch<unknown> {
5
+ getName(): string;
6
+ protected getMethod(): string;
7
+ protected getParameters(dto: BatchProcessDto): Promise<object>;
8
+ protected processOutputData(dto: BatchProcessDto, body: IOutput): Promise<BatchProcessDto>;
9
+ protected hasNextPage(jsonBody: IOutput): boolean;
10
+ }
11
+ export interface IOutput {
12
+ extra_fields: {
13
+ extra_field_id: number;
14
+ name: string;
15
+ editor_type: string;
16
+ }[];
17
+ }
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NAME = void 0;
4
+ const ABaseBatch_1 = require("./ABaseBatch");
5
+ exports.NAME = 'order-extra-fields';
6
+ class OrderExtraFields extends ABaseBatch_1.ABaseBatch {
7
+ getName() {
8
+ return exports.NAME;
9
+ }
10
+ getMethod() {
11
+ return 'getOrderExtraFields';
12
+ }
13
+ async getParameters(dto) {
14
+ return {};
15
+ }
16
+ async processOutputData(dto, body) {
17
+ Object.values(body.extra_fields).forEach((extraField) => {
18
+ dto.addItem(extraField);
19
+ });
20
+ return dto;
21
+ }
22
+ hasNextPage(jsonBody) {
23
+ return false;
24
+ }
25
+ }
26
+ exports.default = OrderExtraFields;
@@ -0,0 +1,16 @@
1
+ import AConnector from '@orchesty/nodejs-sdk/dist/lib/Connector/AConnector';
2
+ import ProcessDto from '@orchesty/nodejs-sdk/dist/lib/Utils/ProcessDto';
3
+ import FormData from 'form-data';
4
+ export declare const SUCCESS = "SUCCESS";
5
+ export default abstract class ABaseConnector<T, K> extends AConnector {
6
+ private readonly useInForm;
7
+ constructor(useInForm?: boolean);
8
+ protected abstract getMethod(): string;
9
+ processAction(dto: ProcessDto<T>): Promise<ProcessDto<K>>;
10
+ protected getParameters(_dto: ProcessDto<T>): Promise<object>;
11
+ protected prepareBody(method: string, parameters: object): FormData;
12
+ protected processOutputData(dto: ProcessDto<T>, jsonBody: object): Promise<ProcessDto<K>>;
13
+ }
14
+ export interface IResponse {
15
+ status: string;
16
+ }
@@ -0,0 +1,39 @@
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.SUCCESS = void 0;
7
+ const AConnector_1 = __importDefault(require("@orchesty/nodejs-sdk/dist/lib/Connector/AConnector"));
8
+ const HttpMethods_1 = require("@orchesty/nodejs-sdk/dist/lib/Transport/HttpMethods");
9
+ const form_data_1 = __importDefault(require("form-data"));
10
+ exports.SUCCESS = 'SUCCESS';
11
+ class ABaseConnector extends AConnector_1.default {
12
+ useInForm;
13
+ constructor(useInForm = false) {
14
+ super();
15
+ this.useInForm = useInForm;
16
+ }
17
+ async processAction(dto) {
18
+ const req = await this.getApplication().getRequestDto(dto, await this.getApplicationInstallFromProcess(dto, this.useInForm ? null : true), HttpMethods_1.HttpMethods.POST, undefined, this.prepareBody(this.getMethod(), await this.getParameters(dto)));
19
+ const resp = await this.getSender().send(req, [200]);
20
+ const { status, ...jsonBody } = resp.getJsonBody();
21
+ if (status !== exports.SUCCESS) {
22
+ throw new Error(`Request failed. Reason: ${resp.getBody()}`);
23
+ }
24
+ return this.processOutputData(dto, jsonBody);
25
+ }
26
+ async getParameters(_dto) {
27
+ return [];
28
+ }
29
+ prepareBody(method, parameters) {
30
+ const body = new form_data_1.default();
31
+ body.append('method', method);
32
+ body.append('parameters', JSON.stringify(parameters));
33
+ return body;
34
+ }
35
+ async processOutputData(dto, jsonBody) {
36
+ return dto.setNewJsonData(jsonBody);
37
+ }
38
+ }
39
+ exports.default = ABaseConnector;
@@ -0,0 +1,30 @@
1
+ import ProcessDto from '@orchesty/nodejs-sdk/dist/lib/Utils/ProcessDto';
2
+ import ABaseConnector from './ABaseConnector';
3
+ export declare const NAME = "courier-fields";
4
+ export default class CourierFields extends ABaseConnector<IInput, IOutput> {
5
+ getName(): string;
6
+ protected getMethod(): string;
7
+ protected getParameters(dto: ProcessDto<IInput>): Promise<object>;
8
+ }
9
+ export interface IInput {
10
+ courierCode: string;
11
+ }
12
+ export interface IOutput {
13
+ multi_packages: false;
14
+ fields: {
15
+ id: string;
16
+ name: string;
17
+ type: string;
18
+ desc?: string;
19
+ value?: string | number;
20
+ options?: Record<number, string>;
21
+ show_field?: unknown;
22
+ }[];
23
+ package_fields: {
24
+ id: string;
25
+ name: string;
26
+ type: string;
27
+ options?: Record<number, string>;
28
+ default?: number;
29
+ }[];
30
+ }
@@ -0,0 +1,23 @@
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.NAME = void 0;
7
+ const ABaseConnector_1 = __importDefault(require("./ABaseConnector"));
8
+ exports.NAME = 'courier-fields';
9
+ class CourierFields extends ABaseConnector_1.default {
10
+ getName() {
11
+ return exports.NAME;
12
+ }
13
+ getMethod() {
14
+ return 'getCourierFields';
15
+ }
16
+ async getParameters(dto) {
17
+ const { courierCode } = dto.getJsonData();
18
+ return {
19
+ courier_code: courierCode,
20
+ };
21
+ }
22
+ }
23
+ exports.default = CourierFields;
@@ -0,0 +1,12 @@
1
+ import ABaseConnector from './ABaseConnector';
2
+ export declare const NAME = "couriers-list";
3
+ export default class CouriersList extends ABaseConnector<unknown, IOutput> {
4
+ getName(): string;
5
+ protected getMethod(): string;
6
+ }
7
+ export interface IOutput {
8
+ couriers: {
9
+ code: string;
10
+ name: string;
11
+ }[];
12
+ }
@@ -0,0 +1,17 @@
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.NAME = void 0;
7
+ const ABaseConnector_1 = __importDefault(require("./ABaseConnector"));
8
+ exports.NAME = 'couriers-list';
9
+ class CouriersList extends ABaseConnector_1.default {
10
+ getName() {
11
+ return exports.NAME;
12
+ }
13
+ getMethod() {
14
+ return 'getCouriersList';
15
+ }
16
+ }
17
+ exports.default = CouriersList;