@newpeak/barista-cli 0.1.3 → 0.1.5

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 (205) hide show
  1. package/dist/commands/liberica/auth/index.d.ts.map +1 -1
  2. package/dist/commands/liberica/auth/index.js +5 -0
  3. package/dist/commands/liberica/auth/index.js.map +1 -1
  4. package/dist/commands/liberica/clients/create.d.ts +3 -0
  5. package/dist/commands/liberica/clients/create.d.ts.map +1 -0
  6. package/dist/commands/liberica/clients/create.js +125 -0
  7. package/dist/commands/liberica/clients/create.js.map +1 -0
  8. package/dist/commands/liberica/clients/delete.d.ts +3 -0
  9. package/dist/commands/liberica/clients/delete.d.ts.map +1 -0
  10. package/dist/commands/liberica/clients/delete.js +125 -0
  11. package/dist/commands/liberica/clients/delete.js.map +1 -0
  12. package/dist/commands/liberica/clients/get.d.ts +3 -0
  13. package/dist/commands/liberica/clients/get.d.ts.map +1 -0
  14. package/dist/commands/liberica/clients/get.js +77 -0
  15. package/dist/commands/liberica/clients/get.js.map +1 -0
  16. package/dist/commands/liberica/clients/index.d.ts +3 -0
  17. package/dist/commands/liberica/clients/index.d.ts.map +1 -0
  18. package/dist/commands/liberica/clients/index.js +17 -0
  19. package/dist/commands/liberica/clients/index.js.map +1 -0
  20. package/dist/commands/liberica/clients/list.d.ts +3 -0
  21. package/dist/commands/liberica/clients/list.d.ts.map +1 -0
  22. package/dist/commands/liberica/clients/list.js +92 -0
  23. package/dist/commands/liberica/clients/list.js.map +1 -0
  24. package/dist/commands/liberica/clients/update.d.ts +3 -0
  25. package/dist/commands/liberica/clients/update.d.ts.map +1 -0
  26. package/dist/commands/liberica/clients/update.js +106 -0
  27. package/dist/commands/liberica/clients/update.js.map +1 -0
  28. package/dist/commands/liberica/index.d.ts.map +1 -1
  29. package/dist/commands/liberica/index.js +11 -0
  30. package/dist/commands/liberica/index.js.map +1 -1
  31. package/dist/commands/liberica/materials/create.d.ts +3 -0
  32. package/dist/commands/liberica/materials/create.d.ts.map +1 -0
  33. package/dist/commands/liberica/materials/create.js +154 -0
  34. package/dist/commands/liberica/materials/create.js.map +1 -0
  35. package/dist/commands/liberica/materials/delete.d.ts +3 -0
  36. package/dist/commands/liberica/materials/delete.d.ts.map +1 -0
  37. package/dist/commands/liberica/materials/delete.js +104 -0
  38. package/dist/commands/liberica/materials/delete.js.map +1 -0
  39. package/dist/commands/liberica/materials/disable.d.ts +3 -0
  40. package/dist/commands/liberica/materials/disable.d.ts.map +1 -0
  41. package/dist/commands/liberica/materials/disable.js +146 -0
  42. package/dist/commands/liberica/materials/disable.js.map +1 -0
  43. package/dist/commands/liberica/materials/enable.d.ts +3 -0
  44. package/dist/commands/liberica/materials/enable.d.ts.map +1 -0
  45. package/dist/commands/liberica/materials/enable.js +126 -0
  46. package/dist/commands/liberica/materials/enable.js.map +1 -0
  47. package/dist/commands/liberica/materials/get.d.ts +3 -0
  48. package/dist/commands/liberica/materials/get.d.ts.map +1 -0
  49. package/dist/commands/liberica/materials/get.js +71 -0
  50. package/dist/commands/liberica/materials/get.js.map +1 -0
  51. package/dist/commands/liberica/materials/index.d.ts +3 -0
  52. package/dist/commands/liberica/materials/index.d.ts.map +1 -0
  53. package/dist/commands/liberica/materials/index.js +21 -0
  54. package/dist/commands/liberica/materials/index.js.map +1 -0
  55. package/dist/commands/liberica/materials/list.d.ts +3 -0
  56. package/dist/commands/liberica/materials/list.d.ts.map +1 -0
  57. package/dist/commands/liberica/materials/list.js +107 -0
  58. package/dist/commands/liberica/materials/list.js.map +1 -0
  59. package/dist/commands/liberica/materials/update.d.ts +3 -0
  60. package/dist/commands/liberica/materials/update.d.ts.map +1 -0
  61. package/dist/commands/liberica/materials/update.js +118 -0
  62. package/dist/commands/liberica/materials/update.js.map +1 -0
  63. package/dist/commands/liberica/suppliers/create.d.ts +3 -0
  64. package/dist/commands/liberica/suppliers/create.d.ts.map +1 -0
  65. package/dist/commands/liberica/suppliers/create.js +140 -0
  66. package/dist/commands/liberica/suppliers/create.js.map +1 -0
  67. package/dist/commands/liberica/suppliers/delete.d.ts +3 -0
  68. package/dist/commands/liberica/suppliers/delete.d.ts.map +1 -0
  69. package/dist/commands/liberica/suppliers/delete.js +102 -0
  70. package/dist/commands/liberica/suppliers/delete.js.map +1 -0
  71. package/dist/commands/liberica/suppliers/disable.d.ts +3 -0
  72. package/dist/commands/liberica/suppliers/disable.d.ts.map +1 -0
  73. package/dist/commands/liberica/suppliers/disable.js +144 -0
  74. package/dist/commands/liberica/suppliers/disable.js.map +1 -0
  75. package/dist/commands/liberica/suppliers/enable.d.ts +3 -0
  76. package/dist/commands/liberica/suppliers/enable.d.ts.map +1 -0
  77. package/dist/commands/liberica/suppliers/enable.js +124 -0
  78. package/dist/commands/liberica/suppliers/enable.js.map +1 -0
  79. package/dist/commands/liberica/suppliers/get.d.ts +3 -0
  80. package/dist/commands/liberica/suppliers/get.d.ts.map +1 -0
  81. package/dist/commands/liberica/suppliers/get.js +75 -0
  82. package/dist/commands/liberica/suppliers/get.js.map +1 -0
  83. package/dist/commands/liberica/suppliers/index.d.ts +3 -0
  84. package/dist/commands/liberica/suppliers/index.d.ts.map +1 -0
  85. package/dist/commands/liberica/suppliers/index.js +21 -0
  86. package/dist/commands/liberica/suppliers/index.js.map +1 -0
  87. package/dist/commands/liberica/suppliers/list.d.ts +3 -0
  88. package/dist/commands/liberica/suppliers/list.d.ts.map +1 -0
  89. package/dist/commands/liberica/suppliers/list.js +100 -0
  90. package/dist/commands/liberica/suppliers/list.js.map +1 -0
  91. package/dist/commands/liberica/suppliers/update.d.ts +3 -0
  92. package/dist/commands/liberica/suppliers/update.d.ts.map +1 -0
  93. package/dist/commands/liberica/suppliers/update.js +122 -0
  94. package/dist/commands/liberica/suppliers/update.js.map +1 -0
  95. package/dist/commands/liberica/uoms/create.d.ts +3 -0
  96. package/dist/commands/liberica/uoms/create.d.ts.map +1 -0
  97. package/dist/commands/liberica/uoms/create.js +120 -0
  98. package/dist/commands/liberica/uoms/create.js.map +1 -0
  99. package/dist/commands/liberica/uoms/delete.d.ts +3 -0
  100. package/dist/commands/liberica/uoms/delete.d.ts.map +1 -0
  101. package/dist/commands/liberica/uoms/delete.js +104 -0
  102. package/dist/commands/liberica/uoms/delete.js.map +1 -0
  103. package/dist/commands/liberica/uoms/disable.d.ts +3 -0
  104. package/dist/commands/liberica/uoms/disable.d.ts.map +1 -0
  105. package/dist/commands/liberica/uoms/disable.js +146 -0
  106. package/dist/commands/liberica/uoms/disable.js.map +1 -0
  107. package/dist/commands/liberica/uoms/enable.d.ts +3 -0
  108. package/dist/commands/liberica/uoms/enable.d.ts.map +1 -0
  109. package/dist/commands/liberica/uoms/enable.js +126 -0
  110. package/dist/commands/liberica/uoms/enable.js.map +1 -0
  111. package/dist/commands/liberica/uoms/get.d.ts +3 -0
  112. package/dist/commands/liberica/uoms/get.d.ts.map +1 -0
  113. package/dist/commands/liberica/uoms/get.js +71 -0
  114. package/dist/commands/liberica/uoms/get.js.map +1 -0
  115. package/dist/commands/liberica/uoms/index.d.ts +3 -0
  116. package/dist/commands/liberica/uoms/index.d.ts.map +1 -0
  117. package/dist/commands/liberica/uoms/index.js +21 -0
  118. package/dist/commands/liberica/uoms/index.js.map +1 -0
  119. package/dist/commands/liberica/uoms/list.d.ts +3 -0
  120. package/dist/commands/liberica/uoms/list.d.ts.map +1 -0
  121. package/dist/commands/liberica/uoms/list.js +98 -0
  122. package/dist/commands/liberica/uoms/list.js.map +1 -0
  123. package/dist/commands/liberica/uoms/update.d.ts +3 -0
  124. package/dist/commands/liberica/uoms/update.d.ts.map +1 -0
  125. package/dist/commands/liberica/uoms/update.js +115 -0
  126. package/dist/commands/liberica/uoms/update.js.map +1 -0
  127. package/dist/core/api/client.d.ts +30 -0
  128. package/dist/core/api/client.d.ts.map +1 -1
  129. package/dist/core/api/client.js +590 -0
  130. package/dist/core/api/client.js.map +1 -1
  131. package/dist/index.js +1 -1
  132. package/dist/types/client.d.ts +100 -0
  133. package/dist/types/client.d.ts.map +1 -0
  134. package/dist/types/client.js +2 -0
  135. package/dist/types/client.js.map +1 -0
  136. package/dist/types/index.d.ts +6 -0
  137. package/dist/types/index.d.ts.map +1 -1
  138. package/dist/types/material.d.ts +49 -0
  139. package/dist/types/material.d.ts.map +1 -0
  140. package/dist/types/material.js +2 -0
  141. package/dist/types/material.js.map +1 -0
  142. package/dist/types/supplier.d.ts +53 -0
  143. package/dist/types/supplier.d.ts.map +1 -0
  144. package/dist/types/supplier.js +2 -0
  145. package/dist/types/supplier.js.map +1 -0
  146. package/dist/types/uom.d.ts +47 -0
  147. package/dist/types/uom.d.ts.map +1 -0
  148. package/dist/types/uom.js +2 -0
  149. package/dist/types/uom.js.map +1 -0
  150. package/docs/commands/REFERENCE.md +21 -15
  151. package/docs/commands/liberica/materials-create.md +293 -0
  152. package/docs/commands/liberica/materials-delete.md +240 -0
  153. package/docs/commands/liberica/materials-disable.md +150 -0
  154. package/docs/commands/liberica/materials-enable.md +146 -0
  155. package/docs/commands/liberica/materials-get.md +188 -0
  156. package/docs/commands/liberica/materials-list.md +198 -0
  157. package/docs/commands/liberica/materials-update.md +250 -0
  158. package/docs/commands/liberica/uoms-create.md +136 -0
  159. package/docs/commands/liberica/uoms-delete.md +119 -0
  160. package/docs/commands/liberica/uoms-disable.md +117 -0
  161. package/docs/commands/liberica/uoms-enable.md +115 -0
  162. package/docs/commands/liberica/uoms-get.md +119 -0
  163. package/docs/commands/liberica/uoms-list.md +155 -0
  164. package/docs/commands/liberica/uoms-update.md +148 -0
  165. package/package.json +2 -4
  166. package/src/commands/liberica/auth/index.ts +6 -0
  167. package/src/commands/liberica/clients/create.ts +122 -0
  168. package/src/commands/liberica/clients/delete.ts +125 -0
  169. package/src/commands/liberica/clients/get.ts +88 -0
  170. package/src/commands/liberica/clients/index.ts +19 -0
  171. package/src/commands/liberica/clients/list.ts +123 -0
  172. package/src/commands/liberica/clients/update.ts +103 -0
  173. package/src/commands/liberica/index.ts +11 -0
  174. package/src/commands/liberica/materials/create.ts +168 -0
  175. package/src/commands/liberica/materials/delete.ts +105 -0
  176. package/src/commands/liberica/materials/disable.ts +148 -0
  177. package/src/commands/liberica/materials/enable.ts +129 -0
  178. package/src/commands/liberica/materials/get.ts +83 -0
  179. package/src/commands/liberica/materials/index.ts +23 -0
  180. package/src/commands/liberica/materials/list.ts +142 -0
  181. package/src/commands/liberica/materials/update.ts +125 -0
  182. package/src/commands/liberica/suppliers/create.ts +149 -0
  183. package/src/commands/liberica/suppliers/delete.ts +102 -0
  184. package/src/commands/liberica/suppliers/disable.ts +145 -0
  185. package/src/commands/liberica/suppliers/enable.ts +126 -0
  186. package/src/commands/liberica/suppliers/get.ts +86 -0
  187. package/src/commands/liberica/suppliers/index.ts +23 -0
  188. package/src/commands/liberica/suppliers/list.ts +134 -0
  189. package/src/commands/liberica/suppliers/update.ts +128 -0
  190. package/src/commands/liberica/uoms/create.ts +134 -0
  191. package/src/commands/liberica/uoms/delete.ts +105 -0
  192. package/src/commands/liberica/uoms/disable.ts +148 -0
  193. package/src/commands/liberica/uoms/enable.ts +129 -0
  194. package/src/commands/liberica/uoms/get.ts +83 -0
  195. package/src/commands/liberica/uoms/index.ts +23 -0
  196. package/src/commands/liberica/uoms/list.ts +129 -0
  197. package/src/commands/liberica/uoms/update.ts +124 -0
  198. package/src/core/api/client.ts +758 -21
  199. package/src/index.ts +1 -1
  200. package/src/types/client.ts +115 -0
  201. package/src/types/index.ts +6 -0
  202. package/src/types/material.ts +61 -0
  203. package/src/types/supplier.ts +66 -0
  204. package/src/types/uom.ts +60 -0
  205. package/bin/barista.js +0 -3
@@ -0,0 +1,125 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { configManager } from '../../../core/config/manager.js';
4
+ import { apiClient } from '../../../core/api/client.js';
5
+ import { Environment } from '../../../types/index.js';
6
+ import { MasterClientResponse } from '../../../types/client.js';
7
+
8
+ export function createClientDeleteCommand(): Command {
9
+ const deleteCommand = new Command('delete');
10
+ deleteCommand
11
+ .description('Delete a client')
12
+ .argument('<id>', 'Client ID')
13
+ .option('--force', 'Skip confirmation prompt')
14
+ .option('--dry-run', 'Preview the operation without executing')
15
+ .option('--json', 'Output as JSON')
16
+ .action(async (id: string, options: Record<string, unknown>) => {
17
+ const context = configManager.getCurrentContext();
18
+ const environment = context.environment as Environment;
19
+ const tenant = context.tenant;
20
+ const jsonOutput = options.json === true;
21
+
22
+ const clientId = id;
23
+
24
+ if (!clientId) {
25
+ if (jsonOutput) {
26
+ console.log(JSON.stringify({ success: false, error: { code: 'VALIDATION_ERROR', message: 'Client ID is required' } }));
27
+ } else {
28
+ console.error(chalk.red('\nāœ— Client ID is required\n'));
29
+ }
30
+ process.exit(1);
31
+ }
32
+
33
+ if (!jsonOutput) {
34
+ console.log(chalk.bold(`\nšŸ—‘ļø Delete Client (${environment})\n`));
35
+ console.log(chalk.gray(` Client ID: ${clientId}`));
36
+ }
37
+
38
+ if (options.dryRun) {
39
+ if (jsonOutput) {
40
+ console.log(JSON.stringify({ success: true, dryRun: true, clientId }));
41
+ } else {
42
+ console.log(chalk.cyan('\nšŸ” Dry-Run Mode: No actual API call will be made\n'));
43
+ console.log(chalk.gray(' This operation will delete the client.'));
44
+ console.log();
45
+ }
46
+ return;
47
+ }
48
+
49
+ let client: MasterClientResponse | undefined;
50
+ try {
51
+ const clientResponse = await apiClient.getClient(environment, tenant, clientId);
52
+ if (!clientResponse.success || !clientResponse.data) {
53
+ const errMsg = `Client not found: ${clientId}`;
54
+ if (jsonOutput) {
55
+ console.log(JSON.stringify({ success: false, error: { code: 'NOT_FOUND', message: errMsg } }));
56
+ } else {
57
+ console.error(chalk.red(`\nāœ— ${errMsg}\n`));
58
+ }
59
+ process.exit(1);
60
+ }
61
+ client = clientResponse.data as MasterClientResponse;
62
+ } catch (error) {
63
+ const errMsg = error instanceof Error ? error.message : 'Unknown error';
64
+ if (jsonOutput) {
65
+ console.log(JSON.stringify({ success: false, error: { code: 'FETCH_ERROR', message: `Failed to fetch client: ${errMsg}` } }));
66
+ } else {
67
+ console.error(chalk.red(`\nāœ— Failed to fetch client: ${errMsg}\n`));
68
+ }
69
+ process.exit(1);
70
+ }
71
+
72
+ if (!options.force) {
73
+ if (!jsonOutput) {
74
+ console.log(chalk.gray(` Client Name: ${client.clientName}`));
75
+ console.log(chalk.gray(` Client Code: ${client.clientCode}`));
76
+ console.log(chalk.yellow(`\nāš ļø This action cannot be undone.`));
77
+ console.log(chalk.gray(' Use --force to skip this confirmation.\n'));
78
+ } else {
79
+ console.log(JSON.stringify({
80
+ success: false,
81
+ error: {
82
+ code: 'CONFIRMATION_REQUIRED',
83
+ message: `Delete client "${client.clientName}"? Use --force to confirm.`
84
+ }
85
+ }));
86
+ }
87
+ process.exit(1);
88
+ }
89
+
90
+ try {
91
+ const response = await apiClient.deleteClient(environment, tenant, clientId);
92
+
93
+ if (response.success) {
94
+ if (jsonOutput) {
95
+ console.log(JSON.stringify({ success: true, clientId, name: client.clientName }));
96
+ } else {
97
+ console.log(chalk.green(`\nāœ“ Client "${client.clientName}" (ID: ${clientId}) deleted\n`));
98
+ }
99
+ } else {
100
+ const errorMsg = response.error?.message || 'Unknown error';
101
+ const errorCode = response.error?.code || 'DELETE_ERROR';
102
+ if (jsonOutput) {
103
+ console.log(JSON.stringify({ success: false, error: { code: errorCode, message: errorMsg } }));
104
+ } else {
105
+ console.error(chalk.red(`\nāœ— Failed to delete client: ${errorMsg}`));
106
+ if (response.error?.code) {
107
+ console.error(chalk.gray(` Error code: ${response.error.code}`));
108
+ }
109
+ console.error();
110
+ }
111
+ process.exit(1);
112
+ }
113
+ } catch (error) {
114
+ const errMsg = error instanceof Error ? error.message : 'Unknown error';
115
+ if (jsonOutput) {
116
+ console.log(JSON.stringify({ success: false, error: { code: 'ERROR', message: errMsg } }));
117
+ } else {
118
+ console.error(chalk.red(`\nāœ— Error: ${errMsg}\n`));
119
+ }
120
+ process.exit(1);
121
+ }
122
+ });
123
+
124
+ return deleteCommand;
125
+ }
@@ -0,0 +1,88 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { configManager } from '../../../core/config/manager.js';
4
+ import { apiClient } from '../../../core/api/client.js';
5
+ import { Environment } from '../../../types/index.js';
6
+ import { MasterClientResponse } from '../../../types/client.js';
7
+
8
+ export function createClientGetCommand(): Command {
9
+ const getCommand = new Command('get');
10
+ getCommand.description('Get client details by ID');
11
+ getCommand.arguments('<id>');
12
+ getCommand.option('--json', 'Output as JSON');
13
+
14
+ getCommand.action(async (id: string, options: Record<string, unknown>) => {
15
+ const context = configManager.getCurrentContext();
16
+ const environment = (options.env as Environment) || context.environment;
17
+ const tenant = (options.tenant as string) || context.tenant;
18
+
19
+ if (!id) {
20
+ console.error(chalk.red('\nāœ— Client ID is required\n'));
21
+ process.exit(1);
22
+ }
23
+
24
+ const clientId = id;
25
+ if (!clientId || clientId.trim() === '') {
26
+ console.error(chalk.red('\nāœ— Invalid client ID.\n'));
27
+ process.exit(1);
28
+ }
29
+
30
+ try {
31
+ const response = await apiClient.getClient(environment, tenant, clientId);
32
+
33
+ if (!response.success) {
34
+ const errorCode = response.error?.code || 'UNKNOWN_ERROR';
35
+ const errorMessage = response.error?.message || 'Unknown error';
36
+
37
+ if (errorCode === '01001150001' || errorMessage.includes('äøå­˜åœØ')) {
38
+ console.error(chalk.red(`\nāœ— Client not found: ${clientId}\n`));
39
+ } else {
40
+ console.error(chalk.red(`\nāœ— Error: ${errorMessage} (${errorCode})\n`));
41
+ }
42
+ process.exit(1);
43
+ }
44
+
45
+ const client = response.data as MasterClientResponse | null;
46
+
47
+ if (!client) {
48
+ console.error(chalk.red('\nāœ— Client not found\n'));
49
+ process.exit(1);
50
+ }
51
+
52
+ if (options.json) {
53
+ console.log(JSON.stringify({
54
+ success: true,
55
+ data: client,
56
+ }, null, 2));
57
+ return;
58
+ }
59
+
60
+ console.log(chalk.bold('\nšŸ¢ Client Details\n'));
61
+ console.log(` ${chalk.gray('Client ID:')} ${client.clientId}`);
62
+ console.log(` ${chalk.gray('Client Code:')} ${client.clientCode}`);
63
+ console.log(` ${chalk.gray('Client Name:')} ${client.clientName}`);
64
+ if (client.follower) {
65
+ console.log(` ${chalk.gray('Follower:')} ${client.follower}`);
66
+ }
67
+ if (client.officeAddress) {
68
+ console.log(` ${chalk.gray('Office:')} ${client.officeAddress}`);
69
+ }
70
+ if (client.officeTelephone) {
71
+ console.log(` ${chalk.gray('Telephone:')} ${client.officeTelephone}`);
72
+ }
73
+ if (client.statusFlag !== undefined) {
74
+ const statusText = client.statusFlag === 1 ? chalk.green('Enable') : chalk.red('Disable');
75
+ console.log(` ${chalk.gray('Status:')} ${statusText}`);
76
+ }
77
+ if (client.remark) {
78
+ console.log(` ${chalk.gray('Remark:')} ${client.remark}`);
79
+ }
80
+ console.log();
81
+ } catch (error) {
82
+ console.error(chalk.red(`\nāœ— Unexpected error: ${error instanceof Error ? error.message : 'Unknown error'}\n`));
83
+ process.exit(1);
84
+ }
85
+ });
86
+
87
+ return getCommand;
88
+ }
@@ -0,0 +1,19 @@
1
+ import { Command } from 'commander';
2
+ import { createClientListCommand } from './list.js';
3
+ import { createClientGetCommand } from './get.js';
4
+ import { createClientCreateCommand } from './create.js';
5
+ import { createClientUpdateCommand } from './update.js';
6
+ import { createClientDeleteCommand } from './delete.js';
7
+
8
+ export function createClientsCommand(): Command {
9
+ const clientsCommand = new Command('clients');
10
+ clientsCommand.description('Manage clients');
11
+
12
+ clientsCommand.addCommand(createClientListCommand());
13
+ clientsCommand.addCommand(createClientGetCommand());
14
+ clientsCommand.addCommand(createClientCreateCommand());
15
+ clientsCommand.addCommand(createClientUpdateCommand());
16
+ clientsCommand.addCommand(createClientDeleteCommand());
17
+
18
+ return clientsCommand;
19
+ }
@@ -0,0 +1,123 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import Table from 'cli-table3';
4
+ import { configManager } from '../../../core/config/manager.js';
5
+ import { apiClient } from '../../../core/api/client.js';
6
+ import { ClientListResponse, StatusFlag } from '../../../types/client.js';
7
+ import { Environment } from '../../../types/index.js';
8
+
9
+ export function createClientListCommand(): Command {
10
+ const listCommand = new Command('list');
11
+ listCommand.description('List clients with pagination');
12
+
13
+ listCommand
14
+ .option('-p, --page <number>', 'Page number', '1')
15
+ .option('-s, --size <number>', 'Page size', '20')
16
+ .option('--status <number>', 'Status filter (1=enable, 2=disable)')
17
+ .option('--json', 'Output as JSON')
18
+ .action(async (options) => {
19
+ const context = configManager.getCurrentContext();
20
+ const environment = (options.env as Environment) || context.environment;
21
+ const tenant = options.tenant || context.tenant;
22
+
23
+ const page = parseInt(options.page as string, 10) - 1; // API uses 0-based pagination
24
+ const size = parseInt(options.size as string, 10);
25
+
26
+ const params: {
27
+ pageNo: number;
28
+ pageSize: number;
29
+ status?: StatusFlag;
30
+ } = { pageNo: page, pageSize: size };
31
+
32
+ if (options.status !== undefined) {
33
+ const statusNum = parseInt(options.status as string, 10);
34
+ if (statusNum === 1 || statusNum === 2) {
35
+ params.status = statusNum as StatusFlag;
36
+ }
37
+ }
38
+
39
+ const response = await apiClient.listClients(environment, tenant, params);
40
+
41
+ if (!response.success) {
42
+ console.error(chalk.red(`\nāœ— Failed to list clients: ${response.error?.message || 'Unknown error'}`));
43
+ if (response.error?.code) {
44
+ console.error(chalk.gray(` Error code: ${response.error.code}`));
45
+ }
46
+ console.error();
47
+ process.exit(1);
48
+ }
49
+
50
+ const data = response.data as ClientListResponse | null;
51
+
52
+ if (!data) {
53
+ if (options.json) {
54
+ console.log(JSON.stringify({ success: true, data: { items: [], pagination: { pageNo: 0, pageSize: 20, totalRows: 0 } } }, null, 2));
55
+ } else {
56
+ console.log(chalk.bold('\nšŸ“‹ Client List\n'));
57
+ console.log(chalk.gray(' No clients found\n'));
58
+ }
59
+ return;
60
+ }
61
+
62
+ if (options.json) {
63
+ console.log(
64
+ JSON.stringify(
65
+ {
66
+ success: true,
67
+ data: {
68
+ items: data.rows || [],
69
+ pagination: {
70
+ pageNo: data.pageNo,
71
+ pageSize: data.pageSize,
72
+ totalRows: data.totalRows,
73
+ },
74
+ },
75
+ },
76
+ null,
77
+ 2
78
+ )
79
+ );
80
+ return;
81
+ }
82
+
83
+ const records = data.rows || [];
84
+
85
+ if (records.length === 0) {
86
+ console.log(chalk.bold('\nšŸ“‹ Client List\n'));
87
+ console.log(chalk.gray(' No clients found\n'));
88
+ return;
89
+ }
90
+
91
+ console.log(chalk.bold('\nšŸ“‹ Client List\n'));
92
+
93
+ const table = new Table({
94
+ head: [chalk.bold('CLIENT CODE'), chalk.bold('CLIENT NAME'), chalk.bold('FOLLOWER'), chalk.bold('STATUS')],
95
+ colWidths: [15, 25, 20, 10],
96
+ style: {
97
+ head: [],
98
+ border: [],
99
+ },
100
+ });
101
+
102
+ for (const client of records) {
103
+ const statusText = client.statusFlag === 1 ? chalk.green('Enable') : chalk.red('Disable');
104
+ table.push([
105
+ client.clientCode,
106
+ client.clientName || '-',
107
+ client.follower || '-',
108
+ statusText,
109
+ ]);
110
+ }
111
+
112
+ console.log(table.toString());
113
+ console.log();
114
+ console.log(
115
+ chalk.gray(
116
+ ` Total: ${data.totalRows} | Page: ${data.pageNo + 1} / ${Math.ceil(data.totalRows / data.pageSize) || 1} | Size: ${data.pageSize}`
117
+ )
118
+ );
119
+ console.log();
120
+ });
121
+
122
+ return listCommand;
123
+ }
@@ -0,0 +1,103 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { configManager } from '../../../core/config/manager.js';
4
+ import { apiClient } from '../../../core/api/client.js';
5
+ import { Environment } from '../../../types/index.js';
6
+ import { UpdateClientRequest, StatusFlag } from '../../../types/client.js';
7
+
8
+ export function createClientUpdateCommand(): Command {
9
+ const cmd = new Command('update');
10
+ cmd.description('Update a client');
11
+ cmd.arguments('<clientId>');
12
+
13
+ cmd
14
+ .option('--client-name <name>', 'Client name')
15
+ .option('--follower <name>', 'Follower/salesperson')
16
+ .option('--office-address <address>', 'Office address')
17
+ .option('--office-telephone <phone>', 'Office telephone')
18
+ .option('--status <status>', 'Status (1=enable, 2=disable)')
19
+ .option('--remark <remark>', 'Remark')
20
+ .option('--json', 'Output as JSON')
21
+ .action(async (clientId: string, options: Record<string, unknown>) => {
22
+ const context = configManager.getCurrentContext();
23
+ const environment = context.environment as Environment;
24
+ const tenant = context.tenant;
25
+ const jsonOutput = options.json === true;
26
+
27
+ if (!clientId) {
28
+ if (jsonOutput) {
29
+ console.log(JSON.stringify({ success: false, error: { code: 'VALIDATION_ERROR', message: 'Client ID is required' } }));
30
+ } else {
31
+ console.error(chalk.red('\nāœ— Client ID is required\n'));
32
+ }
33
+ process.exit(1);
34
+ }
35
+
36
+ const fields: Partial<UpdateClientRequest> = {
37
+ clientId,
38
+ };
39
+
40
+ if (options.clientName) fields.clientName = options.clientName as string;
41
+ if (options.follower) fields.follower = options.follower as string;
42
+ if (options.officeAddress) fields.officeAddress = options.officeAddress as string;
43
+ if (options.officeTelephone) fields.officeTelephone = options.officeTelephone as string;
44
+ if (options.status) fields.statusFlag = parseInt(options.status as string) as StatusFlag;
45
+ if (options.remark) fields.remark = options.remark as string;
46
+
47
+ const updateFields = Object.keys(fields).filter(k => k !== 'clientId' && fields[k as keyof UpdateClientRequest] !== undefined);
48
+ if (updateFields.length === 0) {
49
+ if (jsonOutput) {
50
+ console.log(JSON.stringify({ success: false, error: { code: 'VALIDATION_ERROR', message: 'No fields to update. Provide at least one of: --client-name, --follower, --office-address, --office-telephone, --status, --remark' } }));
51
+ } else {
52
+ console.error(chalk.red('\nāœ— No fields to update. Provide at least one of: --client-name, --follower, --office-address, --office-telephone, --status, --remark\n'));
53
+ }
54
+ process.exit(1);
55
+ }
56
+
57
+ const updateData: UpdateClientRequest = fields as UpdateClientRequest;
58
+
59
+ try {
60
+ const response = await apiClient.updateClient(environment, tenant, updateData);
61
+
62
+ if (response.success) {
63
+ if (jsonOutput) {
64
+ console.log(JSON.stringify({ success: true, data: response.data }));
65
+ } else {
66
+ console.log(chalk.green('\nāœ“ Client updated successfully\n'));
67
+ }
68
+ } else {
69
+ const errorMsg = response.error?.message || 'Unknown error';
70
+ const errorCode = response.error?.code || 'UPDATE_CLIENT_ERROR';
71
+
72
+ if (errorCode === '01001150001' || errorMsg.includes('äøå­˜åœØ')) {
73
+ if (jsonOutput) {
74
+ console.log(JSON.stringify({ success: false, error: { code: 'NOT_FOUND', message: `Client not found: ${clientId}` } }));
75
+ } else {
76
+ console.error(chalk.red(`\nāœ— Client not found: ${clientId}\n`));
77
+ }
78
+ } else {
79
+ if (jsonOutput) {
80
+ console.log(JSON.stringify({ success: false, error: { code: errorCode, message: errorMsg } }));
81
+ } else {
82
+ console.error(chalk.red(`\nāœ— Failed to update client: ${errorMsg}`));
83
+ if (response.error?.code) {
84
+ console.error(chalk.gray(` Error code: ${response.error.code}`));
85
+ }
86
+ console.error();
87
+ }
88
+ }
89
+ process.exit(1);
90
+ }
91
+ } catch (error) {
92
+ const errMsg = error instanceof Error ? error.message : 'Unknown error';
93
+ if (jsonOutput) {
94
+ console.log(JSON.stringify({ success: false, error: { code: 'ERROR', message: errMsg } }));
95
+ } else {
96
+ console.error(chalk.red(`\nāœ— Error: ${errMsg}\n`));
97
+ }
98
+ process.exit(1);
99
+ }
100
+ });
101
+
102
+ return cmd;
103
+ }
@@ -7,6 +7,10 @@ import { createUsersCommand } from './users/index.js';
7
7
  import { createOrgsCommand } from './orgs/index.js';
8
8
  import { createPositionsCommand } from './positions/index.js';
9
9
  import { createRolesCommand } from './roles/index.js';
10
+ import { createClientsCommand } from './clients/index.js';
11
+ import { createSuppliersCommand } from './suppliers/index.js';
12
+ import { createMaterialsCommand } from './materials/index.js';
13
+ import { createUomsCommand } from './uoms/index.js';
10
14
 
11
15
  export function createLibericaCommand(): Command {
12
16
  const libericaCommand = new Command('liberica');
@@ -19,6 +23,10 @@ export function createLibericaCommand(): Command {
19
23
  libericaCommand.addCommand(createOrgsCommand());
20
24
  libericaCommand.addCommand(createPositionsCommand());
21
25
  libericaCommand.addCommand(createRolesCommand());
26
+ libericaCommand.addCommand(createClientsCommand());
27
+ libericaCommand.addCommand(createSuppliersCommand());
28
+ libericaCommand.addCommand(createMaterialsCommand());
29
+ libericaCommand.addCommand(createUomsCommand());
22
30
 
23
31
  libericaCommand.action(() => {
24
32
  console.log(chalk.bold('\nā˜• Liberica Commands\n'));
@@ -29,6 +37,9 @@ export function createLibericaCommand(): Command {
29
37
  console.log(' Use "barista liberica orders <command>" for order operations');
30
38
  console.log(' Use "barista liberica products <command>" for product operations');
31
39
  console.log(' Use "barista liberica production <command>" for production operations');
40
+ console.log(' Use "barista liberica clients <command>" for client management');
41
+ console.log(' Use "barista liberica materials <command>" for material management');
42
+ console.log(' Use "barista liberica uoms <command>" for unit of measure management');
32
43
  console.log('\n Run "barista liberica <command> --help" for more details\n');
33
44
  });
34
45
 
@@ -0,0 +1,168 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import inquirer from 'inquirer';
4
+ import { apiClient } from '../../../core/api/client.js';
5
+ import { configManager } from '../../../core/config/manager.js';
6
+ import { MaterialRequest } from '../../../types/material.js';
7
+
8
+ function formatTable(data: MaterialRequest): string {
9
+ const lines: string[] = [];
10
+ lines.push(` ${chalk.gray('Name:')} ${data.materialName || '(not set)'}`);
11
+ lines.push(` ${chalk.gray('No:')} ${data.materialNo || '(not set)'}`);
12
+ lines.push(` ${chalk.gray('Code:')} ${data.materialCode}`);
13
+ lines.push(` ${chalk.gray('Class:')} ${data.materialClass || '(not set)'}`);
14
+ if (data.materialType) lines.push(` ${chalk.gray('Type:')} ${data.materialType}`);
15
+ if (data.materialUnit) lines.push(` ${chalk.gray('Unit:')} ${data.materialUnit}`);
16
+ return lines.join('\n');
17
+ }
18
+
19
+ export function createMaterialsCreateCommand(): Command {
20
+ const cmd = new Command('create');
21
+ cmd.description('Create a new material (auto-generates material code)');
22
+
23
+ cmd
24
+ .option('-n, --name <name>', 'Material name (required)')
25
+ .option('-c, --class <class>', 'Material class (required)')
26
+ .option('--no <no>', 'Material number (required)')
27
+ .option('--type <type>', 'Material type')
28
+ .option('-u, --unit <unit>', 'Material unit')
29
+ .option('--dry-run', 'Preview without making API call')
30
+ .option('--json', 'Output as JSON');
31
+
32
+ cmd.action(async () => {
33
+ const context = configManager.getCurrentContext();
34
+ const opts = cmd.opts();
35
+
36
+ let name = opts.name as string | undefined;
37
+ let materialNo = (opts.no as string | undefined) || (opts['no'] as string | undefined);
38
+ let materialClass = opts.class as string | undefined;
39
+ const materialType = opts.type as string | undefined;
40
+ const materialUnit = opts.unit as string | undefined;
41
+ const dryRun = opts.dryRun === true;
42
+ const outputJson = (opts as any).json === true || process.argv.includes('--json');
43
+
44
+ if (!name) {
45
+ const { inputName } = await inquirer.prompt([
46
+ {
47
+ type: 'input',
48
+ name: 'inputName',
49
+ message: 'Enter material name:',
50
+ validate: (input: string) => input.trim().length > 0 || 'Material name is required',
51
+ },
52
+ ]);
53
+ name = inputName;
54
+ }
55
+
56
+ if (!materialClass) {
57
+ const { inputClass } = await inquirer.prompt([
58
+ {
59
+ type: 'input',
60
+ name: 'inputClass',
61
+ message: 'Enter material class:',
62
+ validate: (input: string) => input.trim().length > 0 || 'Material class is required',
63
+ },
64
+ ]);
65
+ materialClass = inputClass;
66
+ }
67
+
68
+ if (!materialNo) {
69
+ const { inputNo } = await inquirer.prompt([
70
+ {
71
+ type: 'input',
72
+ name: 'inputNo',
73
+ message: 'Enter material number:',
74
+ validate: (input: string) => input.trim().length > 0 || 'Material number is required',
75
+ },
76
+ ]);
77
+ materialNo = inputNo;
78
+ }
79
+
80
+ const codeResponse = await apiClient.getCodeByType(context.environment, context.tenant, 'TenantMaterialCode');
81
+ if (!codeResponse.success || !codeResponse.data) {
82
+ const errMsg = codeResponse.error?.message || 'Failed to generate material code';
83
+ if (outputJson) {
84
+ console.log(JSON.stringify({ success: false, error: { code: 'CODE_GENERATION_ERROR', message: errMsg } }));
85
+ } else {
86
+ console.error(chalk.red(`\nāœ— Failed to generate material code: ${errMsg}\n`));
87
+ }
88
+ process.exit(1);
89
+ }
90
+ const materialCode = codeResponse.data;
91
+
92
+ const data: MaterialRequest = {
93
+ materialName: name!,
94
+ materialNo: materialNo!,
95
+ materialCode: materialCode,
96
+ materialClass: materialClass!,
97
+ materialType: materialType,
98
+ materialUnit: materialUnit,
99
+ };
100
+
101
+ if (dryRun) {
102
+ if (outputJson) {
103
+ console.log(JSON.stringify({ success: true, dryRun: true, data }));
104
+ } else {
105
+ console.log(chalk.bold('\nšŸ” Dry-Run Mode: No changes will be made\n'));
106
+ console.log(' Material to be created:');
107
+ console.log(formatTable(data));
108
+ console.log();
109
+ }
110
+ return;
111
+ }
112
+
113
+ if (!outputJson) {
114
+ console.log(chalk.bold('\nšŸ“ Creating Material\n'));
115
+ }
116
+
117
+ const response = await apiClient.createMaterial(context.environment, context.tenant, data);
118
+
119
+ if (!response.success) {
120
+ const errorMsg = response.error?.message || 'Failed to create material';
121
+ const errorCode = response.error?.code || 'CREATE_MATERIAL_ERROR';
122
+ if (outputJson) {
123
+ console.log(JSON.stringify({ success: false, error: { code: errorCode, message: errorMsg } }));
124
+ } else {
125
+ console.error(chalk.red(`\nāœ— Failed to create material: ${errorMsg}`));
126
+ if (response.error?.code) {
127
+ console.error(chalk.gray(` Error code: ${response.error.code}`));
128
+ }
129
+ console.error();
130
+ }
131
+ process.exit(1);
132
+ }
133
+
134
+ if (response.success) {
135
+ const material = response.data as {
136
+ materialId?: number;
137
+ materialNo?: string;
138
+ materialCode?: string;
139
+ materialName?: string;
140
+ materialClass?: string;
141
+ materialType?: string;
142
+ materialUnit?: string;
143
+ statusFlag?: number;
144
+ createTime?: string;
145
+ } | undefined;
146
+
147
+ if (outputJson) {
148
+ console.log(JSON.stringify({ success: true, data: material }));
149
+ } else {
150
+ console.log(chalk.green('āœ“ Material created successfully\n'));
151
+ if (material?.materialId) console.log(` ${chalk.gray('Material ID:')} ${chalk.green(String(material.materialId))}`);
152
+ if (material?.materialNo) console.log(` ${chalk.gray('No:')} ${material.materialNo}`);
153
+ if (material?.materialName) console.log(` ${chalk.gray('Name:')} ${material.materialName}`);
154
+ if (material?.materialCode) console.log(` ${chalk.gray('Code:')} ${material.materialCode}`);
155
+ if (material?.materialClass) console.log(` ${chalk.gray('Class:')} ${material.materialClass}`);
156
+ if (material?.materialType) console.log(` ${chalk.gray('Type:')} ${material.materialType}`);
157
+ if (material?.materialUnit) console.log(` ${chalk.gray('Unit:')} ${material.materialUnit}`);
158
+ if (material?.statusFlag !== undefined) {
159
+ const statusText = material.statusFlag === 1 ? 'Enabled' : 'Disabled';
160
+ console.log(` ${chalk.gray('Status:')} ${chalk.green(statusText)}`);
161
+ }
162
+ console.log();
163
+ }
164
+ }
165
+ });
166
+
167
+ return cmd;
168
+ }