@apptimate/core-lib 4.1.0 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apptimate/core-lib",
3
- "version": "4.1.0",
3
+ "version": "4.2.0",
4
4
  "main": "src/index.ts",
5
5
  "types": "src/index.ts",
6
6
  "publishConfig": {
@@ -0,0 +1,34 @@
1
+ import { sendRequest, IApiResponse } from "@apptimate/core-lib";
2
+
3
+ const BASE = `${process.env.NEXT_PUBLIC_API_URL}/api/inventory/brands`;
4
+
5
+ export async function getBrands(params: Record<string, string | number> = {}): Promise<IApiResponse> {
6
+ const queryParams = new URLSearchParams(params as Record<string, string>).toString();
7
+ const response = await sendRequest({ url: `${BASE}${queryParams ? `?${queryParams}` : ""}`, method: "GET" });
8
+ return response.responseData as IApiResponse;
9
+ }
10
+
11
+ export async function getBrand(id: number): Promise<IApiResponse> {
12
+ const response = await sendRequest({ url: `${BASE}/${id}`, method: "GET" });
13
+ return response.responseData as IApiResponse;
14
+ }
15
+
16
+ export async function createBrand(data: any): Promise<IApiResponse> {
17
+ const response = await sendRequest({ url: BASE, method: "POST", data });
18
+ return response.responseData as IApiResponse;
19
+ }
20
+
21
+ export async function updateBrand(id: number, data: any): Promise<IApiResponse> {
22
+ const response = await sendRequest({ url: `${BASE}/${id}`, method: "PUT", data });
23
+ return response.responseData as IApiResponse;
24
+ }
25
+
26
+ export async function deleteBrand(id: number): Promise<IApiResponse> {
27
+ const response = await sendRequest({ url: `${BASE}/${id}`, method: "DELETE" });
28
+ return response.responseData as IApiResponse;
29
+ }
30
+
31
+ export async function lookupBrands(): Promise<IApiResponse> {
32
+ const response = await sendRequest({ url: `${BASE}/lookup`, method: "GET" });
33
+ return response.responseData as IApiResponse;
34
+ }
@@ -0,0 +1,39 @@
1
+ import { sendRequest, IApiResponse } from "@apptimate/core-lib";
2
+
3
+ const BASE = `${process.env.NEXT_PUBLIC_API_URL}/api/inventory/categories`;
4
+
5
+ export async function getCategories(params: Record<string, string | number> = {}): Promise<IApiResponse> {
6
+ const queryParams = new URLSearchParams(params as Record<string, string>).toString();
7
+ const response = await sendRequest({ url: `${BASE}${queryParams ? `?${queryParams}` : ""}`, method: "GET" });
8
+ return response.responseData as IApiResponse;
9
+ }
10
+
11
+ export async function getCategoryTree(): Promise<IApiResponse> {
12
+ const response = await sendRequest({ url: `${BASE}/tree`, method: "GET" });
13
+ return response.responseData as IApiResponse;
14
+ }
15
+
16
+ export async function getCategory(id: number): Promise<IApiResponse> {
17
+ const response = await sendRequest({ url: `${BASE}/${id}`, method: "GET" });
18
+ return response.responseData as IApiResponse;
19
+ }
20
+
21
+ export async function createCategory(data: any): Promise<IApiResponse> {
22
+ const response = await sendRequest({ url: BASE, method: "POST", data });
23
+ return response.responseData as IApiResponse;
24
+ }
25
+
26
+ export async function updateCategory(id: number, data: any): Promise<IApiResponse> {
27
+ const response = await sendRequest({ url: `${BASE}/${id}`, method: "PUT", data });
28
+ return response.responseData as IApiResponse;
29
+ }
30
+
31
+ export async function deleteCategory(id: number): Promise<IApiResponse> {
32
+ const response = await sendRequest({ url: `${BASE}/${id}`, method: "DELETE" });
33
+ return response.responseData as IApiResponse;
34
+ }
35
+
36
+ export async function lookupCategories(): Promise<IApiResponse> {
37
+ const response = await sendRequest({ url: `${BASE}/lookup`, method: "GET" });
38
+ return response.responseData as IApiResponse;
39
+ }
@@ -0,0 +1,24 @@
1
+ "use client";
2
+
3
+ import { sendRequest, IApiResponse } from "@apptimate/core-lib";
4
+
5
+ const BASE_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:8000";
6
+
7
+ export async function getInventorySettings(): Promise<IApiResponse> {
8
+ const response = await sendRequest({ url: `${BASE_URL}/api/inventory/settings`, method: "GET" });
9
+ return response.responseData as IApiResponse;
10
+ }
11
+
12
+ export async function getInventorySetting(key: string): Promise<IApiResponse> {
13
+ const response = await sendRequest({ url: `${BASE_URL}/api/inventory/settings/${key}`, method: "GET" });
14
+ return response.responseData as IApiResponse;
15
+ }
16
+
17
+ export async function saveInventorySetting(key: string, value: any): Promise<IApiResponse> {
18
+ const response = await sendRequest({
19
+ url: `${BASE_URL}/api/inventory/settings/${key}`,
20
+ method: "PUT",
21
+ data: { value }
22
+ });
23
+ return response.responseData as IApiResponse;
24
+ }
@@ -0,0 +1,113 @@
1
+ import { sendRequest, IApiResponse } from "@apptimate/core-lib";
2
+
3
+ const BASE = `${process.env.NEXT_PUBLIC_API_URL}/api/inventory/items`;
4
+
5
+ export async function getItems(params: Record<string, string | number> = {}): Promise<IApiResponse> {
6
+ const queryParams = new URLSearchParams(params as Record<string, string>).toString();
7
+ const response = await sendRequest({ url: `${BASE}${queryParams ? `?${queryParams}` : ""}`, method: "GET" });
8
+ return response.responseData as IApiResponse;
9
+ }
10
+
11
+ export async function getItem(id: number): Promise<IApiResponse> {
12
+ const response = await sendRequest({ url: `${BASE}/${id}`, method: "GET" });
13
+ return response.responseData as IApiResponse;
14
+ }
15
+
16
+ export async function getItemCategoryCount(categoryId: number): Promise<IApiResponse> {
17
+ const response = await sendRequest({ url: `${BASE}/category-count?category_id=${categoryId}`, method: "GET" });
18
+ return response.responseData as IApiResponse;
19
+ }
20
+
21
+ export async function createItem(data: any): Promise<IApiResponse> {
22
+ const response = await sendRequest({ url: BASE, method: "POST", data });
23
+ return response.responseData as IApiResponse;
24
+ }
25
+
26
+ export async function updateItem(id: number, data: any): Promise<IApiResponse> {
27
+ const response = await sendRequest({ url: `${BASE}/${id}`, method: "PUT", data });
28
+ return response.responseData as IApiResponse;
29
+ }
30
+
31
+ export async function deleteItem(id: number): Promise<IApiResponse> {
32
+ const response = await sendRequest({ url: `${BASE}/${id}`, method: "DELETE" });
33
+ return response.responseData as IApiResponse;
34
+ }
35
+
36
+ export async function lookupItems(): Promise<IApiResponse> {
37
+ const response = await sendRequest({ url: `${BASE}/lookup`, method: "GET" });
38
+ return response.responseData as IApiResponse;
39
+ }
40
+
41
+ export async function addVariant(itemId: number, data: any): Promise<IApiResponse> {
42
+ const response = await sendRequest({ url: `${BASE}/${itemId}/variants`, method: "POST", data });
43
+ return response.responseData as IApiResponse;
44
+ }
45
+
46
+ export async function updateVariant(itemId: number, variantId: number, data: any): Promise<IApiResponse> {
47
+ const response = await sendRequest({ url: `${BASE}/${itemId}/variants/${variantId}`, method: "PUT", data });
48
+ return response.responseData as IApiResponse;
49
+ }
50
+
51
+ export async function deleteVariant(itemId: number, variantId: number): Promise<IApiResponse> {
52
+ const response = await sendRequest({ url: `${BASE}/${itemId}/variants/${variantId}`, method: "DELETE" });
53
+ return response.responseData as IApiResponse;
54
+ }
55
+
56
+ export async function pickerSearchItems(
57
+ search: string,
58
+ warehouseId?: number,
59
+ limit?: number
60
+ ): Promise<IApiResponse> {
61
+ const params = new URLSearchParams();
62
+ if (search) params.append("search", search);
63
+ if (warehouseId) params.append("warehouse_id", warehouseId.toString());
64
+ if (limit) params.append("limit", limit.toString());
65
+
66
+ const response = await sendRequest({ url: `${BASE}/picker-search?${params.toString()}`, method: "GET" });
67
+ return response.responseData as IApiResponse;
68
+ }
69
+
70
+ // ── Image Management ──
71
+
72
+ export async function getItemImages(itemId: number, variantId?: number, batchId?: number): Promise<IApiResponse> {
73
+ const params = new URLSearchParams();
74
+ if (variantId) params.append("variant_id", String(variantId));
75
+ if (batchId) params.append("batch_id", String(batchId));
76
+ const qs = params.toString();
77
+ const response = await sendRequest({ url: `${BASE}/${itemId}/images${qs ? `?${qs}` : ""}`, method: "GET" });
78
+ return response.responseData as IApiResponse;
79
+ }
80
+
81
+ export async function uploadItemImages(
82
+ itemId: number,
83
+ files: File[],
84
+ variantId?: number,
85
+ batchId?: number
86
+ ): Promise<IApiResponse> {
87
+ const formData = new FormData();
88
+ files.forEach((file) => formData.append("images[]", file));
89
+ if (variantId) formData.append("variant_id", String(variantId));
90
+ if (batchId) formData.append("batch_id", String(batchId));
91
+
92
+ const response = await sendRequest({
93
+ url: `${BASE}/${itemId}/images`,
94
+ method: "POST",
95
+ data: formData,
96
+ });
97
+ return response.responseData as IApiResponse;
98
+ }
99
+
100
+ export async function deleteItemImage(itemId: number, imageId: number): Promise<IApiResponse> {
101
+ const response = await sendRequest({ url: `${BASE}/${itemId}/images/${imageId}`, method: "DELETE" });
102
+ return response.responseData as IApiResponse;
103
+ }
104
+
105
+ export async function setPrimaryImage(itemId: number, imageId: number): Promise<IApiResponse> {
106
+ const response = await sendRequest({ url: `${BASE}/${itemId}/images/${imageId}/primary`, method: "PATCH" });
107
+ return response.responseData as IApiResponse;
108
+ }
109
+
110
+ export async function reorderItemImages(itemId: number, imageIds: number[]): Promise<IApiResponse> {
111
+ const response = await sendRequest({ url: `${BASE}/${itemId}/images/reorder`, method: "POST", data: { image_ids: imageIds } });
112
+ return response.responseData as IApiResponse;
113
+ }
@@ -0,0 +1,66 @@
1
+ import { sendRequest, IApiResponse } from "@apptimate/core-lib";
2
+
3
+ const BASE = `${process.env.NEXT_PUBLIC_API_URL}/api/parties`;
4
+
5
+ export async function getParties(params: Record<string, string | number> = {}): Promise<IApiResponse> {
6
+ const queryParams = new URLSearchParams(params as Record<string, string>).toString();
7
+ const url = `${BASE}${queryParams ? `?${queryParams}` : ""}`;
8
+
9
+ const response = await sendRequest({
10
+ url,
11
+ method: "GET",
12
+ });
13
+ return response.responseData as IApiResponse;
14
+ }
15
+
16
+ export async function getParty(id: number): Promise<IApiResponse> {
17
+ const response = await sendRequest({
18
+ url: `${BASE}/${id}`,
19
+ method: "GET",
20
+ });
21
+ return response.responseData as IApiResponse;
22
+ }
23
+
24
+ export async function createParty(data: any): Promise<IApiResponse> {
25
+ const response = await sendRequest({
26
+ url: BASE,
27
+ method: "POST",
28
+ data,
29
+ });
30
+ return response.responseData as IApiResponse;
31
+ }
32
+
33
+ export async function updateParty(id: number, data: any): Promise<IApiResponse> {
34
+ const response = await sendRequest({
35
+ url: `${BASE}/${id}`,
36
+ method: "PUT",
37
+ data,
38
+ });
39
+ return response.responseData as IApiResponse;
40
+ }
41
+
42
+ export async function deleteParty(id: number): Promise<IApiResponse> {
43
+ const response = await sendRequest({
44
+ url: `${BASE}/${id}`,
45
+ method: "DELETE",
46
+ });
47
+ return response.responseData as IApiResponse;
48
+ }
49
+
50
+ export async function togglePartyStatus(id: number, status: string): Promise<IApiResponse> {
51
+ const response = await sendRequest({
52
+ url: `${BASE}/${id}`,
53
+ method: "PUT",
54
+ data: { status },
55
+ });
56
+ return response.responseData as IApiResponse;
57
+ }
58
+
59
+ export async function lookupParties(type?: string): Promise<IApiResponse> {
60
+ const queryParams = type ? `?type=${type}` : "";
61
+ const response = await sendRequest({
62
+ url: `${BASE}/lookup${queryParams}`,
63
+ method: "GET",
64
+ });
65
+ return response.responseData as IApiResponse;
66
+ }
@@ -0,0 +1,51 @@
1
+ import { sendRequest, IApiResponse } from "@apptimate/core-lib";
2
+
3
+ const INV_BASE = `${process.env.NEXT_PUBLIC_API_URL}/api/inventory`;
4
+ const FIN_BASE = `${process.env.NEXT_PUBLIC_API_URL}/api/finance`;
5
+
6
+ // ── Inventory: Transaction Lookup ──
7
+
8
+ export async function transactionLookup(params: Record<string, string | number> = {}): Promise<IApiResponse> {
9
+ const response = await sendRequest({ url: `${INV_BASE}/items/transaction-lookup`, method: "GET", params });
10
+ return response.responseData as IApiResponse;
11
+ }
12
+
13
+ export async function getItemBatches(itemId: number, params: Record<string, string | number> = {}): Promise<IApiResponse> {
14
+ const response = await sendRequest({ url: `${INV_BASE}/items/${itemId}/batches`, method: "GET", params });
15
+ return response.responseData as IApiResponse;
16
+ }
17
+
18
+ export async function bulkStockCheck(data: {
19
+ warehouse_id: number;
20
+ lines: Array<{ item_id: number; variant_id?: number | null; batch_id?: number | null; quantity: number }>;
21
+ }): Promise<IApiResponse> {
22
+ const response = await sendRequest({ url: `${INV_BASE}/stock/check`, method: "POST", data });
23
+ return response.responseData as IApiResponse;
24
+ }
25
+
26
+ // ── Finance: Payment Modes ──
27
+
28
+ export async function getPaymentModes(): Promise<IApiResponse> {
29
+ const response = await sendRequest({ url: `${FIN_BASE}/payment-modes`, method: "GET" });
30
+ return response.responseData as IApiResponse;
31
+ }
32
+
33
+ export async function getBankAccountsLookup(): Promise<IApiResponse> {
34
+ const response = await sendRequest({ url: `${FIN_BASE}/bank-accounts/lookup`, method: "GET" });
35
+ return response.responseData as IApiResponse;
36
+ }
37
+
38
+ // ── Finance: Warehouses Lookup ──
39
+
40
+ export async function getWarehousesLookup(allOrgs: boolean = false): Promise<IApiResponse> {
41
+ const url = `${process.env.NEXT_PUBLIC_API_URL}/api/warehouses/lookup${allOrgs ? '?all_orgs=1' : ''}`;
42
+ const response = await sendRequest({ url, method: "GET" });
43
+ return response.responseData as IApiResponse;
44
+ }
45
+
46
+ // ── Core: Parties Lookup ──
47
+
48
+ export async function getPartiesLookup(params: Record<string, string | number> = {}): Promise<IApiResponse> {
49
+ const response = await sendRequest({ url: `${process.env.NEXT_PUBLIC_API_URL}/api/parties/lookup`, method: "GET", params });
50
+ return response.responseData as IApiResponse;
51
+ }
@@ -0,0 +1,24 @@
1
+ import { sendRequest, IApiResponse } from "@apptimate/core-lib";
2
+
3
+ const BASE = `${process.env.NEXT_PUBLIC_API_URL}/api/inventory/uom-groups`;
4
+
5
+ export async function getUomGroups(params: Record<string, string | number | boolean> = {}): Promise<IApiResponse> {
6
+ const queryParams = new URLSearchParams(params as Record<string, string>).toString();
7
+ const response = await sendRequest({ url: `${BASE}${queryParams ? `?${queryParams}` : ""}`, method: "GET" });
8
+ return response.responseData as IApiResponse;
9
+ }
10
+
11
+ export async function createUomGroup(data: any): Promise<IApiResponse> {
12
+ const response = await sendRequest({ url: BASE, method: "POST", data });
13
+ return response.responseData as IApiResponse;
14
+ }
15
+
16
+ export async function updateUomGroup(id: number, data: any): Promise<IApiResponse> {
17
+ const response = await sendRequest({ url: `${BASE}/${id}`, method: "PUT", data });
18
+ return response.responseData as IApiResponse;
19
+ }
20
+
21
+ export async function deleteUomGroup(id: number): Promise<IApiResponse> {
22
+ const response = await sendRequest({ url: `${BASE}/${id}`, method: "DELETE" });
23
+ return response.responseData as IApiResponse;
24
+ }
@@ -0,0 +1,29 @@
1
+ import { sendRequest, IApiResponse } from "@apptimate/core-lib";
2
+
3
+ const BASE = `${process.env.NEXT_PUBLIC_API_URL}/api/inventory/uom`;
4
+
5
+ export async function getUoms(params: Record<string, string | number> = {}): Promise<IApiResponse> {
6
+ const queryParams = new URLSearchParams(params as Record<string, string>).toString();
7
+ const response = await sendRequest({ url: `${BASE}${queryParams ? `?${queryParams}` : ""}`, method: "GET" });
8
+ return response.responseData as IApiResponse;
9
+ }
10
+
11
+ export async function createUom(data: any): Promise<IApiResponse> {
12
+ const response = await sendRequest({ url: BASE, method: "POST", data });
13
+ return response.responseData as IApiResponse;
14
+ }
15
+
16
+ export async function updateUom(id: number, data: any): Promise<IApiResponse> {
17
+ const response = await sendRequest({ url: `${BASE}/${id}`, method: "PUT", data });
18
+ return response.responseData as IApiResponse;
19
+ }
20
+
21
+ export async function deleteUom(id: number): Promise<IApiResponse> {
22
+ const response = await sendRequest({ url: `${BASE}/${id}`, method: "DELETE" });
23
+ return response.responseData as IApiResponse;
24
+ }
25
+
26
+ export async function lookupUoms(): Promise<IApiResponse> {
27
+ const response = await sendRequest({ url: `${BASE}/lookup`, method: "GET" });
28
+ return response.responseData as IApiResponse;
29
+ }
@@ -88,9 +88,10 @@ export const MENU_ITEM_REGISTRY: RegistryItem[] = [
88
88
 
89
89
  { key: 'inventory__stock', label: 'Stock Overview', path: '/inventory/stock', module: 'Inventory', defaultGroup: 'Stock', permission: null },
90
90
  { key: 'inventory__ledger', label: 'Stock Movements', path: '/inventory/ledger', module: 'Inventory', defaultGroup: 'Stock', permission: null },
91
+ { key: 'inventory__opening_stock', label: 'Opening Stock', path: '/inventory/opening-stocks', module: 'Inventory', defaultGroup: 'Operations', permission: 'inventory.opening_stock.view' },
91
92
  { key: 'inventory__adjustments', label: 'Adjustments', path: '/inventory/adjustments', module: 'Inventory', defaultGroup: 'Operations', permission: null },
92
93
  { key: 'inventory__transfers', label: 'Transfers', path: '/inventory/transfers', module: 'Inventory', defaultGroup: 'Operations', permission: null },
93
- { key: 'inventory__serials', label: 'Serial Numbers', path: '/inventory/serials', module: 'Inventory', defaultGroup: 'Operations', permission: null },
94
+ { key: 'inventory__serials', label: 'Serial Numbers', path: '/inventory/serials', module: 'Inventory', defaultGroup: 'Stock', permission: null },
94
95
 
95
96
  // ── Sales Module ──
96
97
  { key: 'sales__price_lists', label: 'Price Lists', path: '/sales/price-lists', module: 'Sales', defaultGroup: 'Master Data', permission: null },
@@ -317,7 +318,7 @@ export const MENU_PRESETS: MenuPreset[] = [
317
318
  secondaryItems: [
318
319
  'inventory__items', 'inventory__categories', 'inventory__brands', 'inventory__uom',
319
320
  'inventory__stock', 'inventory__ledger',
320
- 'inventory__adjustments', 'inventory__transfers', 'inventory__serials',
321
+ 'inventory__opening_stock', 'inventory__adjustments', 'inventory__transfers', 'inventory__serials',
321
322
  ],
322
323
  },
323
324
  {
package/src/index.ts CHANGED
@@ -1,3 +1,12 @@
1
1
  // Default entry point — client-safe (no 'use server' modules)
2
2
  // For server components/actions, import from '@apptimate/core-lib/src/server'
3
- export * from './client';
3
+ export * from './client';
4
+ // Inventory API Services
5
+ export * from './api-services/inventory/inventory-settings.client';
6
+ export * from './api-services/inventory/items.client';
7
+ export * from './api-services/inventory/categories.client';
8
+ export * from './api-services/inventory/brands.client';
9
+ export * from './api-services/inventory/uom.client';
10
+ export * from './api-services/inventory/uom-group.client';
11
+ export * from './api-services/inventory/parties.client';
12
+ export * from './api-services/inventory/transaction.client';