diff --git a/src/layout/AppMenu.vue b/src/layout/AppMenu.vue index 73d61b9..474345e 100644 --- a/src/layout/AppMenu.vue +++ b/src/layout/AppMenu.vue @@ -9,19 +9,26 @@ const model = ref([ items: [{ label: 'داشبورد', icon: 'pi pi-fw pi-home', to: '/' }] }, { - label: 'مدیریت اموال', + label: 'مدیریت املاک', items: [ - { label: 'ایجاد اموال', icon: 'pi pi-fw pi-file-plus', to: '/belonging/create-belonging' }, - { label: 'لیست اموال', icon: 'pi pi-fw pi-file', to: '/belonging/list-belongings' }, - { label: 'لیست تراکنش اموال', icon: 'pi pi-list-check', to: '/transactions/list-transactions' } + { label: 'ایجاد ملک', icon: 'pi pi-fw pi-file-plus', to: '/property/create-property' }, + { label: 'لیست املاک', icon: 'pi pi-fw pi-file', to: '/property/list-properties' } ] }, { - label: 'دسته بندی اموال', + label: 'دسته بندی املاک', items: [ { label: 'لیست دسته بندی ها', icon: 'pi pi-fw pi-th-large', to: '/categories/list-categories' }, { label: 'ویژگی دسته بندی ها', icon: 'pi pi-fw pi-sitemap', to: '/features/list-features' } ] + }, + { + label: 'مدیریت انبار', + items: [ + { label: 'اقلام انبار', icon: 'pi pi-fw pi-box', to: '/warehouse-items/list' }, + { label: 'تراکنش‌های انبار', icon: 'pi pi-fw pi-history', to: '/warehouse-items/transactions' }, + { label: 'مکان‌های انبار', icon: 'pi pi-fw pi-map', to: '/warehouse-items/warehouses' } + ] } ]); diff --git a/src/router/index.js b/src/router/index.js index 55ea009..e69a695 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -38,20 +38,41 @@ const router = createRouter({ name: 'dashboard', component: () => import('@/views/Dashboard.vue') }, + { + path: '/property/create-property', + name: 'create-property', + component: () => import('@/views/pages/Property/CreateProperty.vue') + }, + { + path: '/property/edit-property/:propertyId', + name: 'edit-property', + component: () => import('@/views/pages/Property/CreateProperty.vue') + }, + { + path: '/property/list-properties', + name: 'list-properties', + component: () => import('@/views/pages/Property/CreateProperty.vue') + }, + // Aliases for backward compatibility { path: '/belonging/create-belonging', name: 'create-belonging', - component: () => import('@/views/pages/Belonging/CreateBelonging.vue') + component: () => import('@/views/pages/Property/CreateProperty.vue') }, { path: '/belonging/edit-belonging/:belongingId', name: 'edit-belonging', - component: () => import('@/views/pages/Belonging/CreateBelonging.vue') + component: () => import('@/views/pages/Property/CreateProperty.vue') }, { path: '/belonging/list-belongings', name: 'list-belongings', - component: () => import('@/views/pages/Belonging/ListBelongings.vue') + component: () => import('@/views/pages/Property/ListProperties.vue') + }, + { + path: '/property/list-properties', + name: 'list-properties-main', + component: () => import('@/views/pages/Property/ListProperties.vue') }, { path: '/categories/list-categories', @@ -68,6 +89,27 @@ const router = createRouter({ name: 'list-transactions', component: () => import('@/views/pages/Transaction/ListTransactions.vue') }, + // ─── Warehouse Items ────────────────────────────────────────── + { + path: '/warehouse-items/list', + name: 'list-warehouse-items', + component: () => import('@/views/pages/WarehouseItems/ListWarehouseItems.vue') + }, + { + path: '/warehouse-items/stock/:itemId', + name: 'warehouse-item-stock', + component: () => import('@/views/pages/WarehouseItems/WarehouseItemStockView.vue') + }, + { + path: '/warehouse-items/transactions', + name: 'warehouse-item-transactions', + component: () => import('@/views/pages/WarehouseItems/ListWarehouseItemTransactions.vue') + }, + { + path: '/warehouse-items/warehouses', + name: 'list-warehouses', + component: () => import('@/views/pages/WarehouseItems/ListWarehouses.vue') + }, { path: '/uikit/formlayout', name: 'formlayout', diff --git a/src/service/WarehouseItemService.js b/src/service/WarehouseItemService.js new file mode 100644 index 0000000..1ca7f6b --- /dev/null +++ b/src/service/WarehouseItemService.js @@ -0,0 +1,102 @@ +import axios from 'axios'; + +const getAuthHeader = () => { + const bmToken = document.cookie + .split('; ') + .find((row) => row.startsWith('bm-token=')) + ?.split('=')[1]; + return { Authorization: `Bearer ${bmToken}` }; +}; + +export const WarehouseItemService = { + // ─── Items ──────────────────────────────────────────────────────────────── + listItems: async (params = {}) => { + const response = await axios.get('/api/warehouse-items/admin/items', { + params, + withCredentials: true, + headers: getAuthHeader() + }); + return response.data; + }, + + createItem: async (data) => { + const response = await axios.post('/api/warehouse-items/admin/items', data, { + withCredentials: true, + headers: getAuthHeader() + }); + return response.data.data; + }, + + getItem: async (itemId) => { + const response = await axios.get(`/api/warehouse-items/admin/items/${itemId}`, { + withCredentials: true, + headers: getAuthHeader() + }); + return response.data.data; + }, + + updateItem: async (itemId, data) => { + const response = await axios.patch(`/api/warehouse-items/admin/items/${itemId}`, data, { + withCredentials: true, + headers: getAuthHeader() + }); + return response.data.data; + }, + + deleteItem: async (itemId) => { + await axios.delete(`/api/warehouse-items/admin/items/${itemId}`, { + withCredentials: true, + headers: getAuthHeader() + }); + }, + + // ─── Transactions ───────────────────────────────────────────────────────── + listTransactions: async (params = {}) => { + const response = await axios.get('/api/warehouse-items/admin/transactions', { + params, + withCredentials: true, + headers: getAuthHeader() + }); + return response.data; + }, + + createTransaction: async (data) => { + const response = await axios.post('/api/warehouse-items/admin/transactions', data, { + withCredentials: true, + headers: getAuthHeader() + }); + return response.data.data; + }, + + deleteTransaction: async (transactionId) => { + await axios.delete(`/api/warehouse-items/admin/transactions/${transactionId}`, { + withCredentials: true, + headers: getAuthHeader() + }); + }, + + // ─── Stock ──────────────────────────────────────────────────────────────── + getTotalStock: async () => { + const response = await axios.get('/api/warehouse-items/admin/stock/total', { + withCredentials: true, + headers: getAuthHeader() + }); + return response.data.data; + }, + + getStockByItem: async (itemId) => { + const response = await axios.get(`/api/warehouse-items/admin/stock/by-item/${itemId}`, { + withCredentials: true, + headers: getAuthHeader() + }); + return response.data.data; + }, + + getStockByWarehouse: async (warehouseId) => { + const response = await axios.get(`/api/warehouse-items/admin/stock/by-warehouse/${warehouseId}`, { + withCredentials: true, + headers: getAuthHeader() + }); + return response.data.data; + } +}; diff --git a/src/service/WarehouseService.js b/src/service/WarehouseService.js new file mode 100644 index 0000000..57993e3 --- /dev/null +++ b/src/service/WarehouseService.js @@ -0,0 +1,51 @@ +import axios from 'axios'; + +const getAuthHeader = () => { + const bmToken = document.cookie + .split('; ') + .find((row) => row.startsWith('bm-token=')) + ?.split('=')[1]; + return { Authorization: `Bearer ${bmToken}` }; +}; + +export const WarehouseService = { + listWarehouses: async (params = {}) => { + const response = await axios.get('/api/warehouses/admin/get-all', { + params, + withCredentials: true, + headers: getAuthHeader() + }); + return response.data.data; + }, + + createWarehouse: async (data) => { + const response = await axios.post('/api/warehouses/admin/create', data, { + withCredentials: true, + headers: getAuthHeader() + }); + return response.data.data; + }, + + getWarehouse: async (warehouseId) => { + const response = await axios.get(`/api/warehouses/admin/get-one/${warehouseId}`, { + withCredentials: true, + headers: getAuthHeader() + }); + return response.data.data; + }, + + updateWarehouse: async (warehouseId, data) => { + const response = await axios.patch(`/api/warehouses/admin/update/${warehouseId}`, data, { + withCredentials: true, + headers: getAuthHeader() + }); + return response.data.data; + }, + + deleteWarehouse: async (warehouseId) => { + await axios.delete(`/api/warehouses/admin/delete/${warehouseId}`, { + withCredentials: true, + headers: getAuthHeader() + }); + } +}; diff --git a/src/views/pages/WarehouseItems/ListWarehouseItemTransactions.vue b/src/views/pages/WarehouseItems/ListWarehouseItemTransactions.vue new file mode 100644 index 0000000..6ee9173 --- /dev/null +++ b/src/views/pages/WarehouseItems/ListWarehouseItemTransactions.vue @@ -0,0 +1,353 @@ + + + + + diff --git a/src/views/pages/WarehouseItems/ListWarehouseItems.vue b/src/views/pages/WarehouseItems/ListWarehouseItems.vue new file mode 100644 index 0000000..07fb302 --- /dev/null +++ b/src/views/pages/WarehouseItems/ListWarehouseItems.vue @@ -0,0 +1,537 @@ + + +