tally-xml-tdl 1.16.1 → 1.21.1

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 (55) hide show
  1. package/package.json +2 -2
  2. package/src/index.js +43 -3
  3. package/src/v21/company/index.js +7 -0
  4. package/src/{v16 → v21}/core/execute/executeXml.js +1 -1
  5. package/src/v21/core/execute/index.js +4 -0
  6. package/src/{v16 → v21}/core/index.js +22 -20
  7. package/src/v21/createApi.js +64 -0
  8. package/src/v21/index.js +6 -0
  9. package/src/v21/masters/index.js +7 -0
  10. package/src/v21/tdlMessage.json +17 -0
  11. package/src/v21/vouchers/index.js +5 -0
  12. package/src/v21/vouchers/purchases/index.js +7 -0
  13. package/src/v21/vouchers/sales/index.js +7 -0
  14. package/src/v16/body copy.xml +0 -25
  15. package/src/v16/body.json +0 -78
  16. package/src/v16/company.js +0 -32
  17. package/src/v16/core/changeType/v1/changeTypeString.js +0 -111
  18. package/src/v16/core/changeType/v2/changeTypeString.js +0 -111
  19. package/src/v16/core/changeType/v3/alterLeaf.js +0 -45
  20. package/src/v16/core/changeType/v3/changeTypeString.js +0 -21
  21. package/src/v16/core/changeType/v3/forArray/v1/index.js +0 -17
  22. package/src/v16/core/changeType/v3/forObject/v1/index.js +0 -19
  23. package/src/v16/core/changeType/v3/guards.js +0 -26
  24. package/src/v16/core/changeType/v3/traverse.js +0 -47
  25. package/src/v16/core/cleanTallyResponse.js +0 -58
  26. package/src/v16/core/execute/executeBody.js +0 -23
  27. package/src/v16/core/execute/executeXmlAndClean.js +0 -15
  28. package/src/v16/core/execute/index.js +0 -3
  29. package/src/v16/core/request/envelope.js +0 -86
  30. package/src/v16/core/request/index.js +0 -6
  31. package/src/v16/core/request/jsonToXml.js +0 -19
  32. package/src/v16/daybook/body copy.xml +0 -16
  33. package/src/v16/daybook/body.xml +0 -30
  34. package/src/v16/fromJson.js +0 -86
  35. package/src/v16/fromXml.js +0 -30
  36. package/src/v16/index.d.ts +0 -13
  37. package/src/v16/index.js +0 -92
  38. package/src/v16/main.d.ts +0 -2
  39. package/src/v16/main.js +0 -4
  40. package/src/v16/masters/body.xml +0 -25
  41. package/src/v16/masters/index.js +0 -38
  42. package/src/v16/masters/masters.json +0 -86
  43. package/src/v16/purc/body.json +0 -36
  44. package/src/v16/purc/body.xml +0 -28
  45. package/src/v16/purchases/v1.xml +0 -30
  46. package/src/v16/purchases.js +0 -30
  47. package/src/v16/vouchers/body.xml +0 -25
  48. package/src/v16/vouchers/index.js +0 -40
  49. package/src/v16/vouchers/info.json +0 -85
  50. /package/src/{v16 → v21}/body.xml +0 -0
  51. /package/src/{v16 → v21}/core/buildXml.js +0 -0
  52. /package/src/{v16 → v21}/core/response/index.js +0 -0
  53. /package/src/{v16 → v21}/core/response/xmlToJson.js +0 -0
  54. /package/src/{v16 → v21}/core/transport/http.js +0 -0
  55. /package/src/{v16 → v21}/core/transport/index.js +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tally-xml-tdl",
3
- "version": "1.16.1",
3
+ "version": "1.21.1",
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,7 +15,7 @@
15
15
  }
16
16
  },
17
17
  "files": [
18
- "src/v16",
18
+ "src/v21",
19
19
  "src/index.js",
20
20
  "index.js",
21
21
  "index.d.ts",
package/src/index.js CHANGED
@@ -1,3 +1,43 @@
1
- export * from "./v16/main.js";
2
- export * as masters from "./v16/masters/index.js";
3
- export * as vouchers from "./v16/vouchers/index.js";
1
+ import { readdirSync, existsSync } from "node:fs";
2
+ import { dirname, resolve } from "node:path";
3
+ import { fileURLToPath, pathToFileURL } from "node:url";
4
+
5
+ const __dirname = dirname(fileURLToPath(import.meta.url));
6
+
7
+ // 1. Discover all version directories (v1, v2, ... vN) sorted highest first
8
+ const versionFolders = readdirSync(__dirname, { withFileTypes: true })
9
+ .filter(entry => entry.isDirectory() && /^v\d+$/.test(entry.name))
10
+ .map(entry => ({ name: entry.name, n: Number(entry.name.slice(1)) }))
11
+ .sort((a, b) => b.n - a.n);
12
+
13
+ const latestVersion = versionFolders[0]?.name || "v17";
14
+
15
+ let company;
16
+ let masters;
17
+ let vouchers;
18
+
19
+ const versionIndexPath = resolve(__dirname, latestVersion, "index.js");
20
+
21
+ if (existsSync(versionIndexPath)) {
22
+ const versionModule = await import(pathToFileURL(versionIndexPath).href);
23
+ company = versionModule.company ?? versionModule.default;
24
+ masters = versionModule.masters;
25
+ vouchers = versionModule.vouchers;
26
+ } else {
27
+ const mainUrl = pathToFileURL(resolve(__dirname, latestVersion, "main.js")).href;
28
+ const mastersUrl = pathToFileURL(resolve(__dirname, latestVersion, "masters", "index.js")).href;
29
+ const vouchersUrl = pathToFileURL(resolve(__dirname, latestVersion, "vouchers", "index.js")).href;
30
+
31
+ const [mainModule, mastersModule, vouchersModule] = await Promise.all([
32
+ import(mainUrl),
33
+ import(mastersUrl),
34
+ import(vouchersUrl)
35
+ ]);
36
+
37
+ company = mainModule.company ?? mainModule.default;
38
+ masters = mastersModule;
39
+ vouchers = vouchersModule;
40
+ }
41
+
42
+ export { company, masters, vouchers, latestVersion as version };
43
+ export default company;
@@ -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 };
@@ -9,7 +9,7 @@ const startFunc = async (
9
9
  const rawXml = await sendXml({ xml, url });
10
10
 
11
11
  const json = xmlToJson(rawXml);
12
-
12
+ // console.log("json :", json);
13
13
  return json;
14
14
  };
15
15
 
@@ -0,0 +1,4 @@
1
+ import executeXml from "./executeXml.js";
2
+
3
+ export { executeXml };
4
+ export default executeXml;
@@ -1,20 +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
- executeXmlAndClean
19
- } from "./execute/index.js";
20
-
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,64 @@
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 = (tdlMessageString) => {
38
+ const all = async (company, jsonId) => {
39
+ const staticVariables = `<SVCURRENTCOMPANY>${company}</SVCURRENTCOMPANY>`;
40
+
41
+ const xml = buildXml(body, {
42
+ staticVariables,
43
+ tdlMessage: tdlMessageString[jsonId]
44
+ });
45
+
46
+ return await executeXml(xml);
47
+ };
48
+
49
+ return { all };
50
+ };
51
+
52
+ const createCompanyApi = (tdlMessageString) => {
53
+ const all = async () => {
54
+ const xml = buildXml(body, {
55
+ tdlMessage: tdlMessageString
56
+ });
57
+
58
+ return await executeXml(xml);
59
+ };
60
+
61
+ return { all };
62
+ };
63
+
64
+ export { createVoucherApi, createMasterApi, createCompanyApi };
@@ -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,7 @@
1
+ import tdlMessage from "../tdlMessage.json" with { type: "json" };
2
+ import { createMasterApi } from "../createApi.js";
3
+
4
+ const { all } = createMasterApi(tdlMessage.masters);
5
+
6
+ export { all };
7
+ export default { all };
@@ -0,0 +1,17 @@
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>AllInventoryEntries</FETCH><FETCH>Date</FETCH>",
5
+ "sales": "<TYPE>Vouchers:VoucherType</TYPE><CHILDOF>$$$$VchTypeSales</CHILDOF><BELONGSTO>Yes</BELONGSTO><FETCH>AllInventoryEntries</FETCH><FETCH>Date</FETCH>"
6
+ },
7
+ "masters": {
8
+ "uom": "<TYPE>Unit</TYPE><FETCH>$$Alias:Name</FETCH>",
9
+ "stockItems": "<TYPE>StockItem</TYPE><FETCH>$$Alias:Name</FETCH>",
10
+ "stockItemsWithBaseUnits": "<TYPE>StockItem</TYPE><FETCH>$$Alias:Name</FETCH><FETCH>BaseUnits</FETCH>",
11
+ "ledgerNames": "<TYPE>Ledger</TYPE><FETCH>$$Alias:Name</FETCH>",
12
+ "ledgerNamesWithDetails": "<TYPE>Ledger</TYPE><FETCH>$$Alias:Name</FETCH><FETCH>GSTRegistrationType</FETCH><FETCH>GSTIN</FETCH>",
13
+ "ledgerNamesMoreDetails": "<TYPE>Ledger</TYPE><FETCH>$$Alias:Name</FETCH><FETCH>LEDGSTREGDETAILS.LIST</FETCH>",
14
+ "stockGroups": "<TYPE>StockGroup</TYPE><FETCH>$$Alias:Name</FETCH>",
15
+ "stockGroupsAndParent": "<TYPE>StockGroup</TYPE><FETCH>$$Alias:Name</FETCH><FETCH>Parent</FETCH>"
16
+ }
17
+ }
@@ -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 };
@@ -1,25 +0,0 @@
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>
package/src/v16/body.json DELETED
@@ -1,78 +0,0 @@
1
- {
2
- "company": {
3
- "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
4
- "tdlMessage": "<TYPE>Company</TYPE><FETCH>$$Alias:Name</FETCH>"
5
- },
6
- "uom": {
7
- "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
8
- "tdlMessage": "<TYPE>Unit</TYPE><FETCH>$$Alias:Name</FETCH>"
9
- },
10
- "stockItems": {
11
- "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
12
- "tdlMessage": "<TYPE>StockItem</TYPE><FETCH>$$Alias:Name</FETCH>"
13
- },
14
- "stockItemsWithBaseUnits": {
15
- "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
16
- "tdlMessage": "<TYPE>StockItem</TYPE><FETCH>$$Alias:Name</FETCH><FETCH>BaseUnits</FETCH>"
17
- },
18
- "ledgerNames": {
19
- "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
20
- "tdlMessage": "<TYPE>Ledger</TYPE><FETCH>$$Alias:Name</FETCH>"
21
- },
22
- "ledgerNamesWithDetails": {
23
- "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
24
- "tdlMessage": "<TYPE>Ledger</TYPE><FETCH>$$Alias:Name</FETCH><FETCH>GSTRegistrationType</FETCH><FETCH>GSTIN</FETCH>"
25
- },
26
- "ledgerNamesMoreDetails": {
27
- "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
28
- "tdlMessage": "<TYPE>Ledger</TYPE><FETCH>$$Alias:Name</FETCH><FETCH>LEDGSTREGDETAILS.LIST</FETCH>"
29
- },
30
- "stockGroups": {
31
- "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
32
- "tdlMessage": "<TYPE>StockGroup</TYPE><FETCH>$$Alias:Name</FETCH>"
33
- },
34
- "stockGroupsAndParent": {
35
- "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
36
- "tdlMessage": "<TYPE>StockGroup</TYPE><FETCH>$$Alias:Name</FETCH><FETCH>Parent</FETCH>"
37
- },
38
- "purchases1": {
39
- "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT><SVFROMDATE>1-Apr-2026</SVFROMDATE><SVTODATE>30-Apr-2026</SVTODATE>",
40
- "tdlMessage": "<TYPE>Voucher</TYPE><FILTER>$$IsPurchase:$VoucherTypeName</FILTER><FETCH>Date</FETCH><FETCH>VoucherNumber</FETCH><FETCH>VoucherTypeName</FETCH><FETCH>PartyLedgerName</FETCH><FETCH>Amount</FETCH>"
41
- },
42
- "purchases2": {
43
- "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT><SVFROMDATE>1-Apr-2026</SVFROMDATE><SVTODATE>30-Apr-2026</SVTODATE>",
44
- "tdlMessage": "<TYPE>Vouchers:VoucherType</TYPE><CHILDOF>$$VchTypePurchase</CHILDOF><BELONGSTO>Yes</BELONGSTO><FETCH>Date, VoucherNumber, VoucherTypeName, PartyLedgerName, AllInventoryEntries</FETCH>"
45
- },
46
- "purchases3": {
47
- "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT><SVFROMDATE>1-Apr-2026</SVFROMDATE><SVTODATE>1-Apr-2026</SVTODATE>",
48
- "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>"
49
- },
50
- "purchases4": {
51
- "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT><SVFROMDATE>1-Apr-2026</SVFROMDATE><SVTODATE>1-Apr-2026</SVTODATE>",
52
- "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>"
53
- },
54
- "purchases5": {
55
- "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT><SVFROMDATE>1-Apr-2026</SVFROMDATE><SVTODATE>1-Apr-2026</SVTODATE>",
56
- "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>"
57
- },
58
- "purchases6": {
59
- "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT><SVFROMDATE>1-Apr-2026</SVFROMDATE><SVTODATE>1-Apr-2026</SVTODATE>",
60
- "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>"
61
- },
62
- "purchases7": {
63
- "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT><SVFROMDATE>1-Apr-2026</SVFROMDATE><SVTODATE>1-Apr-2026</SVTODATE>",
64
- "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>"
65
- },
66
- "purchases8": {
67
- "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
68
- "tdlMessage": "<COLLECTION NAME=\"KeshavPurchases\"><TYPE>Voucher</TYPE><FETCH>Date</FETCH><FETCH>VoucherNumber</FETCH><FETCH>VoucherTypeName</FETCH></COLLECTION>"
69
- },
70
- "purchases9": {
71
- "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT>",
72
- "tdlMessage": "<COLLECTION NAME=\"KeshavPurchaseInventory\"><TYPE>Vouchers:VoucherType</TYPE><CHILDOF>$$VchTypePurchase</CHILDOF><BELONGSTO>Yes</BELONGSTO><FETCH>Date, VoucherNumber, VoucherTypeName, PartyLedgerName, AllInventoryEntries</FETCH></COLLECTION>"
73
- },
74
- "purchases": {
75
- "staticVariables": "<SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT><SVFROMDATE TYPE=\"Date\">4-Sep-2026</SVFROMDATE><SVTODATE TYPE=\"Date\">4-Sep-2026</SVTODATE>",
76
- "tdlMessage": "<TYPE>Vouchers:VoucherType</TYPE><CHILDOF>$$VchTypePurchase</CHILDOF><BELONGSTO>Yes</BELONGSTO><FETCH>AllInventoryEntries</FETCH><FETCH>Date</FETCH>"
77
- }
78
- }
@@ -1,32 +0,0 @@
1
- import fs from "fs";
2
- import path from "path";
3
- import { fileURLToPath } from "url";
4
-
5
- import { executeXmlAndClean } from "./core/index.js";
6
- import { buildXml } from "./core/buildXml.js";
7
- import bodyJson from "./body.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 jsonId = "company";
14
- // console.log("------------ : ", jsonId);
15
-
16
- const { tdlMessage } = bodyJson[jsonId];
17
- if (showLog) console.log("tdlMessage : ", tdlMessage);
18
-
19
- const xml = buildXml(body, {
20
- tdlMessage
21
- });
22
-
23
- if (showLog) console.log("xml : ", xml);
24
-
25
- const jsonToReturn = await executeXmlAndClean(xml);
26
-
27
- if (showLog) console.log("jsonToReturn : ", jsonToReturn);
28
-
29
- return jsonToReturn;
30
- };
31
-
32
- export default startFunc;
@@ -1,111 +0,0 @@
1
- /**
2
- * The Story of Tally Type Conversion:
3
- *
4
- * Act 1 - The XML Artifacts:
5
- * Tally XML represents typed primitive fields with attributes such as `@_TYPE="String"`,
6
- * `@_TYPE="Date"`, or `@_TYPE="Logical"`. The XML parser converts these tags into
7
- * objects where `#text` holds the actual content and `@_TYPE` holds the data type.
8
- * Tags with empty content (e.g. <SERIALMASTER TYPE="String"/>) result in objects
9
- * containing only `@_TYPE` without a `#text` key.
10
- *
11
- * Act 2 - The String Story:
12
- * When `@_TYPE === "String"`, we extract `#text` as a clean string.
13
- * If `#text` is missing (empty element), we normalize it to an empty string `""`
14
- * rather than keeping the unparsed metadata object.
15
- *
16
- * Act 3 - The Date Story:
17
- * When `@_TYPE === "Date"`, Tally returns dates in YYYYMMDD format (e.g., 20260904).
18
- * XML parsers often parse this as a numeric literal (20260904). We safely normalize
19
- * this into a clean string representation `'20260904'` for consistent date formatting.
20
- *
21
- * Act 4 - Logical & Other Primitives:
22
- * When `@_TYPE === "Logical"` (values like 'Yes' / 'No') or other typed fields,
23
- * we unwrap `#text` to its plain scalar value while leaving nested child arrays
24
- * (e.g., inventory lines, ledger entries) intact.
25
- */
26
-
27
- /**
28
- * Normalizes a single field value based on its Tally XML type.
29
- *
30
- * @param {object} params
31
- * @param {*} params.inValue - The field value to inspect and transform.
32
- * @returns {*} The cleaned scalar or original complex structure.
33
- */
34
- const handleValue = ({ inValue }) => {
35
- const localValue = inValue;
36
-
37
- // Preserve null, undefined, primitives, and nested arrays (e.g. ALLINVENTORYENTRIES.LIST)
38
- if (!localValue || typeof localValue !== "object" || Array.isArray(localValue)) {
39
- return localValue;
40
- }
41
-
42
- // Process Tally typed objects with @_TYPE
43
- if ("@_TYPE" in localValue) {
44
- const type = localValue["@_TYPE"];
45
- const hasText = "#text" in localValue;
46
- const rawText = localValue["#text"];
47
-
48
- // Act 2 fallback: Empty tags (<FIELD TYPE="..."/>) have no #text
49
- if (!hasText) {
50
- return "";
51
- }
52
-
53
- switch (type) {
54
- // Act 2: String types
55
- case "String":
56
- return String(rawText);
57
-
58
- // Act 3: Date types (normalize numbers like 20260904 to string '20260904')
59
- case "Date":
60
- return String(rawText);
61
-
62
- // Act 4: Logical types ('Yes' / 'No')
63
- case "Logical":
64
- return String(rawText);
65
-
66
- // Other types (Number, Amount, Rate, etc.)
67
- default:
68
- return rawText;
69
- }
70
- }
71
-
72
- return localValue;
73
- };
74
-
75
- /**
76
- * Transforms an array of rows by converting Tally typed objects into clean values.
77
- *
78
- * @param {object|Array} input - Either { inArray: Array } or positional Array.
79
- * @returns {Array} Array of cleaned rows.
80
- */
81
- const changeTypeString = (input) => {
82
- // Supports both { inArray } parameter convention and direct array argument
83
- let localArray = Array.isArray(input) ? input : input?.inArray;
84
-
85
- if (!localArray) {
86
- return [];
87
- }
88
-
89
- if (!Array.isArray(localArray)) {
90
- localArray = [localArray];
91
- }
92
-
93
- const newArray = localArray.map(row => {
94
- if (!row || typeof row !== "object") {
95
- return row;
96
- }
97
-
98
- const result = {};
99
-
100
- for (const [key, value] of Object.entries(row)) {
101
- result[key] = handleValue({ inValue: value });
102
- }
103
-
104
- return result;
105
- });
106
-
107
- return newArray;
108
- };
109
-
110
- export default changeTypeString;
111
- export { changeTypeString };
@@ -1,111 +0,0 @@
1
- /**
2
- * The Story of Tally Type Conversion:
3
- *
4
- * Act 1 - The XML Artifacts:
5
- * Tally XML represents typed primitive fields with attributes such as `@_TYPE="String"`,
6
- * `@_TYPE="Date"`, or `@_TYPE="Logical"`. The XML parser converts these tags into
7
- * objects where `#text` holds the actual content and `@_TYPE` holds the data type.
8
- * Tags with empty content (e.g. <SERIALMASTER TYPE="String"/>) result in objects
9
- * containing only `@_TYPE` without a `#text` key.
10
- *
11
- * Act 2 - The String Story:
12
- * When `@_TYPE === "String"`, we extract `#text` as a clean string.
13
- * If `#text` is missing (empty element), we normalize it to an empty string `""`
14
- * rather than keeping the unparsed metadata object.
15
- *
16
- * Act 3 - The Date Story:
17
- * When `@_TYPE === "Date"`, Tally returns dates in YYYYMMDD format (e.g., 20260904).
18
- * XML parsers often parse this as a numeric literal (20260904). We safely normalize
19
- * this into a clean string representation `'20260904'` for consistent date formatting.
20
- *
21
- * Act 4 - Logical & Other Primitives:
22
- * When `@_TYPE === "Logical"` (values like 'Yes' / 'No') or other typed fields,
23
- * we unwrap `#text` to its plain scalar value while leaving nested child arrays
24
- * (e.g., inventory lines, ledger entries) intact.
25
- */
26
-
27
- /**
28
- * Normalizes a single field value based on its Tally XML type.
29
- *
30
- * @param {object} params
31
- * @param {*} params.inValue - The field value to inspect and transform.
32
- * @returns {*} The cleaned scalar or original complex structure.
33
- */
34
- const handleValue = ({ inValue }) => {
35
- const localValue = inValue;
36
-
37
- // Preserve null, undefined, primitives, and nested arrays (e.g. ALLINVENTORYENTRIES.LIST)
38
- if (!localValue || typeof localValue !== "object" || Array.isArray(localValue)) {
39
- return localValue;
40
- }
41
-
42
- // Process Tally typed objects with @_TYPE
43
- if ("@_TYPE" in localValue) {
44
- const type = localValue["@_TYPE"];
45
- const hasText = "#text" in localValue;
46
- const rawText = localValue["#text"];
47
-
48
- // Act 2 fallback: Empty tags (<FIELD TYPE="..."/>) have no #text
49
- if (!hasText) {
50
- return "";
51
- }
52
-
53
- switch (type) {
54
- // Act 2: String types
55
- case "String":
56
- return String(rawText);
57
-
58
- // Act 3: Date types (normalize numbers like 20260904 to string '20260904')
59
- case "Date":
60
- return String(rawText);
61
-
62
- // Act 4: Logical types ('Yes' / 'No')
63
- case "Logical":
64
- return String(rawText);
65
-
66
- // Other types (Number, Amount, Rate, etc.)
67
- default:
68
- return rawText;
69
- }
70
- }
71
-
72
- return localValue;
73
- };
74
-
75
- /**
76
- * Transforms an array of rows by converting Tally typed objects into clean values.
77
- *
78
- * @param {object|Array} input - Either { inArray: Array } or positional Array.
79
- * @returns {Array} Array of cleaned rows.
80
- */
81
- const changeTypeString = (input) => {
82
- // Supports both { inArray } parameter convention and direct array argument
83
- let localArray = Array.isArray(input) ? input : input?.inArray;
84
-
85
- if (!localArray) {
86
- return [];
87
- }
88
-
89
- if (!Array.isArray(localArray)) {
90
- localArray = [localArray];
91
- }
92
-
93
- const newArray = localArray.map(row => {
94
- if (!row || typeof row !== "object") {
95
- return row;
96
- }
97
-
98
- const result = {};
99
-
100
- for (const [key, value] of Object.entries(row)) {
101
- result[key] = handleValue({ inValue: value });
102
- }
103
-
104
- return result;
105
- });
106
-
107
- return newArray;
108
- };
109
-
110
- export default changeTypeString;
111
- export { changeTypeString };
@@ -1,45 +0,0 @@
1
- /**
2
- * Unwraps Tally XML typed objects and normalizes them into clean scalars.
3
- *
4
- * Removes @_TYPE (String, Date, Number, Logical, Rate, etc.) and extracts #text.
5
- * Empty tags (<TAG TYPE="..."/>) without #text normalize to empty string "".
6
- *
7
- * @param {object} params
8
- * @param {object} params.inValue - Typed object containing @_TYPE.
9
- * @returns {*} Clean scalar value.
10
- */
11
- const alterLeaf = ({ inValue }) => {
12
- const localValue = inValue;
13
-
14
- if (!localValue || typeof localValue !== "object") {
15
- return localValue;
16
- }
17
-
18
- if ("@_TYPE" in localValue) {
19
- const type = String(localValue["@_TYPE"] || "").toLowerCase();
20
- const hasText = "#text" in localValue;
21
- const rawText = localValue["#text"];
22
-
23
- if (!hasText || rawText === undefined || rawText === null) {
24
- return "";
25
- }
26
-
27
- switch (type) {
28
- case "string":
29
- case "date":
30
- case "logical":
31
- case "rate":
32
- return String(rawText);
33
- case "number":
34
- case "amount":
35
- case "quantity":
36
- return rawText;
37
- default:
38
- return rawText;
39
- }
40
- }
41
-
42
- return localValue;
43
- };
44
-
45
- export default alterLeaf;