-
{{ t('nav.companyName') }}
-
{{ t('nav.subtitle') }}
+
+
+
+
+
+
+
+
+
`,
+ box: ``,
+ list: ``,
+ dollarSign: ``,
+ trendingUp: ``,
+ cart: ``,
+ barChart: ``
+}
+
export default {
name: 'App',
components: {
@@ -80,6 +110,7 @@ export default {
const showProfileDetails = ref(false)
const showTasks = ref(false)
const apiTasks = ref([])
+ const brandInitial = computed(() => t('nav.companyName').charAt(0))
// Merge mock tasks from currentUser with API tasks
const tasks = computed(() => {
@@ -150,6 +181,8 @@ export default {
return {
t,
+ icons,
+ brandInitial,
showProfileDetails,
showTasks,
tasks,
@@ -162,6 +195,49 @@ export default {
diff --git a/client/src/locales/en.js b/client/src/locales/en.js
index 03a58fe6e..5ac289854 100644
--- a/client/src/locales/en.js
+++ b/client/src/locales/en.js
@@ -6,6 +6,7 @@ export default {
orders: 'Orders',
finance: 'Finance',
demandForecast: 'Demand Forecast',
+ restocking: 'Restocking',
companyName: 'Catalyst Components',
subtitle: 'Inventory Management System'
},
@@ -106,12 +107,14 @@ export default {
title: 'Orders',
description: 'View and manage customer orders',
allOrders: 'All Orders',
+ submittedOrders: 'Submitted Orders',
totalOrders: 'Total Orders',
totalRevenue: 'Total Revenue',
avgOrderValue: 'Avg Order Value',
onTimeDelivery: 'On-Time Delivery',
itemsCount: '{count} items',
quantity: 'Qty',
+ days: 'days',
table: {
orderNumber: 'Order Number',
orderId: 'Order ID',
@@ -125,7 +128,8 @@ export default {
totalValue: 'Total Value',
status: 'Status',
expectedDelivery: 'Expected Delivery',
- actualDelivery: 'Actual Delivery'
+ actualDelivery: 'Actual Delivery',
+ leadTime: 'Lead Time'
}
},
@@ -188,6 +192,53 @@ export default {
}
},
+ // Restocking
+ restocking: {
+ title: 'Restocking',
+ description: 'Set a budget and get demand-driven restock recommendations',
+ budgetLabel: 'Available Budget',
+ recommendations: 'Recommended Items',
+ table: {
+ sku: 'SKU',
+ itemName: 'Item Name',
+ demandGap: 'Demand Gap',
+ unitCost: 'Unit Cost',
+ quantity: 'Recommended Qty',
+ subtotal: 'Subtotal'
+ },
+ totalCost: 'Total Cost',
+ remainingBudget: 'Remaining Budget',
+ placeOrder: 'Place Order',
+ placingOrder: 'Placing Order...',
+ noRecommendations: 'No items to restock at this budget',
+ orderSubmitted: 'Order {orderNumber} submitted — view it in the Orders tab'
+ },
+
+ // Purchase Order Modal
+ purchaseOrder: {
+ createTitle: 'Create Purchase Order',
+ viewTitle: 'Purchase Order Details',
+ itemLabel: 'Item',
+ skuLabel: 'SKU',
+ shortageLabel: 'Shortage',
+ supplierName: 'Supplier Name',
+ supplierNamePlaceholder: 'Enter supplier name...',
+ quantity: 'Quantity',
+ unitCost: 'Unit Cost',
+ totalCost: 'Total Cost',
+ expectedDeliveryDate: 'Expected Delivery Date',
+ notes: 'Notes',
+ notesPlaceholder: 'Optional notes...',
+ submit: 'Create Purchase Order',
+ submitting: 'Creating...',
+ createError: 'Failed to create purchase order',
+ loading: 'Loading purchase order...',
+ notFound: 'No purchase order found for this item',
+ supplier: 'Supplier',
+ status: 'Status',
+ createdDate: 'Created Date'
+ },
+
// Filters
filters: {
timePeriod: 'Time Period',
@@ -204,6 +255,7 @@ export default {
shipped: 'Shipped',
processing: 'Processing',
backordered: 'Backordered',
+ submitted: 'Submitted',
inStock: 'In Stock',
lowStock: 'Low Stock',
adequate: 'Adequate'
diff --git a/client/src/locales/ja.js b/client/src/locales/ja.js
index db33223ac..d4b898c17 100644
--- a/client/src/locales/ja.js
+++ b/client/src/locales/ja.js
@@ -6,6 +6,7 @@ export default {
orders: '注文',
finance: '財務',
demandForecast: '需要予測',
+ restocking: '補充',
companyName: '触媒コンポーネンツ',
subtitle: '在庫管理システム'
},
@@ -106,12 +107,14 @@ export default {
title: '注文',
description: '顧客注文の表示と管理',
allOrders: 'すべての注文',
+ submittedOrders: '提出済み注文',
totalOrders: '総注文数',
totalRevenue: '総収益',
avgOrderValue: '平均注文額',
onTimeDelivery: '定時配達',
itemsCount: '{count}件',
quantity: '数量',
+ days: '日',
table: {
orderNumber: '注文番号',
orderId: '注文ID',
@@ -125,7 +128,8 @@ export default {
totalValue: '合計金額',
status: 'ステータス',
expectedDelivery: '予定配達日',
- actualDelivery: '実際の配達日'
+ actualDelivery: '実際の配達日',
+ leadTime: 'リードタイム'
}
},
@@ -188,6 +192,53 @@ export default {
}
},
+ // Restocking
+ restocking: {
+ title: '補充',
+ description: '予算を設定し、需要に基づいた補充提案を確認する',
+ budgetLabel: '利用可能な予算',
+ recommendations: '推奨品目',
+ table: {
+ sku: 'SKU',
+ itemName: '品目名',
+ demandGap: '需要ギャップ',
+ unitCost: '単価',
+ quantity: '推奨数量',
+ subtotal: '小計'
+ },
+ totalCost: '合計コスト',
+ remainingBudget: '残り予算',
+ placeOrder: '注文する',
+ placingOrder: '注文中...',
+ noRecommendations: 'この予算では補充する品目がありません',
+ orderSubmitted: '注文{orderNumber}が提出されました — 注文タブでご確認ください'
+ },
+
+ // Purchase Order Modal
+ purchaseOrder: {
+ createTitle: '発注書を作成',
+ viewTitle: '発注書の詳細',
+ itemLabel: '品目',
+ skuLabel: 'SKU',
+ shortageLabel: '不足数',
+ supplierName: 'サプライヤー名',
+ supplierNamePlaceholder: 'サプライヤー名を入力...',
+ quantity: '数量',
+ unitCost: '単価',
+ totalCost: '合計コスト',
+ expectedDeliveryDate: '納品予定日',
+ notes: '備考',
+ notesPlaceholder: '備考(任意)...',
+ submit: '発注書を作成',
+ submitting: '作成中...',
+ createError: '発注書の作成に失敗しました',
+ loading: '発注書を読み込み中...',
+ notFound: 'この品目の発注書が見つかりません',
+ supplier: 'サプライヤー',
+ status: 'ステータス',
+ createdDate: '作成日'
+ },
+
// Filters
filters: {
timePeriod: '期間',
@@ -204,6 +255,7 @@ export default {
shipped: '出荷済み',
processing: '処理中',
backordered: 'バックオーダー',
+ submitted: '提出済み',
inStock: '在庫あり',
lowStock: '在庫僅少',
adequate: '適量'
diff --git a/client/src/main.js b/client/src/main.js
index 477c2d966..cea203940 100644
--- a/client/src/main.js
+++ b/client/src/main.js
@@ -5,6 +5,7 @@ import Dashboard from './views/Dashboard.vue'
import Inventory from './views/Inventory.vue'
import Orders from './views/Orders.vue'
import Demand from './views/Demand.vue'
+import Restocking from './views/Restocking.vue'
import Spending from './views/Spending.vue'
import Reports from './views/Reports.vue'
@@ -15,6 +16,7 @@ const router = createRouter({
{ path: '/inventory', component: Inventory },
{ path: '/orders', component: Orders },
{ path: '/demand', component: Demand },
+ { path: '/restocking', component: Restocking },
{ path: '/spending', component: Spending },
{ path: '/reports', component: Reports }
]
diff --git a/client/src/views/Dashboard.vue b/client/src/views/Dashboard.vue
index 437da9c23..6c5c5539b 100644
--- a/client/src/views/Dashboard.vue
+++ b/client/src/views/Dashboard.vue
@@ -147,10 +147,9 @@
{{ translateCategory(cat.name) }}
-
- {{ selectedCurrency === 'JPY' ? formatCurrency(cat.value, selectedCurrency) : `$${(cat.value / 1000).toFixed(1)}K` }}
-
+
+
{{ selectedCurrency === 'JPY' ? formatCurrency(cat.value, selectedCurrency) : `$${(cat.value / 1000).toFixed(1)}K` }}
{{ t('dashboard.inventoryShortages.noData') }}
@@ -304,12 +303,14 @@ import { useI18n } from '../composables/useI18n'
import { formatCurrency } from '../utils/currency'
import ProductDetailModal from '../components/ProductDetailModal.vue'
import BacklogDetailModal from '../components/BacklogDetailModal.vue'
+import PurchaseOrderModal from '../components/PurchaseOrderModal.vue'
export default {
name: 'Dashboard',
components: {
ProductDetailModal,
BacklogDetailModal,
+ PurchaseOrderModal,
},
setup() {
const { t, currentCurrency, translateProductName, translateWarehouse } = useI18n()
@@ -985,17 +986,17 @@ export default {
.h-bar {
height: 100%;
- display: flex;
- align-items: center;
- justify-content: flex-end;
- padding-right: 0.75rem;
transition: width 0.6s ease;
}
.h-bar-value {
+ width: 90px;
+ min-width: 90px;
+ text-align: right;
+ flex-shrink: 0;
font-size: 0.813rem;
font-weight: 700;
- color: white;
+ color: #0f172a;
}
.line-chart {
diff --git a/client/src/views/Orders.vue b/client/src/views/Orders.vue
index 7413f6e66..2bc0d69c8 100644
--- a/client/src/views/Orders.vue
+++ b/client/src/views/Orders.vue
@@ -74,6 +74,51 @@