n8n-nodes-sqlaccounting 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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Yew Choong Hau
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,163 @@
1
+ # n8n-nodes-sqlaccounting
2
+
3
+ An [n8n](https://n8n.io) community node for the [SQL Accounting](https://www.sql.com.my) REST API (Malaysia).
4
+
5
+ Connects SQL Accounting to any automation via the SQL Accounting n8n Node platform — a credit-based service that handles SigV4 signing, rate limiting, and usage tracking.
6
+
7
+ [![npm version](https://img.shields.io/npm/v/n8n-nodes-sqlaccounting)](https://www.npmjs.com/package/n8n-nodes-sqlaccounting)
8
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
9
+
10
+ ---
11
+
12
+ ## Features
13
+
14
+ - **81 endpoints** — Sales, Purchase, AR, AP, GL, Stock, Manufacturing, and Reports
15
+ - **Zero runtime dependencies** — uses only Node.js built-ins (required for n8n Cloud)
16
+ - **Auto-pagination** — Return All toggle loops through pages automatically
17
+ - **Guided fields** for master data, raw JSON body editor for transactional documents
18
+ - **Credit-based billing** — buy credits at the portal, spend per API call
19
+
20
+ ---
21
+
22
+ ## Prerequisites
23
+
24
+ 1. A running SQL Accounting installation with the REST API enabled
25
+ 2. A SQL Accounting API access key and secret key (from SQL Account → Tools → API Settings)
26
+ 3. A platform API key from the SQL Accounting n8n Node portal (`sqlnode_...`)
27
+
28
+ ---
29
+
30
+ ## Installation
31
+
32
+ ### In n8n (recommended)
33
+
34
+ ```
35
+ Settings → Community Nodes → Install → n8n-nodes-sqlaccounting
36
+ ```
37
+
38
+ ### Self-hosted via CLI
39
+
40
+ ```bash
41
+ npm install n8n-nodes-sqlaccounting
42
+ ```
43
+
44
+ ---
45
+
46
+ ## Credentials
47
+
48
+ Configure a **SQL Accounting API** credential with these five fields:
49
+
50
+ | Field | Description | Default |
51
+ |-------|-------------|---------|
52
+ | Platform API Key | Your `sqlnode_...` key from the portal | — |
53
+ | SQL Access Key | From SQL Account API settings | — |
54
+ | SQL Secret Key | From SQL Account API settings (encrypted by n8n) | — |
55
+ | Service | SigV4 service name | `sqlaccount` |
56
+ | Region | SigV4 region | `ap-southeast-5` |
57
+
58
+ Use the **Test credential** button to verify all five values are correct. This sends a `GET /profile` request (costs 1 credit).
59
+
60
+ ---
61
+
62
+ ## Credit Costs
63
+
64
+ | Operation type | Credits per call |
65
+ |----------------|-----------------|
66
+ | List / Get / Report | 1 |
67
+ | Create | 3 |
68
+ | Update (auto GET + PUT) | 4 total |
69
+ | Delete | 5 |
70
+
71
+ Return All loops through pages — each page costs 1 credit.
72
+
73
+ ---
74
+
75
+ ## Operations
76
+
77
+ ### Master Data (guided fields for Create/Update)
78
+
79
+ `account` `agent` `area` `assetdisposal` `assetgroup` `assetitem` `batch`
80
+ `companycategory` `location` `memberpoint` `pmmethod` `pricetag` `project`
81
+ `shipper` `stockcategory` `stockgroup` `tariff` `tax` `terms` `whtax`
82
+
83
+ ### Transactional — Sales
84
+
85
+ `salesinvoice` `salesorder` `salesquotation` `salescreditnote` `salesdebitnote`
86
+ `salescancellednote` `cashsales` `deliveryorder` `extradeliveryorder`
87
+
88
+ ### Transactional — Purchase
89
+
90
+ `purchaseinvoice` `purchaseorder` `purchaserequest` `purchasereturned`
91
+ `purchasedebitnote` `purchasecancellednote` `cashpurchase` `goodsreceived`
92
+ `extragoodsreceived`
93
+
94
+ ### Transactional — Accounts Receivable
95
+
96
+ `customer` `customerinvoice` `customercreditnote` `customerdebitnote`
97
+ `customerpayment` `customerdeposit` `customerrefund` `customercontra`
98
+
99
+ ### Transactional — Accounts Payable
100
+
101
+ `supplier` `supplierinvoice` `suppliercreditnote` `supplierdebitnote`
102
+ `supplierpayment` `supplierdeposit` `supplierrefund` `suppliercontra`
103
+
104
+ ### Transactional — GL / Stock / Manufacturing
105
+
106
+ `journalentry` `paymentvoucher` `receiptvoucher` `bankadjustment` `stockitem`
107
+ `stockadjustment` `stockissue` `stockreceived` `stocktransfer` `assembly`
108
+ `disassembly` `joborder` `itemtemplate` `currency`
109
+
110
+ ### Reports (read-only)
111
+
112
+ `profile` `version` `stockaging` `stockanalysis` `stockbalanceinquiry`
113
+ `stockbatchexpiry` `stockcard` `stockcardqty` `stockmonthendbalance`
114
+ `stockphysicalworksheet` `stockreorderadvice` `stockserialnumberconflict`
115
+ `stockserialnumberoutstanding`
116
+
117
+ ---
118
+
119
+ ## JSON Body Example — Sales Invoice
120
+
121
+ Use this as a starting point for the **Request Body (JSON)** field:
122
+
123
+ ```json
124
+ {
125
+ "docno": "IV-00001",
126
+ "docdate": "2026-01-15",
127
+ "code": "CUSTOMER001",
128
+ "description": "Monthly consulting services",
129
+ "currencycode": "MYR",
130
+ "currencyrate": 1,
131
+ "docamt": 1060.00,
132
+ "sdsdocdetail": [
133
+ {
134
+ "itemcode": "SVC001",
135
+ "description": "Consulting service",
136
+ "qty": 1,
137
+ "uom": "UNIT",
138
+ "unitprice": 1000.00,
139
+ "disc": 0,
140
+ "tax": "SR6",
141
+ "taxamt": 60.00,
142
+ "localamt": 1000.00
143
+ }
144
+ ]
145
+ }
146
+ ```
147
+
148
+ ---
149
+
150
+ ## Error Reference
151
+
152
+ | Error | Cause | Fix |
153
+ |-------|-------|-----|
154
+ | Authentication failed | Invalid platform API key | Check the Platform API Key in your credential |
155
+ | Insufficient credits | Balance is zero | Top up at the portal |
156
+ | 4xx from SQL Accounting | Bad request data | Check your JSON body or Record ID |
157
+ | 5xx from SQL Accounting | SQL Accounting server error | No credit charged — retry later |
158
+
159
+ ---
160
+
161
+ ## License
162
+
163
+ [MIT](LICENSE)
@@ -0,0 +1,10 @@
1
+ import type { IAuthenticateGeneric, ICredentialTestRequest, ICredentialType, INodeProperties } from 'n8n-workflow';
2
+ export declare class SqlAccountingApi implements ICredentialType {
3
+ name: string;
4
+ displayName: string;
5
+ documentationUrl: string;
6
+ authenticate: IAuthenticateGeneric;
7
+ test: ICredentialTestRequest;
8
+ properties: INodeProperties[];
9
+ }
10
+ //# sourceMappingURL=SqlAccountingApi.credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqlAccountingApi.credentials.d.ts","sourceRoot":"","sources":["../../credentials/SqlAccountingApi.credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,oBAAoB,EACpB,sBAAsB,EACtB,eAAe,EACf,eAAe,EACf,MAAM,cAAc,CAAC;AAKtB,qBAAa,gBAAiB,YAAW,eAAe;IACvD,IAAI,SAAsB;IAC1B,WAAW,SAAwB;IACnC,gBAAgB,SACyC;IAKzD,YAAY,EAAE,oBAAoB,CAOhC;IAKF,IAAI,EAAE,sBAAsB,CAkB1B;IAEF,UAAU,EAAE,eAAe,EAAE,CAkD3B;CACF"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SqlAccountingApi = void 0;
4
+ // ── IMPORTANT: Update this URL if your Supabase project changes ──────────────
5
+ const EDGE_FUNCTION_BASE = 'https://cqcxkvptxgslpneeobhv.supabase.co/functions/v1';
6
+ class SqlAccountingApi {
7
+ constructor() {
8
+ this.name = 'sqlAccountingApi';
9
+ this.displayName = 'SQL Accounting API';
10
+ this.documentationUrl = 'https://github.com/laurentyew/n8n-nodes-sqlaccounting';
11
+ // ── Tells n8n how to inject the platform API key as Bearer token ──────────
12
+ // This is what allows httpRequestWithAuthentication() to work correctly
13
+ // and satisfies the no-http-request-with-manual-auth linter rule.
14
+ this.authenticate = {
15
+ type: 'generic',
16
+ properties: {
17
+ headers: {
18
+ Authorization: '=Bearer {{$credentials.platformApiKey}}',
19
+ },
20
+ },
21
+ };
22
+ // ── Powers the "Test credential" button in the n8n UI ────────────────────
23
+ // Calls profile.get (1 credit) to verify both the platform key AND
24
+ // the SQL Accounting credentials are valid.
25
+ this.test = {
26
+ request: {
27
+ baseURL: EDGE_FUNCTION_BASE,
28
+ url: '/sqlaccount',
29
+ method: 'POST',
30
+ body: {
31
+ access_key: '={{$credentials.sqlAccessKey}}',
32
+ secret_key: '={{$credentials.sqlSecretKey}}',
33
+ service: '={{$credentials.service}}',
34
+ region: '={{$credentials.region}}',
35
+ operation: 'profile.get',
36
+ method: 'GET',
37
+ path: '/profile',
38
+ query: '',
39
+ body: '',
40
+ },
41
+ json: true,
42
+ },
43
+ };
44
+ this.properties = [
45
+ {
46
+ displayName: 'Platform API Key',
47
+ name: 'platformApiKey',
48
+ type: 'string',
49
+ typeOptions: { password: true },
50
+ default: '',
51
+ required: true,
52
+ description: 'Your licence key from the SQL Accounting n8n Node portal. Starts with sqlnode_.',
53
+ placeholder: 'sqlnode_...',
54
+ },
55
+ {
56
+ displayName: 'SQL Access Key',
57
+ name: 'sqlAccessKey',
58
+ type: 'string',
59
+ typeOptions: { password: true },
60
+ default: '',
61
+ required: true,
62
+ description: 'Your SQL Accounting API access key from the SQL Account API settings page',
63
+ placeholder: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.sql.my/ACCOUNTAPI',
64
+ },
65
+ {
66
+ displayName: 'SQL Secret Key',
67
+ name: 'sqlSecretKey',
68
+ type: 'string',
69
+ typeOptions: { password: true },
70
+ default: '',
71
+ required: true,
72
+ description: 'Your SQL Accounting API secret key. Encrypted by n8n and never stored on our servers.',
73
+ },
74
+ {
75
+ displayName: 'Service',
76
+ name: 'service',
77
+ type: 'string',
78
+ default: 'sqlaccount',
79
+ required: true,
80
+ description: 'SigV4 service name. Default is sqlaccount. Only change if instructed by SQL Accounting support.',
81
+ },
82
+ {
83
+ displayName: 'Region',
84
+ name: 'region',
85
+ type: 'string',
86
+ default: 'ap-southeast-5',
87
+ required: true,
88
+ description: 'SigV4 region. Default is ap-southeast-5. Only change if instructed by SQL Accounting support.',
89
+ },
90
+ ];
91
+ }
92
+ }
93
+ exports.SqlAccountingApi = SqlAccountingApi;
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3FsQWNjb3VudGluZ0FwaS5jcmVkZW50aWFscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NyZWRlbnRpYWxzL1NxbEFjY291bnRpbmdBcGkuY3JlZGVudGlhbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBT0EsZ0ZBQWdGO0FBQ2hGLE1BQU0sa0JBQWtCLEdBQUcsdURBQXVELENBQUM7QUFFbkYsTUFBYSxnQkFBZ0I7SUFBN0I7UUFDQyxTQUFJLEdBQUcsa0JBQWtCLENBQUM7UUFDMUIsZ0JBQVcsR0FBRyxvQkFBb0IsQ0FBQztRQUNuQyxxQkFBZ0IsR0FDZix1REFBdUQsQ0FBQztRQUV6RCw2RUFBNkU7UUFDN0Usd0VBQXdFO1FBQ3hFLGtFQUFrRTtRQUNsRSxpQkFBWSxHQUF5QjtZQUNwQyxJQUFJLEVBQUUsU0FBUztZQUNmLFVBQVUsRUFBRTtnQkFDWCxPQUFPLEVBQUU7b0JBQ1IsYUFBYSxFQUFFLHlDQUF5QztpQkFDeEQ7YUFDRDtTQUNELENBQUM7UUFFRiw0RUFBNEU7UUFDNUUsbUVBQW1FO1FBQ25FLDRDQUE0QztRQUM1QyxTQUFJLEdBQTJCO1lBQzlCLE9BQU8sRUFBRTtnQkFDUixPQUFPLEVBQUUsa0JBQWtCO2dCQUMzQixHQUFHLEVBQUUsYUFBYTtnQkFDbEIsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsSUFBSSxFQUFFO29CQUNMLFVBQVUsRUFBRSxnQ0FBZ0M7b0JBQzVDLFVBQVUsRUFBRSxnQ0FBZ0M7b0JBQzVDLE9BQU8sRUFBRSwyQkFBMkI7b0JBQ3BDLE1BQU0sRUFBRSwwQkFBMEI7b0JBQ2xDLFNBQVMsRUFBRSxhQUFhO29CQUN4QixNQUFNLEVBQUUsS0FBSztvQkFDYixJQUFJLEVBQUUsVUFBVTtvQkFDaEIsS0FBSyxFQUFFLEVBQUU7b0JBQ1QsSUFBSSxFQUFFLEVBQUU7aUJBQ1I7Z0JBQ0QsSUFBSSxFQUFFLElBQUk7YUFDVjtTQUNELENBQUM7UUFFRixlQUFVLEdBQXNCO1lBQy9CO2dCQUNDLFdBQVcsRUFBRSxrQkFBa0I7Z0JBQy9CLElBQUksRUFBRSxnQkFBZ0I7Z0JBQ3RCLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBQy9CLE9BQU8sRUFBRSxFQUFFO2dCQUNYLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFdBQVcsRUFDVixpRkFBaUY7Z0JBQ2xGLFdBQVcsRUFBRSxhQUFhO2FBQzFCO1lBQ0Q7Z0JBQ0MsV0FBVyxFQUFFLGdCQUFnQjtnQkFDN0IsSUFBSSxFQUFFLGNBQWM7Z0JBQ3BCLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBQy9CLE9BQU8sRUFBRSxFQUFFO2dCQUNYLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFdBQVcsRUFBRSwyRUFBMkU7Z0JBQ3hGLFdBQVcsRUFBRSxvREFBb0Q7YUFDakU7WUFDRDtnQkFDQyxXQUFXLEVBQUUsZ0JBQWdCO2dCQUM3QixJQUFJLEVBQUUsY0FBYztnQkFDcEIsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFDL0IsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsV0FBVyxFQUNWLHVGQUF1RjthQUN4RjtZQUNEO2dCQUNDLFdBQVcsRUFBRSxTQUFTO2dCQUN0QixJQUFJLEVBQUUsU0FBUztnQkFDZixJQUFJLEVBQUUsUUFBUTtnQkFDZCxPQUFPLEVBQUUsWUFBWTtnQkFDckIsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsV0FBVyxFQUNWLGlHQUFpRzthQUNsRztZQUNEO2dCQUNDLFdBQVcsRUFBRSxRQUFRO2dCQUNyQixJQUFJLEVBQUUsUUFBUTtnQkFDZCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxPQUFPLEVBQUUsZ0JBQWdCO2dCQUN6QixRQUFRLEVBQUUsSUFBSTtnQkFDZCxXQUFXLEVBQ1YsK0ZBQStGO2FBQ2hHO1NBQ0QsQ0FBQztJQUNILENBQUM7Q0FBQTtBQTVGRCw0Q0E0RkMifQ==
@@ -0,0 +1,6 @@
1
+ import type { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
2
+ export declare class SqlAccounting implements INodeType {
3
+ description: INodeTypeDescription;
4
+ execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
5
+ }
6
+ //# sourceMappingURL=SqlAccounting.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqlAccounting.node.d.ts","sourceRoot":"","sources":["../../../nodes/SqlAccounting/SqlAccounting.node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACT,oBAAoB,EAGpB,MAAM,cAAc,CAAC;AAiBtB,qBAAa,aAAc,YAAW,SAAS;IAC9C,WAAW,EAAE,oBAAoB,CAqK/B;IAGI,OAAO,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;CAoLvE"}
@@ -0,0 +1,351 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SqlAccounting = void 0;
4
+ const n8n_workflow_1 = require("n8n-workflow");
5
+ const operations_1 = require("./operations");
6
+ // ── Update this if your Supabase project changes ──────────────────────────────
7
+ const EDGE_FUNCTION_URL = 'https://cqcxkvptxgslpneeobhv.supabase.co/functions/v1/sqlaccount';
8
+ class SqlAccounting {
9
+ constructor() {
10
+ this.description = {
11
+ displayName: 'SQL Accounting',
12
+ name: 'sqlAccounting',
13
+ icon: 'file:sqlaccounting.svg',
14
+ group: ['transform'],
15
+ version: 1,
16
+ subtitle: '={{$parameter["resource"] + ": " + $parameter["operation"]}}',
17
+ description: 'Interact with the SQL Accounting REST API via the SQL Accounting n8n Node platform.',
18
+ defaults: { name: 'SQL Accounting' },
19
+ inputs: ['main'],
20
+ outputs: ['main'],
21
+ credentials: [
22
+ {
23
+ name: 'sqlAccountingApi',
24
+ required: true,
25
+ },
26
+ ],
27
+ properties: [
28
+ // ── Resource dropdown ────────────────────────────────────────────────
29
+ {
30
+ displayName: 'Resource',
31
+ name: 'resource',
32
+ type: 'options',
33
+ noDataExpression: true,
34
+ options: operations_1.RESOURCES.map((r) => ({
35
+ name: r.name,
36
+ value: r.value,
37
+ })),
38
+ default: 'profile',
39
+ required: true,
40
+ },
41
+ // ── Operation dropdown — one per resource ────────────────────────────
42
+ ...operations_1.RESOURCES.map((resource) => {
43
+ var _a, _b;
44
+ return ({
45
+ displayName: 'Operation',
46
+ name: 'operation',
47
+ type: 'options',
48
+ noDataExpression: true,
49
+ displayOptions: { show: { resource: [resource.value] } },
50
+ options: resource.operations.map((op) => ({
51
+ name: op.name,
52
+ value: op.key,
53
+ description: op.description,
54
+ action: op.description,
55
+ })),
56
+ default: (_b = (_a = resource.operations[0]) === null || _a === void 0 ? void 0 : _a.key) !== null && _b !== void 0 ? _b : '',
57
+ });
58
+ }),
59
+ // ── Record ID — shown for Get / Update / Delete ──────────────────────
60
+ {
61
+ displayName: 'Record ID',
62
+ name: 'pathParam',
63
+ type: 'string',
64
+ default: '',
65
+ required: true,
66
+ description: 'The CODE, DocKey, or AutoKey of the record to get, update, or delete',
67
+ displayOptions: { show: { operation: operations_1.OPS_WITH_PATH_PARAM } },
68
+ },
69
+ // ── Offset — shown for List operations ───────────────────────────────
70
+ {
71
+ displayName: 'Offset',
72
+ name: 'offset',
73
+ type: 'number',
74
+ default: 0,
75
+ description: 'Pagination offset. Each page returns up to 100 records. Increment by 100 for the next page.',
76
+ displayOptions: { show: { operation: operations_1.OPS_GET_NO_PARAM } },
77
+ },
78
+ // ── Return All — shown for List (not reports) ────────────────────────
79
+ {
80
+ displayName: 'Return All',
81
+ name: 'returnAll',
82
+ type: 'boolean',
83
+ default: false,
84
+ description: 'Whether to return all results or only up to a given limit',
85
+ displayOptions: { show: { operation: operations_1.OPS_LIST } },
86
+ },
87
+ // ── Filters — optional query params for List operations ──────────────
88
+ {
89
+ displayName: 'Filters',
90
+ name: 'filters',
91
+ type: 'fixedCollection',
92
+ typeOptions: { multipleValues: true },
93
+ default: {},
94
+ placeholder: 'Add Filter',
95
+ description: 'Optional query filters. See the SQL Accounting API docs for available filter fields per resource.',
96
+ displayOptions: { show: { operation: operations_1.OPS_GET_NO_PARAM } },
97
+ options: [
98
+ {
99
+ name: 'filter',
100
+ displayName: 'Filter',
101
+ values: [
102
+ {
103
+ displayName: 'Field',
104
+ name: 'field',
105
+ type: 'string',
106
+ default: '',
107
+ placeholder: 'e.g. code, description, isactive',
108
+ description: 'The filter field name',
109
+ },
110
+ {
111
+ displayName: 'Value',
112
+ name: 'value',
113
+ type: 'string',
114
+ default: '',
115
+ description: 'The filter value',
116
+ },
117
+ ],
118
+ },
119
+ ],
120
+ },
121
+ // ── Raw JSON Body — shown for transactional Create / Update ──────────
122
+ {
123
+ displayName: 'Request Body (JSON)',
124
+ name: 'rawBody',
125
+ type: 'json',
126
+ default: '{}',
127
+ required: true,
128
+ description: 'Full JSON body for this document. Include the sdsdocdetail array for line items. See the README for schema examples per document type.',
129
+ displayOptions: { show: { operation: operations_1.OPS_RAW_JSON } },
130
+ },
131
+ // ── Guided Fields — shown for master data Create / Update ────────────
132
+ {
133
+ displayName: 'Fields',
134
+ name: 'guidedFields',
135
+ type: 'fixedCollection',
136
+ typeOptions: { multipleValues: true },
137
+ default: {},
138
+ placeholder: 'Add Field',
139
+ description: 'Fields to set on this record. See the SQL Accounting API docs for available fields per resource.',
140
+ displayOptions: { show: { operation: operations_1.OPS_GUIDED } },
141
+ options: [
142
+ {
143
+ name: 'field',
144
+ displayName: 'Field',
145
+ values: [
146
+ {
147
+ displayName: 'Field Name',
148
+ name: 'name',
149
+ type: 'string',
150
+ default: '',
151
+ placeholder: 'e.g. code, description, isactive',
152
+ description: 'The field name as defined in the SQL Accounting API',
153
+ },
154
+ {
155
+ displayName: 'Value',
156
+ name: 'value',
157
+ type: 'string',
158
+ default: '',
159
+ description: 'The value to set for this field',
160
+ },
161
+ ],
162
+ },
163
+ ],
164
+ },
165
+ ],
166
+ };
167
+ }
168
+ // ── execute() ─────────────────────────────────────────────────────────────
169
+ async execute() {
170
+ var _a, _b, _c;
171
+ const items = this.getInputData();
172
+ const returnData = [];
173
+ // Get credentials (used only to build the request body — auth header is
174
+ // injected automatically by httpRequestWithAuthentication via authenticate{})
175
+ const credentials = await this.getCredentials('sqlAccountingApi');
176
+ const sqlAccessKey = credentials.sqlAccessKey;
177
+ const sqlSecretKey = credentials.sqlSecretKey;
178
+ const service = credentials.service || 'sqlaccount';
179
+ const region = credentials.region || 'ap-southeast-5';
180
+ for (let i = 0; i < items.length; i++) {
181
+ try {
182
+ const resource = this.getNodeParameter('resource', i);
183
+ const operationKey = this.getNodeParameter('operation', i);
184
+ const opDef = operations_1.OPERATION_MAP[operationKey];
185
+ if (!opDef) {
186
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Unknown operation: ${operationKey}`, { itemIndex: i });
187
+ }
188
+ // ── Build path (inject path param for Get/Update/Delete) ─────────
189
+ let resolvedPath = opDef.path;
190
+ if (opDef.pathParam !== null) {
191
+ const paramValue = this.getNodeParameter('pathParam', i);
192
+ if (!(paramValue === null || paramValue === void 0 ? void 0 : paramValue.trim())) {
193
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Record ID is required for the ${opDef.name} operation.`, { itemIndex: i });
194
+ }
195
+ resolvedPath = `${opDef.path}/${encodeURIComponent(paramValue.trim())}`;
196
+ }
197
+ // ── Build query string (List / Report operations) ────────────────
198
+ let queryString = '';
199
+ if (opDef.pathParam === null && opDef.method === 'GET') {
200
+ const queryParts = [];
201
+ const offset = this.getNodeParameter('offset', i, 0);
202
+ queryParts.push(`offset=${offset}`);
203
+ const filtersData = this.getNodeParameter('filters', i, {});
204
+ const filterItems = (_a = filtersData.filter) !== null && _a !== void 0 ? _a : [];
205
+ for (const f of filterItems) {
206
+ const fieldName = (_b = f.field) === null || _b === void 0 ? void 0 : _b.trim();
207
+ const fieldValue = f.value;
208
+ if (fieldName && fieldValue !== undefined && fieldValue !== '') {
209
+ queryParts.push(`${encodeURIComponent(fieldName)}=${encodeURIComponent(fieldValue)}`);
210
+ }
211
+ }
212
+ queryString = queryParts.join('&');
213
+ }
214
+ // ── Build request body ───────────────────────────────────────────
215
+ let bodyString = '';
216
+ if (opDef.bodyMode === 'raw_json') {
217
+ const rawBody = this.getNodeParameter('rawBody', i);
218
+ bodyString =
219
+ typeof rawBody === 'string' ? rawBody : JSON.stringify(rawBody);
220
+ }
221
+ else if (opDef.bodyMode === 'guided') {
222
+ const guidedData = this.getNodeParameter('guidedFields', i, {});
223
+ const fieldItems = (_c = guidedData.field) !== null && _c !== void 0 ? _c : [];
224
+ const bodyObj = {};
225
+ for (const f of fieldItems) {
226
+ if (f.name)
227
+ bodyObj[f.name] = f.value;
228
+ }
229
+ bodyString = JSON.stringify(bodyObj);
230
+ }
231
+ // ── Handle Return All (auto-paginate) ────────────────────────────
232
+ const isListOp = opDef.pathParam === null &&
233
+ opDef.method === 'GET' &&
234
+ opDef.docType !== 'report';
235
+ const returnAll = isListOp
236
+ ? this.getNodeParameter('returnAll', i, false)
237
+ : false;
238
+ if (returnAll) {
239
+ const allResults = [];
240
+ let currentOffset = 0;
241
+ let hasMore = true;
242
+ while (hasMore) {
243
+ const pageQuery = queryString
244
+ ? queryString.replace(/offset=\d+/, `offset=${currentOffset}`)
245
+ : `offset=${currentOffset}`;
246
+ const pageResult = await callEdge(this, sqlAccessKey, sqlSecretKey, service, region, operationKey, opDef.method, resolvedPath, pageQuery, '');
247
+ const pageData = Array.isArray(pageResult)
248
+ ? pageResult
249
+ : [pageResult];
250
+ if (pageData.length === 0) {
251
+ hasMore = false;
252
+ }
253
+ else {
254
+ allResults.push(...pageData);
255
+ currentOffset += 100;
256
+ // Safety cap — prevent infinite loops on bad responses
257
+ if (currentOffset > 100000)
258
+ hasMore = false;
259
+ }
260
+ }
261
+ for (const record of allResults) {
262
+ returnData.push({
263
+ json: record,
264
+ pairedItem: { item: i },
265
+ });
266
+ }
267
+ }
268
+ else {
269
+ // ── Single call ────────────────────────────────────────────
270
+ const result = await callEdge(this, sqlAccessKey, sqlSecretKey, service, region, operationKey, opDef.method, resolvedPath, queryString, bodyString);
271
+ if (Array.isArray(result)) {
272
+ for (const record of result) {
273
+ returnData.push({
274
+ json: record,
275
+ pairedItem: { item: i },
276
+ });
277
+ }
278
+ }
279
+ else {
280
+ returnData.push({
281
+ json: result,
282
+ pairedItem: { item: i },
283
+ });
284
+ }
285
+ }
286
+ }
287
+ catch (error) {
288
+ // continueOnFail support — required by n8n linter
289
+ if (this.continueOnFail()) {
290
+ returnData.push({
291
+ json: { error: error.message },
292
+ pairedItem: { item: i },
293
+ });
294
+ continue;
295
+ }
296
+ throw error;
297
+ }
298
+ }
299
+ return [returnData];
300
+ }
301
+ }
302
+ exports.SqlAccounting = SqlAccounting;
303
+ // ─────────────────────────────────────────────────────────────────────────────
304
+ // Edge Function caller
305
+ //
306
+ // Uses this.helpers.httpRequestWithAuthentication() — the n8n-approved method
307
+ // that satisfies the no-http-request-with-manual-auth linter rule.
308
+ // The Authorization: Bearer <platformApiKey> header is injected automatically
309
+ // from the credential's authenticate{} property. We never touch it here.
310
+ // ─────────────────────────────────────────────────────────────────────────────
311
+ async function callEdge(ctx, accessKey, secretKey, service, region, operation, method, path, query, body) {
312
+ var _a;
313
+ const options = {
314
+ method: 'POST',
315
+ url: EDGE_FUNCTION_URL,
316
+ headers: {
317
+ 'Content-Type': 'application/json',
318
+ },
319
+ body: {
320
+ access_key: accessKey,
321
+ secret_key: secretKey,
322
+ service,
323
+ region,
324
+ operation,
325
+ method,
326
+ path,
327
+ query,
328
+ body,
329
+ },
330
+ json: true,
331
+ };
332
+ let response;
333
+ try {
334
+ // httpRequestWithAuthentication auto-injects the Bearer token from
335
+ // the credential's authenticate{} definition — no manual header needed.
336
+ response = (await ctx.helpers.httpRequestWithAuthentication.call(ctx, 'sqlAccountingApi', options));
337
+ }
338
+ catch (error) {
339
+ // Parse n8n's wrapped HTTP error to give the user a clear message
340
+ const msg = (_a = error.message) !== null && _a !== void 0 ? _a : '';
341
+ if (msg.includes('401') || msg.includes('invalid_api_key')) {
342
+ throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), 'Authentication failed. Check your Platform API Key in the credential.');
343
+ }
344
+ if (msg.includes('402') || msg.includes('insufficient_credits')) {
345
+ throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), 'Insufficient credits. Top up your balance at the portal before retrying.');
346
+ }
347
+ throw error;
348
+ }
349
+ return response;
350
+ }
351
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3FsQWNjb3VudGluZy5ub2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbm9kZXMvU3FsQWNjb3VudGluZy9TcWxBY2NvdW50aW5nLm5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBUUEsK0NBQWtEO0FBRWxELDZDQVFzQjtBQUV0QixpRkFBaUY7QUFDakYsTUFBTSxpQkFBaUIsR0FDdEIsa0VBQWtFLENBQUM7QUFFcEUsTUFBYSxhQUFhO0lBQTFCO1FBQ0MsZ0JBQVcsR0FBeUI7WUFDbkMsV0FBVyxFQUFFLGdCQUFnQjtZQUM3QixJQUFJLEVBQUUsZUFBZTtZQUNyQixJQUFJLEVBQUUsd0JBQXdCO1lBQzlCLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQztZQUNwQixPQUFPLEVBQUUsQ0FBQztZQUNWLFFBQVEsRUFBRSw4REFBOEQ7WUFDeEUsV0FBVyxFQUNWLHFGQUFxRjtZQUN0RixRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7WUFDcEMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNqQixXQUFXLEVBQUU7Z0JBQ1o7b0JBQ0MsSUFBSSxFQUFFLGtCQUFrQjtvQkFDeEIsUUFBUSxFQUFFLElBQUk7aUJBQ2Q7YUFDRDtZQUNELFVBQVUsRUFBRTtnQkFDWCx3RUFBd0U7Z0JBQ3hFO29CQUNDLFdBQVcsRUFBRSxVQUFVO29CQUN2QixJQUFJLEVBQUUsVUFBVTtvQkFDaEIsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsZ0JBQWdCLEVBQUUsSUFBSTtvQkFDdEIsT0FBTyxFQUFFLHNCQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUM5QixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7d0JBQ1osS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO3FCQUNkLENBQUMsQ0FBQztvQkFDSCxPQUFPLEVBQUUsU0FB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
@@ -0,0 +1,34 @@
1
+ /**
2
+ * operations.ts
3
+ * Static operation definitions for all 81 SQL Accounting endpoints.
4
+ * Maps exactly to the operations table seeded in Supabase.
5
+ *
6
+ * body_mode:
7
+ * 'none' → GET / DELETE (no body, no guided fields)
8
+ * 'guided' → master data writes (flat guided fields shown in UI)
9
+ * 'raw_json' → transactional writes (raw JSON body editor)
10
+ */
11
+ export interface OperationDef {
12
+ key: string;
13
+ name: string;
14
+ value: string;
15
+ description: string;
16
+ method: 'GET' | 'POST' | 'PUT' | 'DELETE';
17
+ path: string;
18
+ pathParam: 'CODE' | 'DOCKEY' | 'AUTOKEY' | null;
19
+ bodyMode: 'none' | 'guided' | 'raw_json';
20
+ docType: 'master' | 'transactional' | 'report';
21
+ }
22
+ export interface ResourceDef {
23
+ name: string;
24
+ value: string;
25
+ operations: OperationDef[];
26
+ }
27
+ export declare const RESOURCES: ResourceDef[];
28
+ export declare const OPERATION_MAP: Record<string, OperationDef>;
29
+ export declare const OPS_WITH_PATH_PARAM: string[];
30
+ export declare const OPS_LIST: string[];
31
+ export declare const OPS_GET_NO_PARAM: string[];
32
+ export declare const OPS_RAW_JSON: string[];
33
+ export declare const OPS_GUIDED: string[];
34
+ //# sourceMappingURL=operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../../nodes/SqlAccounting/operations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,YAAY;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC;IAChD,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;IACzC,OAAO,EAAE,QAAQ,GAAG,eAAe,GAAG,QAAQ,CAAC;CAC/C;AAED,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,YAAY,EAAE,CAAC;CAC3B;AAiED,eAAO,MAAM,SAAS,EAAE,WAAW,EA+FlC,CAAC;AAGF,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAM,CAAC;AAQ9D,eAAO,MAAM,mBAAmB,UAEX,CAAC;AAGtB,eAAO,MAAM,QAAQ,UAEA,CAAC;AAGtB,eAAO,MAAM,gBAAgB,UAER,CAAC;AAGtB,eAAO,MAAM,YAAY,UAEJ,CAAC;AAGtB,eAAO,MAAM,UAAU,UAEF,CAAC"}
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ /**
3
+ * operations.ts
4
+ * Static operation definitions for all 81 SQL Accounting endpoints.
5
+ * Maps exactly to the operations table seeded in Supabase.
6
+ *
7
+ * body_mode:
8
+ * 'none' → GET / DELETE (no body, no guided fields)
9
+ * 'guided' → master data writes (flat guided fields shown in UI)
10
+ * 'raw_json' → transactional writes (raw JSON body editor)
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.OPS_GUIDED = exports.OPS_RAW_JSON = exports.OPS_GET_NO_PARAM = exports.OPS_LIST = exports.OPS_WITH_PATH_PARAM = exports.OPERATION_MAP = exports.RESOURCES = void 0;
14
+ // ─────────────────────────────────────────────────────────────────────────────
15
+ // HELPERS
16
+ // ─────────────────────────────────────────────────────────────────────────────
17
+ function masterOps(resource, path, pathParam = 'CODE') {
18
+ return [
19
+ { key: `${resource}.list`, name: 'List', value: `${resource}.list`, description: `List ${resource} records`, method: 'GET', path, pathParam: null, bodyMode: 'none', docType: 'master' },
20
+ { key: `${resource}.get`, name: 'Get', value: `${resource}.get`, description: `Get a single ${resource} by ${pathParam}`, method: 'GET', path, pathParam, bodyMode: 'none', docType: 'master' },
21
+ { key: `${resource}.create`, name: 'Create', value: `${resource}.create`, description: `Create a new ${resource}`, method: 'POST', path, pathParam: null, bodyMode: 'guided', docType: 'master' },
22
+ { key: `${resource}.update`, name: 'Update', value: `${resource}.update`, description: `Update an existing ${resource}`, method: 'PUT', path, pathParam, bodyMode: 'guided', docType: 'master' },
23
+ { key: `${resource}.delete`, name: 'Delete', value: `${resource}.delete`, description: `Delete a ${resource} record`, method: 'DELETE', path, pathParam, bodyMode: 'none', docType: 'master' },
24
+ ];
25
+ }
26
+ function masterOpsNoGet(resource, path, pathParam = 'CODE') {
27
+ return [
28
+ { key: `${resource}.list`, name: 'List', value: `${resource}.list`, description: `List ${resource} records`, method: 'GET', path, pathParam: null, bodyMode: 'none', docType: 'master' },
29
+ { key: `${resource}.create`, name: 'Create', value: `${resource}.create`, description: `Create a new ${resource}`, method: 'POST', path, pathParam: null, bodyMode: 'guided', docType: 'master' },
30
+ { key: `${resource}.update`, name: 'Update', value: `${resource}.update`, description: `Update a ${resource}`, method: 'PUT', path, pathParam, bodyMode: 'guided', docType: 'master' },
31
+ { key: `${resource}.delete`, name: 'Delete', value: `${resource}.delete`, description: `Delete a ${resource} record`, method: 'DELETE', path, pathParam, bodyMode: 'none', docType: 'master' },
32
+ ];
33
+ }
34
+ function txOps(resource, path, pathParam = 'DOCKEY') {
35
+ return [
36
+ { key: `${resource}.list`, name: 'List', value: `${resource}.list`, description: `List ${resource} documents`, method: 'GET', path, pathParam: null, bodyMode: 'none', docType: 'transactional' },
37
+ { key: `${resource}.get`, name: 'Get', value: `${resource}.get`, description: `Get a single ${resource}`, method: 'GET', path, pathParam, bodyMode: 'none', docType: 'transactional' },
38
+ { key: `${resource}.create`, name: 'Create', value: `${resource}.create`, description: `Create a ${resource} document`, method: 'POST', path, pathParam: null, bodyMode: 'raw_json', docType: 'transactional' },
39
+ { key: `${resource}.update`, name: 'Update', value: `${resource}.update`, description: `Update a ${resource} document`, method: 'PUT', path, pathParam, bodyMode: 'raw_json', docType: 'transactional' },
40
+ { key: `${resource}.delete`, name: 'Delete', value: `${resource}.delete`, description: `Delete a ${resource} document`, method: 'DELETE', path, pathParam, bodyMode: 'none', docType: 'transactional' },
41
+ ];
42
+ }
43
+ function hybridOps(resource, path) {
44
+ return [
45
+ { key: `${resource}.list`, name: 'List', value: `${resource}.list`, description: `List ${resource} records`, method: 'GET', path, pathParam: null, bodyMode: 'none', docType: 'transactional' },
46
+ { key: `${resource}.get`, name: 'Get', value: `${resource}.get`, description: `Get a single ${resource}`, method: 'GET', path, pathParam: 'CODE', bodyMode: 'none', docType: 'transactional' },
47
+ { key: `${resource}.create`, name: 'Create', value: `${resource}.create`, description: `Create a ${resource}`, method: 'POST', path, pathParam: null, bodyMode: 'guided', docType: 'transactional' },
48
+ { key: `${resource}.update`, name: 'Update', value: `${resource}.update`, description: `Update a ${resource}`, method: 'PUT', path, pathParam: 'CODE', bodyMode: 'guided', docType: 'transactional' },
49
+ { key: `${resource}.delete`, name: 'Delete', value: `${resource}.delete`, description: `Delete a ${resource}`, method: 'DELETE', path, pathParam: 'CODE', bodyMode: 'none', docType: 'transactional' },
50
+ ];
51
+ }
52
+ function reportOp(resource, path) {
53
+ return [
54
+ { key: `${resource}.get`, name: 'Get', value: `${resource}.get`, description: `Get ${resource} report data`, method: 'GET', path, pathParam: null, bodyMode: 'none', docType: 'report' },
55
+ ];
56
+ }
57
+ // ─────────────────────────────────────────────────────────────────────────────
58
+ // ALL 81 ENDPOINTS
59
+ // ─────────────────────────────────────────────────────────────────────────────
60
+ exports.RESOURCES = [
61
+ // ── MASTER DATA (20) ──────────────────────────────────────────────────────
62
+ { name: 'Account', value: 'account', operations: masterOps('account', '/account') },
63
+ { name: 'Agent', value: 'agent', operations: masterOps('agent', '/agent') },
64
+ { name: 'Area', value: 'area', operations: masterOps('area', '/area') },
65
+ { name: 'Asset Disposal', value: 'assetdisposal', operations: masterOps('assetdisposal', '/assetdisposal') },
66
+ { name: 'Asset Group', value: 'assetgroup', operations: masterOps('assetgroup', '/assetgroup') },
67
+ { name: 'Asset Item', value: 'assetitem', operations: masterOps('assetitem', '/assetitem') },
68
+ { name: 'Stock Batch', value: 'batch', operations: masterOps('batch', '/batch', 'AUTOKEY') },
69
+ { name: 'Company Category', value: 'companycategory', operations: masterOpsNoGet('companycategory', '/companycategory') },
70
+ { name: 'Location', value: 'location', operations: masterOps('location', '/location') },
71
+ { name: 'Member Point', value: 'memberpoint', operations: masterOps('memberpoint', '/memberpoint') },
72
+ { name: 'Payment Method', value: 'pmmethod', operations: masterOps('pmmethod', '/pmmethod') },
73
+ { name: 'Price Tag', value: 'pricetag', operations: masterOps('pricetag', '/pricetag') },
74
+ { name: 'Project', value: 'project', operations: masterOps('project', '/project') },
75
+ { name: 'Shipper', value: 'shipper', operations: masterOps('shipper', '/shipper') },
76
+ { name: 'Stock Category', value: 'stockcategory', operations: masterOpsNoGet('stockcategory', '/stockcategory') },
77
+ { name: 'Stock Group', value: 'stockgroup', operations: masterOpsNoGet('stockgroup', '/stockgroup') },
78
+ { name: 'Tariff', value: 'tariff', operations: masterOpsNoGet('tariff', '/tariff', 'AUTOKEY') },
79
+ { name: 'Tax', value: 'tax', operations: masterOpsNoGet('tax', '/tax', 'AUTOKEY') },
80
+ { name: 'Terms', value: 'terms', operations: masterOpsNoGet('terms', '/terms') },
81
+ { name: 'Withholding Tax', value: 'whtax', operations: masterOpsNoGet('whtax', '/whtax', 'AUTOKEY') },
82
+ // ── SALES (9) ─────────────────────────────────────────────────────────────
83
+ { name: 'Sales Invoice', value: 'salesinvoice', operations: txOps('salesinvoice', '/salesinvoice') },
84
+ { name: 'Sales Order', value: 'salesorder', operations: txOps('salesorder', '/salesorder') },
85
+ { name: 'Sales Quotation', value: 'salesquotation', operations: txOps('salesquotation', '/salesquotation') },
86
+ { name: 'Sales Credit Note', value: 'salescreditnote', operations: txOps('salescreditnote', '/salescreditnote') },
87
+ { name: 'Sales Debit Note', value: 'salesdebitnote', operations: txOps('salesdebitnote', '/salesdebitnote') },
88
+ { name: 'Sales Cancelled Note', value: 'salescancellednote', operations: txOps('salescancellednote', '/salescancellednote') },
89
+ { name: 'Cash Sales', value: 'cashsales', operations: txOps('cashsales', '/cashsales') },
90
+ { name: 'Delivery Order', value: 'deliveryorder', operations: txOps('deliveryorder', '/deliveryorder') },
91
+ { name: 'Extra Delivery Order', value: 'extradeliveryorder', operations: txOps('extradeliveryorder', '/extradeliveryorder') },
92
+ // ── PURCHASE (9) ──────────────────────────────────────────────────────────
93
+ { name: 'Purchase Invoice', value: 'purchaseinvoice', operations: txOps('purchaseinvoice', '/purchaseinvoice') },
94
+ { name: 'Purchase Order', value: 'purchaseorder', operations: txOps('purchaseorder', '/purchaseorder') },
95
+ { name: 'Purchase Request', value: 'purchaserequest', operations: txOps('purchaserequest', '/purchaserequest') },
96
+ { name: 'Purchase Return', value: 'purchasereturned', operations: txOps('purchasereturned', '/purchasereturned') },
97
+ { name: 'Purchase Debit Note', value: 'purchasedebitnote', operations: txOps('purchasedebitnote', '/purchasedebitnote') },
98
+ { name: 'Purchase Cancelled Note', value: 'purchasecancellednote', operations: txOps('purchasecancellednote', '/purchasecancellednote') },
99
+ { name: 'Cash Purchase', value: 'cashpurchase', operations: txOps('cashpurchase', '/cashpurchase') },
100
+ { name: 'Goods Received', value: 'goodsreceived', operations: txOps('goodsreceived', '/goodsreceived') },
101
+ { name: 'Extra Goods Received', value: 'extragoodsreceived', operations: txOps('extragoodsreceived', '/extragoodsreceived') },
102
+ // ── AR (8) ────────────────────────────────────────────────────────────────
103
+ { name: 'Customer', value: 'customer', operations: hybridOps('customer', '/customer') },
104
+ { name: 'Customer Invoice', value: 'customerinvoice', operations: txOps('customerinvoice', '/customerinvoice') },
105
+ { name: 'Customer Credit Note', value: 'customercreditnote', operations: txOps('customercreditnote', '/customercreditnote') },
106
+ { name: 'Customer Debit Note', value: 'customerdebitnote', operations: txOps('customerdebitnote', '/customerdebitnote') },
107
+ { name: 'Customer Payment', value: 'customerpayment', operations: txOps('customerpayment', '/customerpayment') },
108
+ { name: 'Customer Deposit', value: 'customerdeposit', operations: txOps('customerdeposit', '/customerdeposit') },
109
+ { name: 'Customer Refund', value: 'customerrefund', operations: txOps('customerrefund', '/customerrefund') },
110
+ { name: 'Customer Contra', value: 'customercontra', operations: txOps('customercontra', '/customercontra') },
111
+ // ── AP (8) ────────────────────────────────────────────────────────────────
112
+ { name: 'Supplier', value: 'supplier', operations: hybridOps('supplier', '/supplier') },
113
+ { name: 'Supplier Invoice', value: 'supplierinvoice', operations: txOps('supplierinvoice', '/supplierinvoice') },
114
+ { name: 'Supplier Credit Note', value: 'suppliercreditnote', operations: txOps('suppliercreditnote', '/suppliercreditnote') },
115
+ { name: 'Supplier Debit Note', value: 'supplierdebitnote', operations: txOps('supplierdebitnote', '/supplierdebitnote') },
116
+ { name: 'Supplier Payment', value: 'supplierpayment', operations: txOps('supplierpayment', '/supplierpayment') },
117
+ { name: 'Supplier Deposit', value: 'supplierdeposit', operations: txOps('supplierdeposit', '/supplierdeposit') },
118
+ { name: 'Supplier Refund', value: 'supplierrefund', operations: txOps('supplierrefund', '/supplierrefund') },
119
+ { name: 'Supplier Contra', value: 'suppliercontra', operations: txOps('suppliercontra', '/suppliercontra') },
120
+ // ── GL / STOCK / MFG (14) ─────────────────────────────────────────────────
121
+ { name: 'Journal Entry', value: 'journalentry', operations: txOps('journalentry', '/journalentry') },
122
+ { name: 'Payment Voucher', value: 'paymentvoucher', operations: txOps('paymentvoucher', '/paymentvoucher') },
123
+ { name: 'Receipt Voucher', value: 'receiptvoucher', operations: txOps('receiptvoucher', '/receiptvoucher') },
124
+ { name: 'Bank Adjustment', value: 'bankadjustment', operations: txOps('bankadjustment', '/bankadjustment') },
125
+ { name: 'Stock Item', value: 'stockitem', operations: txOps('stockitem', '/stockitem') },
126
+ { name: 'Stock Adjustment', value: 'stockadjustment', operations: txOps('stockadjustment', '/stockadjustment') },
127
+ { name: 'Stock Issue', value: 'stockissue', operations: txOps('stockissue', '/stockissue') },
128
+ { name: 'Stock Received', value: 'stockreceived', operations: txOps('stockreceived', '/stockreceived') },
129
+ { name: 'Stock Transfer', value: 'stocktransfer', operations: txOps('stocktransfer', '/stocktransfer') },
130
+ { name: 'Assembly', value: 'assembly', operations: txOps('assembly', '/assembly') },
131
+ { name: 'Disassembly', value: 'disassembly', operations: txOps('disassembly', '/disassembly') },
132
+ { name: 'Job Order', value: 'joborder', operations: txOps('joborder', '/joborder') },
133
+ { name: 'Item Template', value: 'itemtemplate', operations: txOps('itemtemplate', '/itemtemplate') },
134
+ { name: 'Currency', value: 'currency', operations: hybridOps('currency', '/currency') },
135
+ // ── REPORTS (13) ─────────────────────────────────────────────────────────
136
+ { name: 'Company Profile', value: 'profile', operations: reportOp('profile', '/profile') },
137
+ { name: 'App Version', value: 'version', operations: reportOp('version', '/version') },
138
+ { name: 'Stock Aging', value: 'stockaging', operations: reportOp('stockaging', '/stockaging') },
139
+ { name: 'Stock Analysis', value: 'stockanalysis', operations: reportOp('stockanalysis', '/stockanalysis') },
140
+ { name: 'Stock Balance Inquiry', value: 'stockbalanceinquiry', operations: reportOp('stockbalanceinquiry', '/stockbalanceinquiry') },
141
+ { name: 'Stock Batch Expiry', value: 'stockbatchexpiry', operations: reportOp('stockbatchexpiry', '/stockbatchexpiry') },
142
+ { name: 'Stock Card', value: 'stockcard', operations: reportOp('stockcard', '/stockcard') },
143
+ { name: 'Stock Card Qty', value: 'stockcardqty', operations: reportOp('stockcardqty', '/stockcardqty') },
144
+ { name: 'Stock Month End Balance', value: 'stockmonthendbalance', operations: reportOp('stockmonthendbalance', '/stockmonthendbalance') },
145
+ { name: 'Stock Physical Worksheet', value: 'stockphysicalworksheet', operations: reportOp('stockphysicalworksheet', '/stockphysicalworksheet') },
146
+ { name: 'Stock Reorder Advice', value: 'stockreorderadvice', operations: reportOp('stockreorderadvice', '/stockreorderadvice') },
147
+ { name: 'Stock Serial No Conflict', value: 'stockserialnumberconflict', operations: reportOp('stockserialnumberconflict', '/stockserialnumberconflict') },
148
+ { name: 'Stock Serial No Outstanding', value: 'stockserialnumberoutstanding', operations: reportOp('stockserialnumberoutstanding', '/stockserialnumberoutstanding') },
149
+ ];
150
+ // Flat lookup map: operation_key → OperationDef
151
+ exports.OPERATION_MAP = {};
152
+ for (const resource of exports.RESOURCES) {
153
+ for (const op of resource.operations) {
154
+ exports.OPERATION_MAP[op.key] = op;
155
+ }
156
+ }
157
+ // Keys for operations that need a path param (used for displayOptions)
158
+ exports.OPS_WITH_PATH_PARAM = Object.values(exports.OPERATION_MAP)
159
+ .filter((op) => op.pathParam !== null)
160
+ .map((op) => op.key);
161
+ // Keys for list operations (GET, no path param, not report)
162
+ exports.OPS_LIST = Object.values(exports.OPERATION_MAP)
163
+ .filter((op) => op.pathParam === null && op.method === 'GET' && op.docType !== 'report')
164
+ .map((op) => op.key);
165
+ // Keys for all GET operations with no path param (list + reports)
166
+ exports.OPS_GET_NO_PARAM = Object.values(exports.OPERATION_MAP)
167
+ .filter((op) => op.pathParam === null && op.method === 'GET')
168
+ .map((op) => op.key);
169
+ // Keys for raw_json body operations
170
+ exports.OPS_RAW_JSON = Object.values(exports.OPERATION_MAP)
171
+ .filter((op) => op.bodyMode === 'raw_json')
172
+ .map((op) => op.key);
173
+ // Keys for guided body operations
174
+ exports.OPS_GUIDED = Object.values(exports.OPERATION_MAP)
175
+ .filter((op) => op.bodyMode === 'guided')
176
+ .map((op) => op.key);
177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL25vZGVzL1NxbEFjY291bnRpbmcvb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7QUFvQkgsZ0ZBQWdGO0FBQ2hGLFVBQVU7QUFDVixnRkFBZ0Y7QUFDaEYsU0FBUyxTQUFTLENBQ2pCLFFBQWdCLEVBQ2hCLElBQVksRUFDWixZQUFnQyxNQUFNO0lBRXRDLE9BQU87UUFDTixFQUFFLEdBQUcsRUFBRSxHQUFHLFFBQVEsT0FBTyxFQUFJLElBQUksRUFBRSxNQUFNLEVBQUksS0FBSyxFQUFFLEdBQUcsUUFBUSxPQUFPLEVBQUksV0FBVyxFQUFFLFFBQVEsUUFBUSxVQUFVLEVBQWdCLE1BQU0sRUFBRSxLQUFLLEVBQUssSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBSSxPQUFPLEVBQUUsUUFBUSxFQUFFO1FBQ2pOLEVBQUUsR0FBRyxFQUFFLEdBQUcsUUFBUSxNQUFNLEVBQUssSUFBSSxFQUFFLEtBQUssRUFBSyxLQUFLLEVBQUUsR0FBRyxRQUFRLE1BQU0sRUFBSyxXQUFXLEVBQUUsZ0JBQWdCLFFBQVEsT0FBTyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFLLElBQUksRUFBRSxTQUFTLEVBQU8sUUFBUSxFQUFFLE1BQU0sRUFBSSxPQUFPLEVBQUUsUUFBUSxFQUFFO1FBQ2xOLEVBQUUsR0FBRyxFQUFFLEdBQUcsUUFBUSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxRQUFRLFNBQVMsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLFFBQVEsRUFBRSxFQUFnQixNQUFNLEVBQUUsTUFBTSxFQUFJLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRTtRQUNqTixF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
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60">
2
+ <rect width="60" height="60" rx="10" fill="#1a1a2e"/>
3
+ <text x="50%" y="36" font-family="Arial,sans-serif" font-size="13" font-weight="bold"
4
+ fill="#4fc3f7" text-anchor="middle">SQL</text>
5
+ <rect x="8" y="40" width="44" height="3" rx="1.5" fill="#4fc3f7" opacity="0.6"/>
6
+ <rect x="8" y="46" width="30" height="3" rx="1.5" fill="#4fc3f7" opacity="0.3"/>
7
+ </svg>
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "n8n-nodes-sqlaccounting",
3
+ "version": "1.0.0",
4
+ "description": "n8n community node for SQL Accounting REST API (Malaysia). Credit-based usage via the SQL Accounting n8n Node platform.",
5
+ "keywords": [
6
+ "n8n-community-node-package",
7
+ "sql-accounting",
8
+ "malaysia",
9
+ "accounting",
10
+ "erp",
11
+ "automation"
12
+ ],
13
+ "license": "MIT",
14
+ "homepage": "https://github.com/laurentyew/n8n-nodes-sqlaccounting",
15
+ "author": {
16
+ "name": "Your Name",
17
+ "email": "your@email.com"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/laurentyew/n8n-nodes-sqlaccounting.git"
22
+ },
23
+ "main": "index.js",
24
+ "scripts": {
25
+ "build": "tsc && gulp build:icons",
26
+ "dev": "tsc --watch",
27
+ "format": "prettier nodes credentials --write",
28
+ "lint": "eslint nodes/**/*.ts credentials/**/*.ts",
29
+ "lintfix": "eslint nodes/**/*.ts credentials/**/*.ts --fix",
30
+ "prepublishOnly": "npm run build && npm run lint"
31
+ },
32
+ "files": [
33
+ "dist"
34
+ ],
35
+ "n8n": {
36
+ "n8nNodesApiVersion": 1,
37
+ "credentials": [
38
+ "dist/credentials/SqlAccountingApi.credentials.js"
39
+ ],
40
+ "nodes": [
41
+ "dist/nodes/SqlAccounting/SqlAccounting.node.js"
42
+ ]
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^18.16.16",
46
+ "@typescript-eslint/parser": "^6.0.0",
47
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
48
+ "eslint": "^8.0.0",
49
+ "eslint-plugin-n8n-nodes-base": "^1.16.1",
50
+ "gulp": "^4.0.2",
51
+ "prettier": "^3.0.0",
52
+ "typescript": "^5.1.3"
53
+ },
54
+ "peerDependencies": {
55
+ "n8n-workflow": "*"
56
+ },
57
+ "dependencies": {}
58
+ }