tally-xml-tdl 1.22.2 → 1.22.4

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 (43) hide show
  1. package/package.json +2 -3
  2. package/src/v20/company/body.xml +25 -0
  3. package/src/v20/company/index.js +29 -0
  4. package/src/v20/company/tdl.json +4 -0
  5. package/src/v20/core/buildXml.js +9 -0
  6. package/src/v20/core/execute/executeXml.js +16 -0
  7. package/src/v20/core/execute/index.js +4 -0
  8. package/src/v20/core/index.js +22 -0
  9. package/src/v20/core/response/index.js +2 -0
  10. package/src/v20/core/response/xmlToJson.js +18 -0
  11. package/src/v20/core/transport/http.js +40 -0
  12. package/src/v20/core/transport/index.js +1 -0
  13. package/src/v20/index.js +6 -0
  14. package/src/v20/masters/body.xml +25 -0
  15. package/src/v20/masters/index.js +39 -0
  16. package/src/v20/masters/masters.json +86 -0
  17. package/src/v20/vouchers/body.xml +25 -0
  18. package/src/v20/vouchers/createVoucherApi.js +38 -0
  19. package/src/v20/vouchers/index.js +5 -0
  20. package/src/v20/vouchers/purchases/index.js +7 -0
  21. package/src/v20/vouchers/sales/index.js +7 -0
  22. package/src/v20/vouchers/tdlMessage.json +4 -0
  23. package/src/v22/body.xml +25 -0
  24. package/src/v22/company/index.js +7 -0
  25. package/src/v22/core/buildXml.js +9 -0
  26. package/src/v22/core/execute/executeXml.js +16 -0
  27. package/src/v22/core/execute/index.js +4 -0
  28. package/src/v22/core/index.js +22 -0
  29. package/src/v22/core/response/index.js +2 -0
  30. package/src/v22/core/response/xmlToJson.js +18 -0
  31. package/src/v22/core/transport/http.js +40 -0
  32. package/src/v22/core/transport/index.js +1 -0
  33. package/src/v22/createApi.js +87 -0
  34. package/src/v22/index.js +6 -0
  35. package/src/v22/masters/Ledger/index.js +22 -0
  36. package/src/v22/masters/StockGroup/index.js +18 -0
  37. package/src/v22/masters/StockItem/index.js +20 -0
  38. package/src/v22/masters/Unit/index.js +16 -0
  39. package/src/v22/masters/index.js +57 -0
  40. package/src/v22/tdlMessage.json +31 -0
  41. package/src/v22/vouchers/index.js +5 -0
  42. package/src/v22/vouchers/purchases/index.js +7 -0
  43. package/src/v22/vouchers/sales/index.js +7 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tally-xml-tdl",
3
- "version": "1.22.2",
3
+ "version": "1.22.4",
4
4
  "description": "Simple, clean TDL and XML extraction and manipulation tools for Tally",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
@@ -15,8 +15,7 @@
15
15
  }
16
16
  },
17
17
  "files": [
18
- "src/v21",
19
- "src/index.js",
18
+ "src",
20
19
  "index.js",
21
20
  "index.d.ts",
22
21
  "README.md",
@@ -0,0 +1,25 @@
1
+ <ENVELOPE>
2
+ <HEADER>
3
+ <VERSION>1</VERSION>
4
+ <TALLYREQUEST>Export</TALLYREQUEST>
5
+ <TYPE>Collection</TYPE>
6
+ <ID>TDLID</ID>
7
+ </HEADER>
8
+
9
+ <BODY>
10
+ <DESC>
11
+ <STATICVARIABLES>
12
+ <SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>
13
+ {{STATICVARIABLES}}
14
+ </STATICVARIABLES>
15
+
16
+ <TDL>
17
+ <TDLMESSAGE>
18
+ <COLLECTION NAME="TDLID">
19
+ {{TDLMESSAGE}}
20
+ </COLLECTION>
21
+ </TDLMESSAGE>
22
+ </TDL>
23
+ </DESC>
24
+ </BODY>
25
+ </ENVELOPE>
@@ -0,0 +1,29 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { fileURLToPath } from "url";
4
+
5
+ import { executeXml } from "../core/index.js";
6
+ import { buildXml } from "../core/buildXml.js";
7
+ import tdlJson from "./tdl.json" with { type: "json" };
8
+
9
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
10
+ const body = fs.readFileSync(path.join(__dirname, "body.xml"), "utf8");
11
+
12
+ const startFunc = async (showLog = false) => {
13
+ const { tdlMessage } = tdlJson;
14
+ if (showLog) console.log("tdlMessage : ", tdlMessage);
15
+
16
+ const xml = buildXml(body, {
17
+ tdlMessage
18
+ });
19
+
20
+ if (showLog) console.log("xml : ", xml);
21
+
22
+ const jsonToReturn = await executeXml(xml);
23
+
24
+ if (showLog) console.log("jsonToReturn : ", jsonToReturn);
25
+
26
+ return jsonToReturn;
27
+ };
28
+
29
+ export default startFunc;
@@ -0,0 +1,4 @@
1
+ {
2
+ "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
3
+ "tdlMessage": "<TYPE>Company</TYPE><FETCH>$$Alias:Name</FETCH>"
4
+ }
@@ -0,0 +1,9 @@
1
+ export const buildXml = (body, {
2
+ staticVariables = "",
3
+ tdlMessage
4
+ }) => {
5
+
6
+ return body
7
+ .replace("{{STATICVARIABLES}}", staticVariables)
8
+ .replace("{{TDLMESSAGE}}", tdlMessage);
9
+ };
@@ -0,0 +1,16 @@
1
+ // src/v4/core/execute/executeXml.js
2
+ import { sendXml } from "../transport/http.js";
3
+ import { xmlToJson } from "../response/xmlToJson.js";
4
+
5
+ const startFunc = async (
6
+ xml,
7
+ { url = "http://localhost:9000" } = {}
8
+ ) => {
9
+ const rawXml = await sendXml({ xml, url });
10
+
11
+ const json = xmlToJson(rawXml);
12
+ // console.log("json :", json);
13
+ return json;
14
+ };
15
+
16
+ export default startFunc;
@@ -0,0 +1,4 @@
1
+ import executeXml from "./executeXml.js";
2
+
3
+ export { executeXml };
4
+ export default executeXml;
@@ -0,0 +1,22 @@
1
+ // Sub-modules
2
+ export * as transport from "./transport/index.js";
3
+ export * as response from "./response/index.js";
4
+ export * as execute from "./execute/index.js";
5
+
6
+ // Direct Core Exports
7
+ export {
8
+ sendXml,
9
+ sendToTally
10
+ } from "./transport/index.js";
11
+
12
+ export {
13
+ xmlToJson
14
+ } from "./response/index.js";
15
+
16
+ export {
17
+ executeXml
18
+ } from "./execute/index.js";
19
+
20
+ export {
21
+ buildXml
22
+ } from "./buildXml.js";
@@ -0,0 +1,2 @@
1
+ export { xmlToJson } from "./xmlToJson.js";
2
+
@@ -0,0 +1,18 @@
1
+ import { XMLParser } from "fast-xml-parser";
2
+
3
+ /**
4
+ * Converts XML string into a JavaScript Object.
5
+ * Preserves XML attributes using the `@_` prefix.
6
+ *
7
+ * @param {string} xml - The XML string to parse.
8
+ * @param {object} [options] - Optional XMLParser configurations.
9
+ * @returns {object} The parsed JavaScript object.
10
+ */
11
+ export const xmlToJson = (xml, options = {}) => {
12
+ const parser = new XMLParser({
13
+ ignoreAttributes: false,
14
+ ...options
15
+ });
16
+
17
+ return parser.parse(xml);
18
+ };
@@ -0,0 +1,40 @@
1
+ import { xmlToJson } from "../response/xmlToJson.js";
2
+
3
+ /**
4
+ * Sends a raw XML string to Tally via HTTP POST and returns the raw response text.
5
+ *
6
+ * @param {object} params
7
+ * @param {string} params.xml - The XML payload to send.
8
+ * @param {string} [params.url="http://localhost:9000"] - Tally HTTP endpoint URL.
9
+ * @returns {Promise<string>} Raw XML response text from Tally.
10
+ */
11
+ export const sendXml = async ({
12
+ xml,
13
+ url = "http://localhost:9000"
14
+ } = {}) => {
15
+ const res = await fetch(url, {
16
+ method: "POST",
17
+ headers: {
18
+ "Content-Type": "text/xml"
19
+ },
20
+ body: xml
21
+ });
22
+
23
+ return await res.text();
24
+ };
25
+
26
+ /**
27
+ * Sends an XML payload to Tally via HTTP POST and parses the response to JSON.
28
+ *
29
+ * @param {object} params
30
+ * @param {string} params.xml - The XML string to send.
31
+ * @param {string} [params.url="http://localhost:9000"] - Tally HTTP endpoint URL.
32
+ * @returns {Promise<object>} Parsed JSON response from Tally.
33
+ */
34
+ export const sendToTally = async ({
35
+ xml,
36
+ url = "http://localhost:9000"
37
+ } = {}) => {
38
+ const text = await sendXml({ xml, url });
39
+ return xmlToJson(text);
40
+ };
@@ -0,0 +1 @@
1
+ export { sendXml, sendToTally } from "./http.js";
@@ -0,0 +1,6 @@
1
+ import company from "./company/index.js";
2
+ import masters from "./masters/index.js";
3
+ import vouchers from "./vouchers/index.js";
4
+
5
+ export { company, masters, vouchers };
6
+ export default company;
@@ -0,0 +1,25 @@
1
+ <ENVELOPE>
2
+ <HEADER>
3
+ <VERSION>1</VERSION>
4
+ <TALLYREQUEST>Export</TALLYREQUEST>
5
+ <TYPE>Collection</TYPE>
6
+ <ID>TDLID</ID>
7
+ </HEADER>
8
+
9
+ <BODY>
10
+ <DESC>
11
+ <STATICVARIABLES>
12
+ <SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>
13
+ {{STATICVARIABLES}}
14
+ </STATICVARIABLES>
15
+
16
+ <TDL>
17
+ <TDLMESSAGE>
18
+ <COLLECTION NAME="TDLID">
19
+ {{TDLMESSAGE}}
20
+ </COLLECTION>
21
+ </TDLMESSAGE>
22
+ </TDL>
23
+ </DESC>
24
+ </BODY>
25
+ </ENVELOPE>
@@ -0,0 +1,39 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { fileURLToPath } from "url";
4
+
5
+ import { executeXml } from "../core/index.js";
6
+ import { buildXml } from "../core/buildXml.js";
7
+ import bodyJson from "./masters.json" with { type: "json" };
8
+
9
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
10
+ const body = fs.readFileSync(path.join(__dirname, "body.xml"), "utf8");
11
+
12
+ const get = (company, jsonId) => {
13
+ const { tdlMessage } = bodyJson[jsonId];
14
+
15
+ const staticVariables = `<SVCURRENTCOMPANY>${company}</SVCURRENTCOMPANY>`;
16
+
17
+ const xml = buildXml(body, {
18
+ staticVariables,
19
+ tdlMessage
20
+ });
21
+
22
+ return executeXml(xml);
23
+ };
24
+
25
+ const clean = (company, jsonId) => {
26
+ const { tdlMessage, staticVariables } = bodyJson[jsonId];
27
+
28
+ const companyFilter = `<SVCURRENTCOMPANY>${company}</SVCURRENTCOMPANY>${staticVariables || ""}`;
29
+
30
+ const xml = buildXml(body, {
31
+ staticVariables: companyFilter,
32
+ tdlMessage
33
+ });
34
+
35
+ return executeXml(xml);
36
+ };
37
+
38
+ export { get, clean };
39
+ export default { get, clean };
@@ -0,0 +1,86 @@
1
+ {
2
+ "company": {
3
+ "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
4
+ "tdlMessage": "<TYPE>Company</TYPE><FETCH>$$Alias:Name</FETCH>"
5
+ },
6
+ "allPurchases": {
7
+ "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
8
+ "tdlMessage": "<TYPE>Vouchers</TYPE><FETCH>Date</FETCH>"
9
+ },
10
+ "purchasesPeriod": {
11
+ "staticVariables": "<SVFROMDATE TYPE=\"Date\">1-Apr-2026</SVFROMDATE><SVTODATE TYPE=\"Date\">30-Apr-2026</SVTODATE>",
12
+ "tdlMessage": "<TYPE>Vouchers</TYPE><FETCH>Date</FETCH>"
13
+ },
14
+ "uom": {
15
+ "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
16
+ "tdlMessage": "<TYPE>Unit</TYPE><FETCH>$$Alias:Name</FETCH>"
17
+ },
18
+ "stockItems": {
19
+ "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
20
+ "tdlMessage": "<TYPE>StockItem</TYPE><FETCH>$$Alias:Name</FETCH>"
21
+ },
22
+ "stockItemsWithBaseUnits": {
23
+ "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
24
+ "tdlMessage": "<TYPE>StockItem</TYPE><FETCH>$$Alias:Name</FETCH><FETCH>BaseUnits</FETCH>"
25
+ },
26
+ "ledgerNames": {
27
+ "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
28
+ "tdlMessage": "<TYPE>Ledger</TYPE><FETCH>$$Alias:Name</FETCH>"
29
+ },
30
+ "ledgerNamesWithDetails": {
31
+ "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
32
+ "tdlMessage": "<TYPE>Ledger</TYPE><FETCH>$$Alias:Name</FETCH><FETCH>GSTRegistrationType</FETCH><FETCH>GSTIN</FETCH>"
33
+ },
34
+ "ledgerNamesMoreDetails": {
35
+ "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
36
+ "tdlMessage": "<TYPE>Ledger</TYPE><FETCH>$$Alias:Name</FETCH><FETCH>LEDGSTREGDETAILS.LIST</FETCH>"
37
+ },
38
+ "stockGroups": {
39
+ "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
40
+ "tdlMessage": "<TYPE>StockGroup</TYPE><FETCH>$$Alias:Name</FETCH>"
41
+ },
42
+ "stockGroupsAndParent": {
43
+ "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
44
+ "tdlMessage": "<TYPE>StockGroup</TYPE><FETCH>$$Alias:Name</FETCH><FETCH>Parent</FETCH>"
45
+ },
46
+ "purchases1": {
47
+ "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT><SVFROMDATE>1-Apr-2026</SVFROMDATE><SVTODATE>30-Apr-2026</SVTODATE>",
48
+ "tdlMessage": "<TYPE>Voucher</TYPE><FILTER>$$IsPurchase:$VoucherTypeName</FILTER><FETCH>Date</FETCH><FETCH>VoucherNumber</FETCH><FETCH>VoucherTypeName</FETCH><FETCH>PartyLedgerName</FETCH><FETCH>Amount</FETCH>"
49
+ },
50
+ "purchases2": {
51
+ "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT><SVFROMDATE>1-Apr-2026</SVFROMDATE><SVTODATE>30-Apr-2026</SVTODATE>",
52
+ "tdlMessage": "<TYPE>Vouchers:VoucherType</TYPE><CHILDOF>$$VchTypePurchase</CHILDOF><BELONGSTO>Yes</BELONGSTO><FETCH>Date, VoucherNumber, VoucherTypeName, PartyLedgerName, AllInventoryEntries</FETCH>"
53
+ },
54
+ "purchases3": {
55
+ "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT><SVFROMDATE>1-Apr-2026</SVFROMDATE><SVTODATE>1-Apr-2026</SVTODATE>",
56
+ "tdlMessage": "<TYPE>Voucher</TYPE><SYSTEM TYPE=\"Formulae\" NAME=\"DateFilter\">$Date &gt;= ##SVFROMDATE AND $Date &lt;= ##SVTODATE</SYSTEM><FILTER>DateFilter</FILTER><FETCH>Date</FETCH><FETCH>VoucherNumber</FETCH><FETCH>VoucherTypeName</FETCH><FETCH>PartyLedgerName</FETCH><FETCH>AllInventoryEntries</FETCH>"
57
+ },
58
+ "purchases4": {
59
+ "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT><SVFROMDATE>1-Apr-2026</SVFROMDATE><SVTODATE>1-Apr-2026</SVTODATE>",
60
+ "tdlMessage": "<SYSTEM TYPE=\"Formula\" NAME=\"DateFilter\">$Date &gt;= ##SVFROMDATE AND $Date &lt;= ##SVTODATE</SYSTEM><COLLECTION NAME=\"KeshavPurchases\"><TYPE>Voucher</TYPE><FILTER>DateFilter</FILTER><FETCH>Date</FETCH><FETCH>VoucherNumber</FETCH><FETCH>VoucherTypeName</FETCH><FETCH>PartyLedgerName</FETCH><FETCH>AllInventoryEntries</FETCH></COLLECTION>"
61
+ },
62
+ "purchases5": {
63
+ "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT><SVFROMDATE>1-Apr-2026</SVFROMDATE><SVTODATE>1-Apr-2026</SVTODATE>",
64
+ "tdlMessage": "<SYSTEM TYPE=\"Formulae\" NAME=\"DateFilter\">$Date &gt;= ##SVFROMDATE AND $Date &lt;= ##SVTODATE</SYSTEM><COLLECTION NAME=\"KeshavPurchases\"><TYPE>Voucher</TYPE><FILTER>DateFilter</FILTER><FETCH>Date</FETCH><FETCH>VoucherNumber</FETCH><FETCH>VoucherTypeName</FETCH><FETCH>PartyLedgerName</FETCH><FETCH>AllInventoryEntries</FETCH></COLLECTION>"
65
+ },
66
+ "purchases6": {
67
+ "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT><SVFROMDATE>1-Apr-2026</SVFROMDATE><SVTODATE>1-Apr-2026</SVTODATE>",
68
+ "tdlMessage": "<COLLECTION NAME=\"KeshavPurchases\"><TYPE>Voucher</TYPE><FILTERS>DateFilter</FILTERS><FETCH>Date</FETCH><FETCH>VoucherNumber</FETCH><FETCH>VoucherTypeName</FETCH><FETCH>PartyLedgerName</FETCH><FETCH>AllInventoryEntries</FETCH></COLLECTION><SYSTEM TYPE=\"Formulae\" NAME=\"DateFilter\">$Date &gt;= ##SVFROMDATE AND $Date &lt;= ##SVTODATE</SYSTEM>"
69
+ },
70
+ "purchases7": {
71
+ "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT><SVFROMDATE>1-Apr-2026</SVFROMDATE><SVTODATE>1-Apr-2026</SVTODATE>",
72
+ "tdlMessage": "<COLLECTION NAME=\"KeshavPurchases\"><TYPE>Voucher</TYPE><FILTERS>DateFilter</FILTERS><FETCH>Date</FETCH><FETCH>VoucherNumber</FETCH><FETCH>VoucherTypeName</FETCH><FETCH>PartyLedgerName</FETCH><FETCH>AllInventoryEntries</FETCH></COLLECTION><SYSTEM TYPE=\"Formulae\" NAME=\"DateFilter\">$Date &gt;= ##SVFROMDATE AND $Date &lt;= ##SVTODATE</SYSTEM>"
73
+ },
74
+ "purchases8": {
75
+ "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
76
+ "tdlMessage": "<COLLECTION NAME=\"KeshavPurchases\"><TYPE>Voucher</TYPE><FETCH>Date</FETCH><FETCH>VoucherNumber</FETCH><FETCH>VoucherTypeName</FETCH></COLLECTION>"
77
+ },
78
+ "purchases9": {
79
+ "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
80
+ "tdlMessage": "<COLLECTION NAME=\"KeshavPurchaseInventory\"><TYPE>Vouchers:VoucherType</TYPE><CHILDOF>$$VchTypePurchase</CHILDOF><BELONGSTO>Yes</BELONGSTO><FETCH>Date, VoucherNumber, VoucherTypeName, PartyLedgerName, AllInventoryEntries</FETCH></COLLECTION>"
81
+ },
82
+ "purchases10": {
83
+ "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT><SVFROMDATE TYPE=\"Date\">4-Sep-2026</SVFROMDATE><SVTODATE TYPE=\"Date\">4-Sep-2026</SVTODATE>",
84
+ "tdlMessage": "<TYPE>Vouchers:VoucherType</TYPE><CHILDOF>$$VchTypePurchase</CHILDOF><BELONGSTO>Yes</BELONGSTO><FETCH>AllInventoryEntries</FETCH><FETCH>Date</FETCH>"
85
+ }
86
+ }
@@ -0,0 +1,25 @@
1
+ <ENVELOPE>
2
+ <HEADER>
3
+ <VERSION>1</VERSION>
4
+ <TALLYREQUEST>Export</TALLYREQUEST>
5
+ <TYPE>Collection</TYPE>
6
+ <ID>TDLID</ID>
7
+ </HEADER>
8
+
9
+ <BODY>
10
+ <DESC>
11
+ <STATICVARIABLES>
12
+ <SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>
13
+ {{STATICVARIABLES}}
14
+ </STATICVARIABLES>
15
+
16
+ <TDL>
17
+ <TDLMESSAGE>
18
+ <COLLECTION NAME="TDLID">
19
+ {{TDLMESSAGE}}
20
+ </COLLECTION>
21
+ </TDLMESSAGE>
22
+ </TDL>
23
+ </DESC>
24
+ </BODY>
25
+ </ENVELOPE>
@@ -0,0 +1,38 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { fileURLToPath } from "url";
4
+ import { executeXml } from "../core/index.js";
5
+ import { buildXml } from "../core/buildXml.js";
6
+
7
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
+ const body = fs.readFileSync(path.join(__dirname, "body.xml"), "utf8");
9
+
10
+ const createVoucherApi = (tdlMessageString) => {
11
+ const period = async (company, fromDate, toDate) => {
12
+ const staticVariables = `<SVCURRENTCOMPANY>${company}</SVCURRENTCOMPANY>
13
+ <SVFROMDATE TYPE="Date">${fromDate}</SVFROMDATE><SVTODATE TYPE="Date">${toDate}</SVTODATE>`;
14
+
15
+ const xml = buildXml(body, {
16
+ staticVariables,
17
+ tdlMessage: tdlMessageString
18
+ });
19
+
20
+ return await executeXml(xml);
21
+ };
22
+
23
+ const all = async (company) => {
24
+ const staticVariables = `<SVCURRENTCOMPANY>${company}</SVCURRENTCOMPANY>`;
25
+
26
+ const xml = buildXml(body, {
27
+ staticVariables,
28
+ tdlMessage: tdlMessageString
29
+ });
30
+
31
+ return await executeXml(xml);
32
+ };
33
+
34
+ return { period, all };
35
+ };
36
+
37
+ export { createVoucherApi };
38
+ export default createVoucherApi;
@@ -0,0 +1,5 @@
1
+ import * as purchases from "./purchases/index.js";
2
+ import * as sales from "./sales/index.js";
3
+
4
+ export { purchases, sales };
5
+ export default { purchases, sales };
@@ -0,0 +1,7 @@
1
+ import tdlMessage from "../tdlMessage.json" with { type: "json" };
2
+ import createVoucherApi from "../createVoucherApi.js";
3
+
4
+ const { period, all } = createVoucherApi(tdlMessage.purchases);
5
+
6
+ export { period, all };
7
+ export default { period, all };
@@ -0,0 +1,7 @@
1
+ import tdlMessage from "../tdlMessage.json" with { type: "json" };
2
+ import createVoucherApi from "../createVoucherApi.js";
3
+
4
+ const { period, all } = createVoucherApi(tdlMessage.sales);
5
+
6
+ export { period, all };
7
+ export default { period, all };
@@ -0,0 +1,4 @@
1
+ {
2
+ "purchases": "<TYPE>Vouchers:VoucherType</TYPE><CHILDOF>$$$$VchTypePurchase</CHILDOF><BELONGSTO>Yes</BELONGSTO><FETCH>AllInventoryEntries</FETCH><FETCH>Date</FETCH>",
3
+ "sales": "<TYPE>Vouchers:VoucherType</TYPE><CHILDOF>$$$$VchTypeSales</CHILDOF><BELONGSTO>Yes</BELONGSTO><FETCH>AllInventoryEntries</FETCH><FETCH>Date</FETCH>"
4
+ }
@@ -0,0 +1,25 @@
1
+ <ENVELOPE>
2
+ <HEADER>
3
+ <VERSION>1</VERSION>
4
+ <TALLYREQUEST>Export</TALLYREQUEST>
5
+ <TYPE>Collection</TYPE>
6
+ <ID>TDLID</ID>
7
+ </HEADER>
8
+
9
+ <BODY>
10
+ <DESC>
11
+ <STATICVARIABLES>
12
+ <SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>
13
+ {{STATICVARIABLES}}
14
+ </STATICVARIABLES>
15
+
16
+ <TDL>
17
+ <TDLMESSAGE>
18
+ <COLLECTION NAME="TDLID">
19
+ {{TDLMESSAGE}}
20
+ </COLLECTION>
21
+ </TDLMESSAGE>
22
+ </TDL>
23
+ </DESC>
24
+ </BODY>
25
+ </ENVELOPE>
@@ -0,0 +1,7 @@
1
+ import tdlMessage from "../tdlMessage.json" with { type: "json" };
2
+ import { createCompanyApi } from "../createApi.js";
3
+
4
+ const { all } = createCompanyApi(tdlMessage.company);
5
+
6
+ export { all };
7
+ export default { all };
@@ -0,0 +1,9 @@
1
+ export const buildXml = (body, {
2
+ staticVariables = "",
3
+ tdlMessage
4
+ }) => {
5
+
6
+ return body
7
+ .replace("{{STATICVARIABLES}}", staticVariables)
8
+ .replace("{{TDLMESSAGE}}", tdlMessage);
9
+ };
@@ -0,0 +1,16 @@
1
+ // src/v4/core/execute/executeXml.js
2
+ import { sendXml } from "../transport/http.js";
3
+ import { xmlToJson } from "../response/xmlToJson.js";
4
+
5
+ const startFunc = async (
6
+ xml,
7
+ { url = "http://localhost:9000" } = {}
8
+ ) => {
9
+ const rawXml = await sendXml({ xml, url });
10
+
11
+ const json = xmlToJson(rawXml);
12
+ // console.log("json :", json);
13
+ return json;
14
+ };
15
+
16
+ export default startFunc;
@@ -0,0 +1,4 @@
1
+ import executeXml from "./executeXml.js";
2
+
3
+ export { executeXml };
4
+ export default executeXml;
@@ -0,0 +1,22 @@
1
+ // Sub-modules
2
+ export * as transport from "./transport/index.js";
3
+ export * as response from "./response/index.js";
4
+ export * as execute from "./execute/index.js";
5
+
6
+ // Direct Core Exports
7
+ export {
8
+ sendXml,
9
+ sendToTally
10
+ } from "./transport/index.js";
11
+
12
+ export {
13
+ xmlToJson
14
+ } from "./response/index.js";
15
+
16
+ export {
17
+ executeXml
18
+ } from "./execute/index.js";
19
+
20
+ export {
21
+ buildXml
22
+ } from "./buildXml.js";
@@ -0,0 +1,2 @@
1
+ export { xmlToJson } from "./xmlToJson.js";
2
+
@@ -0,0 +1,18 @@
1
+ import { XMLParser } from "fast-xml-parser";
2
+
3
+ /**
4
+ * Converts XML string into a JavaScript Object.
5
+ * Preserves XML attributes using the `@_` prefix.
6
+ *
7
+ * @param {string} xml - The XML string to parse.
8
+ * @param {object} [options] - Optional XMLParser configurations.
9
+ * @returns {object} The parsed JavaScript object.
10
+ */
11
+ export const xmlToJson = (xml, options = {}) => {
12
+ const parser = new XMLParser({
13
+ ignoreAttributes: false,
14
+ ...options
15
+ });
16
+
17
+ return parser.parse(xml);
18
+ };
@@ -0,0 +1,40 @@
1
+ import { xmlToJson } from "../response/xmlToJson.js";
2
+
3
+ /**
4
+ * Sends a raw XML string to Tally via HTTP POST and returns the raw response text.
5
+ *
6
+ * @param {object} params
7
+ * @param {string} params.xml - The XML payload to send.
8
+ * @param {string} [params.url="http://localhost:9000"] - Tally HTTP endpoint URL.
9
+ * @returns {Promise<string>} Raw XML response text from Tally.
10
+ */
11
+ export const sendXml = async ({
12
+ xml,
13
+ url = "http://localhost:9000"
14
+ } = {}) => {
15
+ const res = await fetch(url, {
16
+ method: "POST",
17
+ headers: {
18
+ "Content-Type": "text/xml"
19
+ },
20
+ body: xml
21
+ });
22
+
23
+ return await res.text();
24
+ };
25
+
26
+ /**
27
+ * Sends an XML payload to Tally via HTTP POST and parses the response to JSON.
28
+ *
29
+ * @param {object} params
30
+ * @param {string} params.xml - The XML string to send.
31
+ * @param {string} [params.url="http://localhost:9000"] - Tally HTTP endpoint URL.
32
+ * @returns {Promise<object>} Parsed JSON response from Tally.
33
+ */
34
+ export const sendToTally = async ({
35
+ xml,
36
+ url = "http://localhost:9000"
37
+ } = {}) => {
38
+ const text = await sendXml({ xml, url });
39
+ return xmlToJson(text);
40
+ };
@@ -0,0 +1 @@
1
+ export { sendXml, sendToTally } from "./http.js";
@@ -0,0 +1,87 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { fileURLToPath } from "url";
4
+ import { executeXml } from "./core/index.js";
5
+ import { buildXml } from "./core/buildXml.js";
6
+
7
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
+ const body = fs.readFileSync(path.join(__dirname, "body.xml"), "utf8");
9
+
10
+ const createVoucherApi = (tdlMessageString) => {
11
+ const period = async (company, fromDate, toDate) => {
12
+ const staticVariables = `<SVCURRENTCOMPANY>${company}</SVCURRENTCOMPANY>
13
+ <SVFROMDATE TYPE="Date">${fromDate}</SVFROMDATE><SVTODATE TYPE="Date">${toDate}</SVTODATE>`;
14
+
15
+ const xml = buildXml(body, {
16
+ staticVariables,
17
+ tdlMessage: tdlMessageString
18
+ });
19
+
20
+ return await executeXml(xml);
21
+ };
22
+
23
+ const all = async (company) => {
24
+ const staticVariables = `<SVCURRENTCOMPANY>${company}</SVCURRENTCOMPANY>`;
25
+
26
+ const xml = buildXml(body, {
27
+ staticVariables,
28
+ tdlMessage: tdlMessageString
29
+ });
30
+
31
+ return await executeXml(xml);
32
+ };
33
+
34
+ return { period, all };
35
+ };
36
+
37
+ const createMasterApi = (arg) => {
38
+ const inTdlMessage = (arg && typeof arg === "object" && "inTdlMessage" in arg) ? arg.inTdlMessage : arg;
39
+ const localTdlMessage = inTdlMessage;
40
+
41
+ const all = async (company, jsonId = "all") => {
42
+ const localCompany = company;
43
+ const localJsonId = jsonId;
44
+ const staticVariables = `<SVCURRENTCOMPANY>${localCompany}</SVCURRENTCOMPANY>`;
45
+
46
+ let messageTemplate;
47
+ if (typeof localTdlMessage === "string") {
48
+ messageTemplate = localTdlMessage;
49
+ } else if (localTdlMessage && typeof localTdlMessage === "object") {
50
+ messageTemplate = localTdlMessage[localJsonId] || localTdlMessage.all || localTdlMessage.names || Object.values(localTdlMessage)[0];
51
+ }
52
+
53
+ const xml = buildXml(body, {
54
+ staticVariables,
55
+ tdlMessage: messageTemplate
56
+ });
57
+
58
+ return await executeXml(xml);
59
+ };
60
+
61
+ const mainFn = async (company) => all(company, "all");
62
+ mainFn.all = (company, jsonId) => (jsonId ? all(company, jsonId) : all(company, "all"));
63
+
64
+ if (localTdlMessage && typeof localTdlMessage === "object") {
65
+ for (const [key, msg] of Object.entries(localTdlMessage)) {
66
+ const fn = async (company) => all(company, key);
67
+ fn.all = fn;
68
+ mainFn[key] = fn;
69
+ }
70
+ }
71
+
72
+ return mainFn;
73
+ };
74
+
75
+ const createCompanyApi = (tdlMessageString) => {
76
+ const all = async () => {
77
+ const xml = buildXml(body, {
78
+ tdlMessage: tdlMessageString
79
+ });
80
+
81
+ return await executeXml(xml);
82
+ };
83
+
84
+ return { all };
85
+ };
86
+
87
+ export { createVoucherApi, createMasterApi, createCompanyApi };
@@ -0,0 +1,6 @@
1
+ import company from "./company/index.js";
2
+ import masters, { Unit, StockItem, Ledger, StockGroup } from "./masters/index.js";
3
+ import vouchers from "./vouchers/index.js";
4
+
5
+ export { company, masters, vouchers, Unit, StockItem, Ledger, StockGroup };
6
+ export default company;
@@ -0,0 +1,22 @@
1
+ import tdlMessage from "../../tdlMessage.json" with { type: "json" };
2
+ import { createMasterApi } from "../../createApi.js";
3
+
4
+ const ledgerApi = createMasterApi({ inTdlMessage: tdlMessage.masters.Ledger });
5
+
6
+ const {
7
+ all,
8
+ names,
9
+ withDetails,
10
+ moreDetails,
11
+ withGstDetails
12
+ } = ledgerApi;
13
+
14
+ export {
15
+ all,
16
+ names,
17
+ withDetails,
18
+ moreDetails,
19
+ withGstDetails
20
+ };
21
+
22
+ export default ledgerApi;
@@ -0,0 +1,18 @@
1
+ import tdlMessage from "../../tdlMessage.json" with { type: "json" };
2
+ import { createMasterApi } from "../../createApi.js";
3
+
4
+ const stockGroupApi = createMasterApi({ inTdlMessage: tdlMessage.masters.StockGroup });
5
+
6
+ const {
7
+ all,
8
+ names,
9
+ withParent
10
+ } = stockGroupApi;
11
+
12
+ export {
13
+ all,
14
+ names,
15
+ withParent
16
+ };
17
+
18
+ export default stockGroupApi;
@@ -0,0 +1,20 @@
1
+ import tdlMessage from "../../tdlMessage.json" with { type: "json" };
2
+ import { createMasterApi } from "../../createApi.js";
3
+
4
+ const stockItemApi = createMasterApi({ inTdlMessage: tdlMessage.masters.StockItem });
5
+
6
+ const {
7
+ all,
8
+ names,
9
+ withBaseUnits,
10
+ withBatches
11
+ } = stockItemApi;
12
+
13
+ export {
14
+ all,
15
+ names,
16
+ withBaseUnits,
17
+ withBatches
18
+ };
19
+
20
+ export default stockItemApi;
@@ -0,0 +1,16 @@
1
+ import tdlMessage from "../../tdlMessage.json" with { type: "json" };
2
+ import { createMasterApi } from "../../createApi.js";
3
+
4
+ const unitApi = createMasterApi({ inTdlMessage: tdlMessage.masters.Unit });
5
+
6
+ const {
7
+ all,
8
+ names
9
+ } = unitApi;
10
+
11
+ export {
12
+ all,
13
+ names
14
+ };
15
+
16
+ export default unitApi;
@@ -0,0 +1,57 @@
1
+ import Unit from "./Unit/index.js";
2
+ import StockItem from "./StockItem/index.js";
3
+ import Ledger from "./Ledger/index.js";
4
+ import StockGroup from "./StockGroup/index.js";
5
+
6
+ const all = async (company, type, variant = "all") => {
7
+ const localCompany = company;
8
+ const localType = type;
9
+ const localVariant = variant;
10
+
11
+ const target = masters[localType];
12
+ if (!target) {
13
+ throw new Error(`Master type '${localType}' not found.`);
14
+ }
15
+ if (typeof target[localVariant] === "function") {
16
+ return await target[localVariant](localCompany);
17
+ }
18
+ if (typeof target.all === "function") {
19
+ return await target.all(localCompany, localVariant);
20
+ }
21
+ return await target(localCompany);
22
+ };
23
+
24
+ const masters = {
25
+ all,
26
+ Unit,
27
+ StockItem,
28
+ Ledger,
29
+ StockGroup,
30
+ // Aliases for convenience
31
+ unit: Unit,
32
+ stockItem: StockItem,
33
+ stockItems: StockItem,
34
+ ledger: Ledger,
35
+ ledgers: Ledger,
36
+ stockGroup: StockGroup,
37
+ stockGroups: StockGroup,
38
+ uom: Unit
39
+ };
40
+
41
+ export {
42
+ all,
43
+ Unit,
44
+ StockItem,
45
+ Ledger,
46
+ StockGroup,
47
+ Unit as unit,
48
+ StockItem as stockItem,
49
+ StockItem as stockItems,
50
+ Ledger as ledger,
51
+ Ledger as ledgers,
52
+ StockGroup as stockGroup,
53
+ StockGroup as stockGroups,
54
+ Unit as uom
55
+ };
56
+
57
+ export default masters;
@@ -0,0 +1,31 @@
1
+ {
2
+ "company": "<TYPE>Company</TYPE><FETCH>$$Alias:Name</FETCH>",
3
+ "vouchers": {
4
+ "purchases": "<TYPE>Vouchers:VoucherType</TYPE><CHILDOF>$$$$VchTypePurchase</CHILDOF><BELONGSTO>Yes</BELONGSTO><FETCH>Date, VoucherNumber, VoucherTypeName, PartyLedgerName, Amount, AllInventoryEntries</FETCH>",
5
+ "sales": "<TYPE>Vouchers:VoucherType</TYPE><CHILDOF>$$$$VchTypeSales</CHILDOF><BELONGSTO>Yes</BELONGSTO><FETCH>Date, VoucherNumber, VoucherTypeName, PartyLedgerName, Amount, AllInventoryEntries</FETCH>"
6
+ },
7
+ "masters": {
8
+ "Unit": {
9
+ "all": "<TYPE>Unit</TYPE><FETCH>$$Alias:Name</FETCH>",
10
+ "names": "<TYPE>Unit</TYPE><FETCH>$$Alias:Name</FETCH>"
11
+ },
12
+ "StockItem": {
13
+ "all": "<TYPE>StockItem</TYPE><FETCH>$$Alias:Name</FETCH>",
14
+ "names": "<TYPE>StockItem</TYPE><FETCH>$$Alias:Name</FETCH>",
15
+ "withBaseUnits": "<TYPE>StockItem</TYPE><FETCH>$$Alias:Name</FETCH><FETCH>BaseUnits</FETCH>",
16
+ "withBatches": "<TYPE>StockItem</TYPE><FETCH>$$Alias:Name</FETCH><FETCH>BaseUnits</FETCH><FETCH>BatchAllocations.*</FETCH>"
17
+ },
18
+ "Ledger": {
19
+ "all": "<TYPE>Ledger</TYPE><FETCH>$$Alias:Name</FETCH>",
20
+ "names": "<TYPE>Ledger</TYPE><FETCH>$$Alias:Name</FETCH>",
21
+ "withDetails": "<TYPE>Ledger</TYPE><FETCH>$$Alias:Name</FETCH><FETCH>GSTRegistrationType</FETCH><FETCH>GSTIN</FETCH>",
22
+ "moreDetails": "<TYPE>Ledger</TYPE><FETCH>$$Alias:Name</FETCH><FETCH>LEDGSTREGDETAILS.LIST</FETCH>",
23
+ "withGstDetails": "<TYPE>Ledger</TYPE><FETCH>$$Alias:Name</FETCH><FETCH>LEDGSTREGDETAILS.LIST</FETCH>"
24
+ },
25
+ "StockGroup": {
26
+ "all": "<TYPE>StockGroup</TYPE><FETCH>$$Alias:Name</FETCH>",
27
+ "names": "<TYPE>StockGroup</TYPE><FETCH>$$Alias:Name</FETCH>",
28
+ "withParent": "<TYPE>StockGroup</TYPE><FETCH>$$Alias:Name</FETCH><FETCH>Parent</FETCH>"
29
+ }
30
+ }
31
+ }
@@ -0,0 +1,5 @@
1
+ import * as purchases from "./purchases/index.js";
2
+ import * as sales from "./sales/index.js";
3
+
4
+ export { purchases, sales };
5
+ export default { purchases, sales };
@@ -0,0 +1,7 @@
1
+ import tdlMessage from "../../tdlMessage.json" with { type: "json" };
2
+ import { createVoucherApi } from "../../createApi.js";
3
+
4
+ const { period, all } = createVoucherApi(tdlMessage.vouchers.purchases);
5
+
6
+ export { period, all };
7
+ export default { period, all };
@@ -0,0 +1,7 @@
1
+ import tdlMessage from "../../tdlMessage.json" with { type: "json" };
2
+ import { createVoucherApi } from "../../createApi.js";
3
+
4
+ const { period, all } = createVoucherApi(tdlMessage.vouchers.sales);
5
+
6
+ export { period, all };
7
+ export default { period, all };