@newpeak/barista-cli 0.1.5 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +714 -0
- package/README.ja.md +708 -0
- package/README.md +68 -0
- package/README.vi.md +714 -0
- package/dist/commands/liberica/currency/create.d.ts +3 -0
- package/dist/commands/liberica/currency/create.d.ts.map +1 -0
- package/dist/commands/liberica/currency/create.js +168 -0
- package/dist/commands/liberica/currency/create.js.map +1 -0
- package/dist/commands/liberica/currency/delete.d.ts +3 -0
- package/dist/commands/liberica/currency/delete.d.ts.map +1 -0
- package/dist/commands/liberica/currency/delete.js +122 -0
- package/dist/commands/liberica/currency/delete.js.map +1 -0
- package/dist/commands/liberica/currency/disable.d.ts +3 -0
- package/dist/commands/liberica/currency/disable.d.ts.map +1 -0
- package/dist/commands/liberica/currency/disable.js +145 -0
- package/dist/commands/liberica/currency/disable.js.map +1 -0
- package/dist/commands/liberica/currency/enable.d.ts +3 -0
- package/dist/commands/liberica/currency/enable.d.ts.map +1 -0
- package/dist/commands/liberica/currency/enable.js +125 -0
- package/dist/commands/liberica/currency/enable.js.map +1 -0
- package/dist/commands/liberica/currency/get.d.ts +3 -0
- package/dist/commands/liberica/currency/get.d.ts.map +1 -0
- package/dist/commands/liberica/currency/get.js +80 -0
- package/dist/commands/liberica/currency/get.js.map +1 -0
- package/dist/commands/liberica/currency/index.d.ts +3 -0
- package/dist/commands/liberica/currency/index.d.ts.map +1 -0
- package/dist/commands/liberica/currency/index.js +21 -0
- package/dist/commands/liberica/currency/index.js.map +1 -0
- package/dist/commands/liberica/currency/list.d.ts +3 -0
- package/dist/commands/liberica/currency/list.d.ts.map +1 -0
- package/dist/commands/liberica/currency/list.js +106 -0
- package/dist/commands/liberica/currency/list.js.map +1 -0
- package/dist/commands/liberica/currency/update.d.ts +3 -0
- package/dist/commands/liberica/currency/update.d.ts.map +1 -0
- package/dist/commands/liberica/currency/update.js +123 -0
- package/dist/commands/liberica/currency/update.js.map +1 -0
- package/dist/commands/liberica/index.d.ts.map +1 -1
- package/dist/commands/liberica/index.js +7 -0
- package/dist/commands/liberica/index.js.map +1 -1
- package/dist/commands/liberica/materials/create.d.ts.map +1 -1
- package/dist/commands/liberica/materials/create.js +35 -9
- package/dist/commands/liberica/materials/create.js.map +1 -1
- package/dist/commands/liberica/orgs/index.d.ts.map +1 -1
- package/dist/commands/liberica/orgs/index.js.map +1 -1
- package/dist/commands/liberica/users/create.d.ts.map +1 -1
- package/dist/commands/liberica/users/create.js +1 -0
- package/dist/commands/liberica/users/create.js.map +1 -1
- package/dist/commands/liberica/warehouses/create.d.ts +3 -0
- package/dist/commands/liberica/warehouses/create.d.ts.map +1 -0
- package/dist/commands/liberica/warehouses/create.js +196 -0
- package/dist/commands/liberica/warehouses/create.js.map +1 -0
- package/dist/commands/liberica/warehouses/delete.d.ts +3 -0
- package/dist/commands/liberica/warehouses/delete.d.ts.map +1 -0
- package/dist/commands/liberica/warehouses/delete.js +111 -0
- package/dist/commands/liberica/warehouses/delete.js.map +1 -0
- package/dist/commands/liberica/warehouses/disable.d.ts +3 -0
- package/dist/commands/liberica/warehouses/disable.d.ts.map +1 -0
- package/dist/commands/liberica/warehouses/disable.js +173 -0
- package/dist/commands/liberica/warehouses/disable.js.map +1 -0
- package/dist/commands/liberica/warehouses/enable.d.ts +3 -0
- package/dist/commands/liberica/warehouses/enable.d.ts.map +1 -0
- package/dist/commands/liberica/warehouses/enable.js +173 -0
- package/dist/commands/liberica/warehouses/enable.js.map +1 -0
- package/dist/commands/liberica/warehouses/get.d.ts +3 -0
- package/dist/commands/liberica/warehouses/get.d.ts.map +1 -0
- package/dist/commands/liberica/warehouses/get.js +90 -0
- package/dist/commands/liberica/warehouses/get.js.map +1 -0
- package/dist/commands/liberica/warehouses/index.d.ts +3 -0
- package/dist/commands/liberica/warehouses/index.d.ts.map +1 -0
- package/dist/commands/liberica/warehouses/index.js +23 -0
- package/dist/commands/liberica/warehouses/index.js.map +1 -0
- package/dist/commands/liberica/warehouses/list.d.ts +3 -0
- package/dist/commands/liberica/warehouses/list.d.ts.map +1 -0
- package/dist/commands/liberica/warehouses/list.js +101 -0
- package/dist/commands/liberica/warehouses/list.js.map +1 -0
- package/dist/commands/liberica/warehouses/locations/create.d.ts +3 -0
- package/dist/commands/liberica/warehouses/locations/create.d.ts.map +1 -0
- package/dist/commands/liberica/warehouses/locations/create.js +199 -0
- package/dist/commands/liberica/warehouses/locations/create.js.map +1 -0
- package/dist/commands/liberica/warehouses/locations/delete.d.ts +3 -0
- package/dist/commands/liberica/warehouses/locations/delete.d.ts.map +1 -0
- package/dist/commands/liberica/warehouses/locations/delete.js +115 -0
- package/dist/commands/liberica/warehouses/locations/delete.js.map +1 -0
- package/dist/commands/liberica/warehouses/locations/disable.d.ts +3 -0
- package/dist/commands/liberica/warehouses/locations/disable.d.ts.map +1 -0
- package/dist/commands/liberica/warehouses/locations/disable.js +173 -0
- package/dist/commands/liberica/warehouses/locations/disable.js.map +1 -0
- package/dist/commands/liberica/warehouses/locations/enable.d.ts +3 -0
- package/dist/commands/liberica/warehouses/locations/enable.d.ts.map +1 -0
- package/dist/commands/liberica/warehouses/locations/enable.js +173 -0
- package/dist/commands/liberica/warehouses/locations/enable.js.map +1 -0
- package/dist/commands/liberica/warehouses/locations/get.d.ts +3 -0
- package/dist/commands/liberica/warehouses/locations/get.d.ts.map +1 -0
- package/dist/commands/liberica/warehouses/locations/get.js +73 -0
- package/dist/commands/liberica/warehouses/locations/get.js.map +1 -0
- package/dist/commands/liberica/warehouses/locations/index.d.ts +3 -0
- package/dist/commands/liberica/warehouses/locations/index.d.ts.map +1 -0
- package/dist/commands/liberica/warehouses/locations/index.js +21 -0
- package/dist/commands/liberica/warehouses/locations/index.js.map +1 -0
- package/dist/commands/liberica/warehouses/locations/list.d.ts +3 -0
- package/dist/commands/liberica/warehouses/locations/list.d.ts.map +1 -0
- package/dist/commands/liberica/warehouses/locations/list.js +104 -0
- package/dist/commands/liberica/warehouses/locations/list.js.map +1 -0
- package/dist/commands/liberica/warehouses/locations/update.d.ts +3 -0
- package/dist/commands/liberica/warehouses/locations/update.d.ts.map +1 -0
- package/dist/commands/liberica/warehouses/locations/update.js +128 -0
- package/dist/commands/liberica/warehouses/locations/update.js.map +1 -0
- package/dist/commands/liberica/warehouses/update.d.ts +3 -0
- package/dist/commands/liberica/warehouses/update.d.ts.map +1 -0
- package/dist/commands/liberica/warehouses/update.js +143 -0
- package/dist/commands/liberica/warehouses/update.js.map +1 -0
- package/dist/core/api/client.d.ts +26 -0
- package/dist/core/api/client.d.ts.map +1 -1
- package/dist/core/api/client.js +471 -0
- package/dist/core/api/client.js.map +1 -1
- package/dist/index.js +1 -3
- package/dist/index.js.map +1 -1
- package/dist/types/currency.d.ts +74 -0
- package/dist/types/currency.d.ts.map +1 -0
- package/dist/types/currency.js +2 -0
- package/dist/types/currency.js.map +1 -0
- package/dist/types/index.d.ts +4 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/location.d.ts +53 -0
- package/dist/types/location.d.ts.map +1 -0
- package/dist/types/location.js +2 -0
- package/dist/types/location.js.map +1 -0
- package/dist/types/warehouse.d.ts +68 -0
- package/dist/types/warehouse.d.ts.map +1 -0
- package/dist/types/warehouse.js +2 -0
- package/dist/types/warehouse.js.map +1 -0
- package/docs/COMMAND_DESIGN_SPEC.md +42 -13
- package/docs/commands/liberica/currency/create.md +145 -0
- package/docs/commands/liberica/currency/delete.md +121 -0
- package/docs/commands/liberica/currency/disable.md +119 -0
- package/docs/commands/liberica/currency/enable.md +115 -0
- package/docs/commands/liberica/currency/get.md +118 -0
- package/docs/commands/liberica/currency/list.md +149 -0
- package/docs/commands/liberica/currency/update.md +141 -0
- package/docs/commands/liberica/locations/create.md +195 -0
- package/docs/commands/liberica/locations/list.md +171 -0
- package/docs/commands/liberica/warehouses/create.md +222 -0
- package/docs/commands/liberica/warehouses/list.md +184 -0
- package/package.json +1 -1
- package/src/commands/liberica/currency/create.ts +183 -0
- package/src/commands/liberica/currency/delete.ts +124 -0
- package/src/commands/liberica/currency/disable.ts +147 -0
- package/src/commands/liberica/currency/enable.ts +128 -0
- package/src/commands/liberica/currency/get.ts +91 -0
- package/src/commands/liberica/currency/index.ts +23 -0
- package/src/commands/liberica/currency/list.ts +140 -0
- package/src/commands/liberica/currency/update.ts +129 -0
- package/src/commands/liberica/index.ts +7 -0
- package/src/commands/liberica/materials/create.ts +32 -9
- package/src/commands/liberica/orgs/index.ts +0 -1
- package/src/commands/liberica/users/create.ts +1 -0
- package/src/commands/liberica/warehouses/create.ts +204 -0
- package/src/commands/liberica/warehouses/delete.ts +112 -0
- package/src/commands/liberica/warehouses/disable.ts +174 -0
- package/src/commands/liberica/warehouses/enable.ts +174 -0
- package/src/commands/liberica/warehouses/get.ts +101 -0
- package/src/commands/liberica/warehouses/index.ts +25 -0
- package/src/commands/liberica/warehouses/list.ts +136 -0
- package/src/commands/liberica/warehouses/locations/create.ts +209 -0
- package/src/commands/liberica/warehouses/locations/delete.ts +116 -0
- package/src/commands/liberica/warehouses/locations/disable.ts +174 -0
- package/src/commands/liberica/warehouses/locations/enable.ts +174 -0
- package/src/commands/liberica/warehouses/locations/get.ts +84 -0
- package/src/commands/liberica/warehouses/locations/index.ts +23 -0
- package/src/commands/liberica/warehouses/locations/list.ts +140 -0
- package/src/commands/liberica/warehouses/locations/update.ts +135 -0
- package/src/commands/liberica/warehouses/update.ts +142 -0
- package/src/core/api/client.ts +632 -0
- package/src/index.ts +1 -3
- package/src/types/currency.ts +90 -0
- package/src/types/index.ts +4 -4
- package/src/types/location.ts +66 -0
- package/src/types/warehouse.ts +82 -0
- /package/docs/commands/liberica/{materials-create.md → materials/create.md} +0 -0
- /package/docs/commands/liberica/{materials-delete.md → materials/delete.md} +0 -0
- /package/docs/commands/liberica/{materials-disable.md → materials/disable.md} +0 -0
- /package/docs/commands/liberica/{materials-enable.md → materials/enable.md} +0 -0
- /package/docs/commands/liberica/{materials-get.md → materials/get.md} +0 -0
- /package/docs/commands/liberica/{materials-list.md → materials/list.md} +0 -0
- /package/docs/commands/liberica/{materials-update.md → materials/update.md} +0 -0
- /package/docs/commands/liberica/{uoms-create.md → uoms/create.md} +0 -0
- /package/docs/commands/liberica/{uoms-delete.md → uoms/delete.md} +0 -0
- /package/docs/commands/liberica/{uoms-disable.md → uoms/disable.md} +0 -0
- /package/docs/commands/liberica/{uoms-enable.md → uoms/enable.md} +0 -0
- /package/docs/commands/liberica/{uoms-get.md → uoms/get.md} +0 -0
- /package/docs/commands/liberica/{uoms-list.md → uoms/list.md} +0 -0
- /package/docs/commands/liberica/{uoms-update.md → uoms/update.md} +0 -0
|
@@ -0,0 +1,84 @@
|
|
|
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 { WarehouseLocation } from '../../../../types/location.js';
|
|
7
|
+
|
|
8
|
+
export function createLocationGetCommand(): Command {
|
|
9
|
+
const getCommand = new Command('get');
|
|
10
|
+
getCommand.description('Get warehouse location details by ID');
|
|
11
|
+
getCommand.arguments('<location-id>');
|
|
12
|
+
getCommand.option('--json', 'Output as JSON');
|
|
13
|
+
|
|
14
|
+
getCommand.action(async (locationId: 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 (!locationId) {
|
|
20
|
+
console.error(chalk.red('\n✗ Location ID is required\n'));
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (!locationId || locationId.trim() === '') {
|
|
25
|
+
console.error(chalk.red('\n✗ Invalid location ID.\n'));
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
const response = await apiClient.getLocation(environment, tenant, locationId);
|
|
31
|
+
|
|
32
|
+
if (!response.success) {
|
|
33
|
+
const errorCode = response.error?.code || 'UNKNOWN_ERROR';
|
|
34
|
+
const errorMessage = response.error?.message || 'Unknown error';
|
|
35
|
+
|
|
36
|
+
// Handle "location not found" case
|
|
37
|
+
if (errorCode === '01001150001' || errorMessage.includes('不存在')) {
|
|
38
|
+
console.error(chalk.red(`\n✗ Location not found: ${locationId}\n`));
|
|
39
|
+
} else {
|
|
40
|
+
console.error(chalk.red(`\n✗ Error: ${errorMessage} (${errorCode})\n`));
|
|
41
|
+
}
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const location = response.data as WarehouseLocation | null;
|
|
46
|
+
|
|
47
|
+
if (!location) {
|
|
48
|
+
console.error(chalk.red('\n✗ Location not found\n'));
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (options.json) {
|
|
53
|
+
console.log(JSON.stringify({
|
|
54
|
+
success: true,
|
|
55
|
+
data: location,
|
|
56
|
+
}, null, 2));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Table output
|
|
61
|
+
console.log(chalk.bold('\n📍 Location Details\n'));
|
|
62
|
+
console.log(` ${chalk.gray('ID:')} ${location.warehouseLocationId}`);
|
|
63
|
+
console.log(` ${chalk.gray('Warehouse ID:')} ${location.warehouseId}`);
|
|
64
|
+
console.log(` ${chalk.gray('Code:')} ${location.warehouseLocationCode}`);
|
|
65
|
+
console.log(` ${chalk.gray('Name:')} ${location.warehouseLocationName}`);
|
|
66
|
+
if (location.warehouseLocationType) {
|
|
67
|
+
console.log(` ${chalk.gray('Type:')} ${location.warehouseLocationType}`);
|
|
68
|
+
}
|
|
69
|
+
if (location.capacity !== undefined && location.capacity !== null) {
|
|
70
|
+
console.log(` ${chalk.gray('Capacity:')} ${location.capacity}`);
|
|
71
|
+
}
|
|
72
|
+
console.log(` ${chalk.gray('Status:')} ${location.statusFlag === 1 ? 'Enable' : 'Disable'}`);
|
|
73
|
+
if (location.remark) {
|
|
74
|
+
console.log(` ${chalk.gray('Remark:')} ${location.remark}`);
|
|
75
|
+
}
|
|
76
|
+
console.log();
|
|
77
|
+
} catch (error) {
|
|
78
|
+
console.error(chalk.red(`\n✗ Unexpected error: ${error instanceof Error ? error.message : 'Unknown error'}\n`));
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
return getCommand;
|
|
84
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { createLocationCreateCommand } from './create.js';
|
|
3
|
+
import { createLocationGetCommand } from './get.js';
|
|
4
|
+
import { createLocationUpdateCommand } from './update.js';
|
|
5
|
+
import { createLocationEnableCommand } from './enable.js';
|
|
6
|
+
import { createLocationDisableCommand } from './disable.js';
|
|
7
|
+
import { createLocationDeleteCommand } from './delete.js';
|
|
8
|
+
import { createLocationListCommand } from './list.js';
|
|
9
|
+
|
|
10
|
+
export function createLocationsCommand(): Command {
|
|
11
|
+
const locationsCommand = new Command('locations');
|
|
12
|
+
locationsCommand.description('Manage warehouse locations');
|
|
13
|
+
|
|
14
|
+
locationsCommand.addCommand(createLocationCreateCommand());
|
|
15
|
+
locationsCommand.addCommand(createLocationListCommand());
|
|
16
|
+
locationsCommand.addCommand(createLocationGetCommand());
|
|
17
|
+
locationsCommand.addCommand(createLocationUpdateCommand());
|
|
18
|
+
locationsCommand.addCommand(createLocationEnableCommand());
|
|
19
|
+
locationsCommand.addCommand(createLocationDisableCommand());
|
|
20
|
+
locationsCommand.addCommand(createLocationDeleteCommand());
|
|
21
|
+
|
|
22
|
+
return locationsCommand;
|
|
23
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
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 { LocationListResponse, StatusFlag } from '../../../../types/location.js';
|
|
7
|
+
import { Environment } from '../../../../types/index.js';
|
|
8
|
+
|
|
9
|
+
export function createLocationListCommand(): Command {
|
|
10
|
+
const listCommand = new Command('list');
|
|
11
|
+
listCommand.description('List warehouse locations with pagination');
|
|
12
|
+
|
|
13
|
+
listCommand
|
|
14
|
+
.requiredOption('-w, --warehouse-id <string>', 'Warehouse ID (required)')
|
|
15
|
+
.option('-p, --page <number>', 'Page number', '1')
|
|
16
|
+
.option('-s, --size <number>', 'Page size', '20')
|
|
17
|
+
.option('--code <string>', 'Warehouse location code filter (exact match)')
|
|
18
|
+
.option('--name <string>', 'Warehouse location name filter (search by name)')
|
|
19
|
+
.option('--status <number>', 'Status filter (1=enable, 2=disable)')
|
|
20
|
+
.option('--json', 'Output as JSON')
|
|
21
|
+
.action(async (options) => {
|
|
22
|
+
const context = configManager.getCurrentContext();
|
|
23
|
+
const environment = (options.env as Environment) || context.environment;
|
|
24
|
+
const tenant = options.tenant || context.tenant;
|
|
25
|
+
|
|
26
|
+
const page = parseInt(options.page as string, 10) - 1; // API uses 0-based pagination
|
|
27
|
+
const size = parseInt(options.size as string, 10);
|
|
28
|
+
const warehouseId = options.warehouseId as string;
|
|
29
|
+
|
|
30
|
+
const params: {
|
|
31
|
+
pageNo: number;
|
|
32
|
+
pageSize: number;
|
|
33
|
+
warehouseId: string;
|
|
34
|
+
status?: StatusFlag;
|
|
35
|
+
warehouseLocationCode?: string;
|
|
36
|
+
warehouseLocationName?: string;
|
|
37
|
+
} = { pageNo: page, pageSize: size, warehouseId };
|
|
38
|
+
|
|
39
|
+
if (options.status !== undefined) {
|
|
40
|
+
const statusNum = parseInt(options.status as string, 10);
|
|
41
|
+
if (statusNum === 1 || statusNum === 2) {
|
|
42
|
+
params.status = statusNum as StatusFlag;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (options.code !== undefined) {
|
|
47
|
+
params.warehouseLocationCode = options.code as string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (options.name !== undefined) {
|
|
51
|
+
params.warehouseLocationName = options.name as string;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const response = await apiClient.listLocations(environment, tenant, params);
|
|
55
|
+
|
|
56
|
+
if (!response.success) {
|
|
57
|
+
console.error(chalk.red(`\n✗ Failed to list locations: ${response.error?.message || 'Unknown error'}`));
|
|
58
|
+
if (response.error?.code) {
|
|
59
|
+
console.error(chalk.gray(` Error code: ${response.error.code}`));
|
|
60
|
+
}
|
|
61
|
+
console.error();
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const data = response.data as LocationListResponse | null;
|
|
66
|
+
|
|
67
|
+
if (!data) {
|
|
68
|
+
if (options.json) {
|
|
69
|
+
console.log(JSON.stringify({ success: true, data: { items: [], pagination: { pageNo: 0, pageSize: 20, totalRows: 0 } } }, null, 2));
|
|
70
|
+
} else {
|
|
71
|
+
console.log(chalk.bold('\n📍 Location List\n'));
|
|
72
|
+
console.log(chalk.gray(' No locations found\n'));
|
|
73
|
+
}
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (options.json) {
|
|
78
|
+
console.log(
|
|
79
|
+
JSON.stringify(
|
|
80
|
+
{
|
|
81
|
+
success: true,
|
|
82
|
+
data: {
|
|
83
|
+
items: data.rows || [],
|
|
84
|
+
pagination: {
|
|
85
|
+
pageNo: data.pageNo,
|
|
86
|
+
pageSize: data.pageSize,
|
|
87
|
+
totalRows: data.totalRows,
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
null,
|
|
92
|
+
2
|
|
93
|
+
)
|
|
94
|
+
);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const records = data.rows || [];
|
|
99
|
+
|
|
100
|
+
if (records.length === 0) {
|
|
101
|
+
console.log(chalk.bold('\n📍 Location List\n'));
|
|
102
|
+
console.log(chalk.gray(' No locations found\n'));
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
console.log(chalk.bold('\n📍 Location List\n'));
|
|
107
|
+
|
|
108
|
+
const table = new Table({
|
|
109
|
+
head: [chalk.bold('ID'), chalk.bold('Code'), chalk.bold('Name'), chalk.bold('Type'), chalk.bold('Capacity'), chalk.bold('Status')],
|
|
110
|
+
colWidths: [12, 15, 25, 12, 10, 10],
|
|
111
|
+
style: {
|
|
112
|
+
head: [],
|
|
113
|
+
border: [],
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
for (const location of records) {
|
|
118
|
+
const statusText = location.statusFlag === 1 ? chalk.green('Enable') : chalk.red('Disable');
|
|
119
|
+
table.push([
|
|
120
|
+
location.warehouseLocationId,
|
|
121
|
+
location.warehouseLocationCode || '-',
|
|
122
|
+
location.warehouseLocationName || '-',
|
|
123
|
+
location.warehouseLocationType || '-',
|
|
124
|
+
location.capacity?.toString() || '-',
|
|
125
|
+
statusText,
|
|
126
|
+
]);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
console.log(table.toString());
|
|
130
|
+
console.log();
|
|
131
|
+
console.log(
|
|
132
|
+
chalk.gray(
|
|
133
|
+
` Total: ${data.totalRows} | Page: ${data.pageNo} / ${Math.ceil(data.totalRows / data.pageSize) || 1} | Size: ${data.pageSize}`
|
|
134
|
+
)
|
|
135
|
+
);
|
|
136
|
+
console.log();
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
return listCommand;
|
|
140
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
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 { WarehouseLocation, UpdateLocationRequest } from '../../../../types/location.js';
|
|
7
|
+
|
|
8
|
+
export function createLocationUpdateCommand(): Command {
|
|
9
|
+
const updateCommand = new Command('update');
|
|
10
|
+
updateCommand
|
|
11
|
+
.description('Update warehouse location information')
|
|
12
|
+
.argument('<location-id>', 'Warehouse Location ID')
|
|
13
|
+
.option('-n, --name <name>', 'Location name')
|
|
14
|
+
.option('-t, --type <type>', 'Location type')
|
|
15
|
+
.option('-c, --capacity <capacity>', 'Location capacity')
|
|
16
|
+
.option('--remark <remark>', 'Remark')
|
|
17
|
+
.option('--status <status>', 'Status (1=active, 2=inactive)')
|
|
18
|
+
.option('--dry-run', 'Preview changes without making API call')
|
|
19
|
+
.option('--json', 'Output result as JSON')
|
|
20
|
+
.action(async (locationId: string, options: Record<string, unknown>) => {
|
|
21
|
+
const context = configManager.getCurrentContext();
|
|
22
|
+
const environment = context.environment as Environment;
|
|
23
|
+
const tenant = context.tenant;
|
|
24
|
+
|
|
25
|
+
const fields: Partial<UpdateLocationRequest> = {};
|
|
26
|
+
if (options.name) fields.warehouseLocationName = options.name as string;
|
|
27
|
+
if (options.type) fields.warehouseLocationType = options.type as string;
|
|
28
|
+
if (options.capacity) fields.capacity = parseInt(options.capacity as string, 10);
|
|
29
|
+
if (options.remark) fields.remark = options.remark as string;
|
|
30
|
+
if (options.status) {
|
|
31
|
+
const statusVal = parseInt(options.status as string, 10);
|
|
32
|
+
if (statusVal !== 1 && statusVal !== 2) {
|
|
33
|
+
console.error(chalk.red('\n✗ Invalid status. Must be 1 (active) or 2 (inactive).\n'));
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
fields.status = statusVal as 1 | 2;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const providedFields = Object.keys(fields).filter(
|
|
40
|
+
(k) => fields[k as keyof UpdateLocationRequest] !== undefined
|
|
41
|
+
);
|
|
42
|
+
if (providedFields.length === 0) {
|
|
43
|
+
console.error(
|
|
44
|
+
chalk.red('\n✗ No fields to update. Provide at least one of: --name, --type, --capacity, --remark, --status\n')
|
|
45
|
+
);
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (options.capacity !== undefined && isNaN(fields.capacity ?? NaN)) {
|
|
50
|
+
console.error(chalk.red('\n✗ Invalid capacity. Must be a number.\n'));
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (options.dryRun) {
|
|
55
|
+
console.log(chalk.bold(`\n📍 Update Warehouse Location — Dry Run (${environment})\n`));
|
|
56
|
+
console.log(chalk.gray(` Location ID: ${locationId}`));
|
|
57
|
+
console.log(chalk.gray('\n Changes to be applied:'));
|
|
58
|
+
for (const field of providedFields) {
|
|
59
|
+
const label = field.replace(/([A-Z])/g, (m) => ` ${m.toLowerCase()}`).trim();
|
|
60
|
+
console.log(chalk.cyan(` ${label}: "${fields[field as keyof UpdateLocationRequest]}"`));
|
|
61
|
+
}
|
|
62
|
+
console.log();
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
let currentLocation: WarehouseLocation | undefined;
|
|
67
|
+
try {
|
|
68
|
+
const locationResponse = await apiClient.getLocation(environment, tenant, locationId);
|
|
69
|
+
if (!locationResponse.success || !locationResponse.data) {
|
|
70
|
+
console.error(chalk.red(`\n✗ Location not found: ${locationId}`));
|
|
71
|
+
if (locationResponse.error?.message) {
|
|
72
|
+
console.error(chalk.gray(` ${locationResponse.error.message}`));
|
|
73
|
+
}
|
|
74
|
+
if (locationResponse.error?.code) {
|
|
75
|
+
console.error(chalk.gray(` Error code: ${locationResponse.error.code}`));
|
|
76
|
+
}
|
|
77
|
+
console.error();
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
currentLocation = locationResponse.data as WarehouseLocation;
|
|
81
|
+
} catch (error) {
|
|
82
|
+
console.error(chalk.red(`\n✗ Failed to fetch location: ${error instanceof Error ? error.message : 'Unknown error'}\n`));
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
console.log(chalk.bold(`\n📍 Update Warehouse Location (${environment})\n`));
|
|
87
|
+
console.log(chalk.gray(` Location ID: ${locationId}`));
|
|
88
|
+
console.log(chalk.gray(` Current Name: ${currentLocation.warehouseLocationName}`));
|
|
89
|
+
console.log(chalk.gray('\n Changes:'));
|
|
90
|
+
for (const field of providedFields) {
|
|
91
|
+
const label = field.replace(/([A-Z])/g, (m) => ` ${m.toLowerCase()}`).trim();
|
|
92
|
+
const currentVal = (currentLocation as unknown as Record<string, unknown>)[field] ?? '(not set)';
|
|
93
|
+
const newVal = fields[field as keyof UpdateLocationRequest];
|
|
94
|
+
console.log(chalk.cyan(` ${label}: "${currentVal}" → "${newVal}"`));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const updateData: UpdateLocationRequest = { warehouseLocationId: locationId, ...fields };
|
|
98
|
+
try {
|
|
99
|
+
const response = await apiClient.updateLocation(environment, tenant, updateData);
|
|
100
|
+
|
|
101
|
+
if (response.success) {
|
|
102
|
+
if (options.json) {
|
|
103
|
+
console.log(JSON.stringify({ success: true, data: response.data }, null, 2));
|
|
104
|
+
} else {
|
|
105
|
+
console.log(chalk.green(`\n✓ Location updated successfully\n`));
|
|
106
|
+
}
|
|
107
|
+
} else {
|
|
108
|
+
if (options.json) {
|
|
109
|
+
console.log(JSON.stringify({ success: false, error: response.error }, null, 2));
|
|
110
|
+
} else {
|
|
111
|
+
console.error(chalk.red(`\n✗ Update failed: ${response.error?.message || 'Unknown error'}`));
|
|
112
|
+
if (response.error?.code) {
|
|
113
|
+
console.error(chalk.gray(` Error code: ${response.error.code}`));
|
|
114
|
+
}
|
|
115
|
+
console.error();
|
|
116
|
+
}
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
} catch (error) {
|
|
120
|
+
if (options.json) {
|
|
121
|
+
console.log(
|
|
122
|
+
JSON.stringify({
|
|
123
|
+
success: false,
|
|
124
|
+
error: { message: error instanceof Error ? error.message : 'Unknown error' },
|
|
125
|
+
})
|
|
126
|
+
);
|
|
127
|
+
} else {
|
|
128
|
+
console.error(chalk.red(`\n✗ Error: ${error instanceof Error ? error.message : 'Unknown error'}\n`));
|
|
129
|
+
}
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
return updateCommand;
|
|
135
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
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 { Warehouse, UpdateWarehouseRequest } from '../../../types/warehouse.js';
|
|
7
|
+
|
|
8
|
+
export function createWarehouseUpdateCommand(): Command {
|
|
9
|
+
const updateCommand = new Command('update');
|
|
10
|
+
updateCommand
|
|
11
|
+
.description('Update warehouse information')
|
|
12
|
+
.argument('<warehouse-id>', 'Warehouse ID')
|
|
13
|
+
.option('-n, --name <name>', 'Warehouse name')
|
|
14
|
+
.option('-t, --type <type>', 'Warehouse type')
|
|
15
|
+
.option('--classes <classes>', 'Warehouse classes')
|
|
16
|
+
.option('-a, --address <address>', 'Address')
|
|
17
|
+
.option('--contact <contact>', 'Contact person')
|
|
18
|
+
.option('-p, --phone <phone>', 'Phone number')
|
|
19
|
+
.option('-m, --manager <manager>', 'Manager')
|
|
20
|
+
.option('--enable-location', 'Enable location management')
|
|
21
|
+
.option('--disable-location', 'Disable location management')
|
|
22
|
+
.option('--enable-negative-inventory', 'Enable negative inventory')
|
|
23
|
+
.option('--disable-negative-inventory', 'Disable negative inventory')
|
|
24
|
+
.option('--remark <remark>', 'Remark')
|
|
25
|
+
.option('--dry-run', 'Preview changes without making API call')
|
|
26
|
+
.option('--json', 'Output result as JSON')
|
|
27
|
+
.action(async (warehouseId: string, options: Record<string, unknown>) => {
|
|
28
|
+
const context = configManager.getCurrentContext();
|
|
29
|
+
const environment = context.environment as Environment;
|
|
30
|
+
const tenant = context.tenant;
|
|
31
|
+
|
|
32
|
+
const fields: Partial<UpdateWarehouseRequest> = {};
|
|
33
|
+
if (options.name) fields.warehouseName = options.name as string;
|
|
34
|
+
if (options.type) fields.warehouseType = options.type as string;
|
|
35
|
+
if (options.classes) fields.warehouseClasses = options.classes as string;
|
|
36
|
+
if (options.address) fields.address = options.address as string;
|
|
37
|
+
if (options.contact) fields.contact = options.contact as string;
|
|
38
|
+
if (options.phone) fields.phone = options.phone as string;
|
|
39
|
+
if (options.manager) fields.manager = options.manager as string;
|
|
40
|
+
if (options.remark) fields.remark = options.remark as string;
|
|
41
|
+
if (options.enableLocation !== undefined) fields.enableLocation = 'Y';
|
|
42
|
+
if (options.disableLocation !== undefined) fields.enableLocation = 'N';
|
|
43
|
+
if (options.enableNegativeInventory !== undefined) fields.enableNegativeInventory = 'Y';
|
|
44
|
+
if (options.disableNegativeInventory !== undefined) fields.enableNegativeInventory = 'N';
|
|
45
|
+
|
|
46
|
+
const providedFields = Object.keys(fields).filter(
|
|
47
|
+
(k) => fields[k as keyof UpdateWarehouseRequest] !== undefined
|
|
48
|
+
);
|
|
49
|
+
if (providedFields.length === 0) {
|
|
50
|
+
console.error(
|
|
51
|
+
chalk.red('\n✗ No fields to update. Provide at least one option.\n')
|
|
52
|
+
);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (options.phone && !/^\+?[\d\s\-()]+$/.test(options.phone as string)) {
|
|
57
|
+
console.error(chalk.red('\n✗ Invalid phone number format\n'));
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (options.dryRun) {
|
|
62
|
+
console.log(chalk.bold(`\n🏭 Update Warehouse — Dry Run (${environment})\n`));
|
|
63
|
+
console.log(chalk.gray(` Warehouse ID: ${warehouseId}`));
|
|
64
|
+
console.log(chalk.gray('\n Changes to be applied:'));
|
|
65
|
+
for (const field of providedFields) {
|
|
66
|
+
const label = field.replace(/([A-Z])/g, (m) => ` ${m.toLowerCase()}`).trim();
|
|
67
|
+
console.log(chalk.cyan(` ${label}: "${fields[field as keyof UpdateWarehouseRequest]}"`));
|
|
68
|
+
}
|
|
69
|
+
console.log();
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
let currentWarehouse: Warehouse | undefined;
|
|
74
|
+
try {
|
|
75
|
+
const warehouseResponse = await apiClient.getWarehouse(environment, tenant, warehouseId);
|
|
76
|
+
if (!warehouseResponse.success || !warehouseResponse.data) {
|
|
77
|
+
console.error(chalk.red(`\n✗ Warehouse not found: ${warehouseId}`));
|
|
78
|
+
if (warehouseResponse.error?.message) {
|
|
79
|
+
console.error(chalk.gray(` ${warehouseResponse.error.message}`));
|
|
80
|
+
}
|
|
81
|
+
if (warehouseResponse.error?.code) {
|
|
82
|
+
console.error(chalk.gray(` Error code: ${warehouseResponse.error.code}`));
|
|
83
|
+
}
|
|
84
|
+
console.error();
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
currentWarehouse = warehouseResponse.data as Warehouse;
|
|
88
|
+
} catch (error) {
|
|
89
|
+
console.error(chalk.red(`\n✗ Failed to fetch warehouse: ${error instanceof Error ? error.message : 'Unknown error'}\n`));
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
console.log(chalk.bold(`\n🏭 Update Warehouse (${environment})\n`));
|
|
94
|
+
console.log(chalk.gray(` Warehouse ID: ${warehouseId}`));
|
|
95
|
+
console.log(chalk.gray(` Current Name: ${currentWarehouse.warehouseName}`));
|
|
96
|
+
console.log(chalk.gray('\n Changes:'));
|
|
97
|
+
for (const field of providedFields) {
|
|
98
|
+
const label = field.replace(/([A-Z])/g, (m) => ` ${m.toLowerCase()}`).trim();
|
|
99
|
+
const currentVal = (currentWarehouse as unknown as Record<string, unknown>)[field] ?? '(not set)';
|
|
100
|
+
const newVal = fields[field as keyof UpdateWarehouseRequest];
|
|
101
|
+
console.log(chalk.cyan(` ${label}: "${currentVal}" → "${newVal}"`));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const updateData: UpdateWarehouseRequest = { warehouseId, ...fields };
|
|
105
|
+
try {
|
|
106
|
+
const response = await apiClient.updateWarehouse(environment, tenant, updateData);
|
|
107
|
+
|
|
108
|
+
if (response.success) {
|
|
109
|
+
if (options.json) {
|
|
110
|
+
console.log(JSON.stringify({ success: true, data: response.data }, null, 2));
|
|
111
|
+
} else {
|
|
112
|
+
console.log(chalk.green(`\n✓ Warehouse updated successfully\n`));
|
|
113
|
+
}
|
|
114
|
+
} else {
|
|
115
|
+
if (options.json) {
|
|
116
|
+
console.log(JSON.stringify({ success: false, error: response.error }, null, 2));
|
|
117
|
+
} else {
|
|
118
|
+
console.error(chalk.red(`\n✗ Update failed: ${response.error?.message || 'Unknown error'}`));
|
|
119
|
+
if (response.error?.code) {
|
|
120
|
+
console.error(chalk.gray(` Error code: ${response.error.code}`));
|
|
121
|
+
}
|
|
122
|
+
console.error();
|
|
123
|
+
}
|
|
124
|
+
process.exit(1);
|
|
125
|
+
}
|
|
126
|
+
} catch (error) {
|
|
127
|
+
if (options.json) {
|
|
128
|
+
console.log(
|
|
129
|
+
JSON.stringify({
|
|
130
|
+
success: false,
|
|
131
|
+
error: { message: error instanceof Error ? error.message : 'Unknown error' },
|
|
132
|
+
})
|
|
133
|
+
);
|
|
134
|
+
} else {
|
|
135
|
+
console.error(chalk.red(`\n✗ Error: ${error instanceof Error ? error.message : 'Unknown error'}\n`));
|
|
136
|
+
}
|
|
137
|
+
process.exit(1);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
return updateCommand;
|
|
142
|
+
}
|