@nice2dev/ui-erp 1.0.12 → 1.0.15

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/NiceResourceAllocation.tsx","../src/NiceInventoryManager.tsx","../src/NiceInvoiceView.tsx","../src/NiceWarehouseView.tsx","../src/NicePurchaseOrder.tsx","../src/NiceHRDashboard.tsx","../src/useMockErpApi.ts","../src/NiceVatTable.tsx","../src/NiceJpkExporter.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/click-events-have-key-events -- modal overlay backdrops (Esc-on-parent provides keyboard close), selection rows in .map() accompanied by visible cursor:pointer styling and sibling buttons; full keyboard migration via useAccessibleClick + extracted subcomponents tracked in TODO_1.0.10 A2.3 */\r\n/**\r\n * @component NiceResourceAllocation\r\n * @description Resource allocation and capacity planning grid\r\n * @package @nice2dev/ui-erp\r\n */\r\n\r\nimport React, { useState, useMemo, useCallback } from 'react';\r\n\r\nimport type {\r\n NiceResourceAllocationProps,\r\n Allocation,\r\n AllocationViewConfig,\r\n TimeUnit,\r\n ResourceUtilization,\r\n AllocationConflict,\r\n} from './types';\r\n\r\nconst DEFAULT_VIEW_CONFIG: AllocationViewConfig = {\r\n timeUnit: 'day',\r\n showUtilization: true,\r\n showConflicts: true,\r\n groupBy: 'resource',\r\n utilizationThreshold: 80,\r\n};\r\n\r\nconst TIME_INCREMENTS: Record<TimeUnit, number> = {\r\n hour: 60 * 60 * 1000,\r\n day: 24 * 60 * 60 * 1000,\r\n week: 7 * 24 * 60 * 60 * 1000,\r\n month: 30 * 24 * 60 * 60 * 1000,\r\n quarter: 90 * 24 * 60 * 60 * 1000,\r\n year: 365 * 24 * 60 * 60 * 1000,\r\n};\r\n\r\nexport const NiceResourceAllocation: React.FC<NiceResourceAllocationProps> = ({\r\n resources,\r\n allocations,\r\n dateRange,\r\n viewConfig: externalConfig,\r\n onAllocationCreate,\r\n onAllocationUpdate,\r\n onAllocationDelete,\r\n onResourceClick,\r\n readOnly = false,\r\n className = '',\r\n}) => {\r\n void onAllocationUpdate;\r\n const config = { ...DEFAULT_VIEW_CONFIG, ...externalConfig };\r\n\r\n const [selectedAllocation, setSelectedAllocation] = useState<string | null>(null);\r\n const [hoveredCell, setHoveredCell] = useState<{ resourceId: string; date: Date } | null>(null);\r\n const [timeUnit, setTimeUnit] = useState<TimeUnit>(config.timeUnit);\r\n const [expandedResources, setExpandedResources] = useState<Set<string>>(\r\n new Set(resources.map((r) => r.id)),\r\n );\r\n const [showAllocationModal, setShowAllocationModal] = useState(false);\r\n const [newAllocation, setNewAllocation] = useState<Partial<Allocation>>({});\r\n\r\n // Generate time periods\r\n const timePeriods = useMemo(() => {\r\n const periods: Date[] = [];\r\n const increment = TIME_INCREMENTS[timeUnit];\r\n let current = new Date(dateRange.start);\r\n\r\n while (current <= dateRange.end) {\r\n periods.push(new Date(current));\r\n current = new Date(current.getTime() + increment);\r\n }\r\n\r\n return periods;\r\n }, [dateRange.start, dateRange.end, timeUnit]);\r\n\r\n // Calculate utilization per resource per period\r\n const utilizationMap = useMemo(() => {\r\n const map = new Map<string, Map<number, ResourceUtilization>>();\r\n\r\n resources.forEach((resource) => {\r\n const resourceMap = new Map<number, ResourceUtilization>();\r\n\r\n timePeriods.forEach((period) => {\r\n const periodStart = period.getTime();\r\n const periodEnd = periodStart + TIME_INCREMENTS[timeUnit];\r\n\r\n // Find allocations overlapping this period\r\n const periodAllocations = allocations.filter((a) => {\r\n if (a.resourceId !== resource.id) {\r\n return false;\r\n }\r\n const allocStart = a.start.getTime();\r\n const allocEnd = a.end.getTime();\r\n return allocStart < periodEnd && allocEnd > periodStart;\r\n });\r\n\r\n const allocatedHours = periodAllocations.reduce((sum, a) => sum + a.hoursPerDay, 0);\r\n const availableHours = resource.maxCapacity;\r\n const utilizationPercent = availableHours > 0 ? (allocatedHours / availableHours) * 100 : 0;\r\n\r\n resourceMap.set(periodStart, {\r\n resourceId: resource.id,\r\n period: { start: period, end: new Date(periodEnd) },\r\n allocatedHours,\r\n availableHours,\r\n utilizationPercent,\r\n overallocated: utilizationPercent > 100,\r\n });\r\n });\r\n\r\n map.set(resource.id, resourceMap);\r\n });\r\n\r\n return map;\r\n }, [resources, allocations, timePeriods, timeUnit]);\r\n\r\n // Find conflicts\r\n const conflicts = useMemo(() => {\r\n const conflictList: AllocationConflict[] = [];\r\n\r\n utilizationMap.forEach((resourceMap, resourceId) => {\r\n const resource = resources.find((r) => r.id === resourceId)!;\r\n resourceMap.forEach((util, periodStart) => {\r\n if (util.overallocated) {\r\n const period = new Date(periodStart);\r\n const periodEnd = periodStart + TIME_INCREMENTS[timeUnit];\r\n const conflictAllocations = allocations.filter((a) => {\r\n if (a.resourceId !== resourceId) {\r\n return false;\r\n }\r\n const allocStart = a.start.getTime();\r\n const allocEnd = a.end.getTime();\r\n return allocStart < periodEnd && allocEnd > periodStart;\r\n });\r\n\r\n conflictList.push({\r\n resourceId,\r\n date: period,\r\n allocatedHours: util.allocatedHours,\r\n maxCapacity: resource.maxCapacity,\r\n allocations: conflictAllocations,\r\n });\r\n }\r\n });\r\n });\r\n\r\n return conflictList;\r\n }, [utilizationMap, allocations, resources, timeUnit]);\r\n\r\n // Get allocations for a cell\r\n const getCellAllocations = useCallback(\r\n (resourceId: string, date: Date): Allocation[] => {\r\n const periodStart = date.getTime();\r\n const periodEnd = periodStart + TIME_INCREMENTS[timeUnit];\r\n\r\n return allocations.filter((a) => {\r\n if (a.resourceId !== resourceId) {\r\n return false;\r\n }\r\n const allocStart = a.start.getTime();\r\n const allocEnd = a.end.getTime();\r\n return allocStart < periodEnd && allocEnd > periodStart;\r\n });\r\n },\r\n [allocations, timeUnit],\r\n );\r\n\r\n // Get cell color based on utilization\r\n const getCellColor = (resourceId: string, date: Date): string => {\r\n const util = utilizationMap.get(resourceId)?.get(date.getTime());\r\n if (!util) {\r\n return 'transparent';\r\n }\r\n\r\n if (util.overallocated) {\r\n return 'var(--nice-danger-tint-40, rgba(239, 68, 68, 0.4))';\r\n }\r\n if (util.utilizationPercent >= config.utilizationThreshold) {\r\n return 'var(--nice-warning-tint-30, rgba(245, 158, 11, 0.3))';\r\n }\r\n if (util.utilizationPercent > 0) {\r\n return 'var(--nice-success-tint-20, rgba(34, 197, 94, 0.2))';\r\n }\r\n return 'transparent';\r\n };\r\n\r\n const formatDate = (date: Date): string => {\r\n switch (timeUnit) {\r\n case 'hour':\r\n return date.toLocaleTimeString([], { hour: '2-digit' });\r\n case 'day':\r\n return date.toLocaleDateString([], { weekday: 'short', day: 'numeric' });\r\n case 'week':\r\n return `W${Math.ceil(date.getDate() / 7)}`;\r\n case 'month':\r\n return date.toLocaleDateString([], { month: 'short' });\r\n default:\r\n return date.toLocaleDateString();\r\n }\r\n };\r\n\r\n const handleCellClick = (resourceId: string, date: Date) => {\r\n if (readOnly) {\r\n return;\r\n }\r\n\r\n setNewAllocation({\r\n resourceId,\r\n start: date,\r\n end: new Date(date.getTime() + TIME_INCREMENTS[timeUnit]),\r\n hoursPerDay: resources.find((r) => r.id === resourceId)?.maxCapacity || 8,\r\n status: 'tentative',\r\n });\r\n setShowAllocationModal(true);\r\n };\r\n\r\n const handleCreateAllocation = () => {\r\n if (newAllocation.resourceId && newAllocation.start && newAllocation.end) {\r\n onAllocationCreate?.({\r\n resourceId: newAllocation.resourceId,\r\n start: newAllocation.start,\r\n end: newAllocation.end,\r\n hoursPerDay: newAllocation.hoursPerDay || 8,\r\n status: newAllocation.status || 'tentative',\r\n notes: newAllocation.notes,\r\n });\r\n setShowAllocationModal(false);\r\n setNewAllocation({});\r\n }\r\n };\r\n\r\n const toggleResource = (resourceId: string) => {\r\n setExpandedResources((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(resourceId)) {\r\n next.delete(resourceId);\r\n } else {\r\n next.add(resourceId);\r\n }\r\n return next;\r\n });\r\n };\r\n\r\n const getResourceTypeIcon = (type: string): string => {\r\n switch (type) {\r\n case 'human':\r\n return '👤';\r\n case 'equipment':\r\n return '🔧';\r\n case 'room':\r\n return 'đŸĸ';\r\n case 'vehicle':\r\n return '🚗';\r\n case 'material':\r\n return 'đŸ“Ļ';\r\n default:\r\n return '📋';\r\n }\r\n };\r\n\r\n return (\r\n <div className={`nice-resource-allocation ${className}`}>\r\n {/* Toolbar */}\r\n <header className=\"allocation__toolbar\">\r\n <div className=\"toolbar__left\">\r\n <h2>Resource Allocation</h2>\r\n <span className=\"date-range\">\r\n {dateRange.start.toLocaleDateString()} - {dateRange.end.toLocaleDateString()}\r\n </span>\r\n </div>\r\n <div className=\"toolbar__center\">\r\n <div className=\"time-unit-selector\">\r\n {(['day', 'week', 'month'] as TimeUnit[]).map((unit) => (\r\n <button\r\n key={unit}\r\n className={`unit-button ${timeUnit === unit ? 'unit-button--active' : ''}`}\r\n onClick={() => setTimeUnit(unit)}\r\n >\r\n {unit.charAt(0).toUpperCase() + unit.slice(1)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n <div className=\"toolbar__right\">\r\n {config.showConflicts && conflicts.length > 0 && (\r\n <div className=\"conflicts-badge\">\r\n <span className=\"badge-icon\">âš ī¸</span>\r\n {conflicts.length} Conflict{conflicts.length !== 1 ? 's' : ''}\r\n </div>\r\n )}\r\n </div>\r\n </header>\r\n\r\n {/* Legend */}\r\n <div className=\"allocation__legend\">\r\n <div className=\"legend-item\">\r\n <span className=\"legend-color\" style={{ backgroundColor: 'var(--nice-success-tint-20, rgba(34, 197, 94, 0.2))' }} />\r\n <span>Allocated</span>\r\n </div>\r\n <div className=\"legend-item\">\r\n <span className=\"legend-color\" style={{ backgroundColor: 'var(--nice-warning-tint-30, rgba(245, 158, 11, 0.3))' }} />\r\n <span>\r\n High Utilization ({'>'}={config.utilizationThreshold}%)\r\n </span>\r\n </div>\r\n <div className=\"legend-item\">\r\n <span className=\"legend-color\" style={{ backgroundColor: 'var(--nice-danger-tint-40, rgba(239, 68, 68, 0.4))' }} />\r\n <span>Overallocated</span>\r\n </div>\r\n </div>\r\n\r\n {/* Grid */}\r\n <div className=\"allocation__grid\">\r\n {/* Header Row */}\r\n <div className=\"grid__header\">\r\n <div className=\"resource-header\">Resource</div>\r\n <div className=\"time-headers\">\r\n {timePeriods.map((period, idx) => (\r\n <div key={idx} className=\"time-header\">\r\n {formatDate(period)}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Resource Rows */}\r\n <div className=\"grid__body\">\r\n {resources.map((resource) => (\r\n <div key={resource.id} className=\"resource-row\">\r\n {/* Resource Info */}\r\n <div className=\"resource-cell\" onClick={() => onResourceClick?.(resource)}>\r\n <button\r\n className=\"expand-button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n toggleResource(resource.id);\r\n }}\r\n >\r\n {expandedResources.has(resource.id) ? '▾' : '▸'}\r\n </button>\r\n <span className=\"resource-icon\">{getResourceTypeIcon(resource.type)}</span>\r\n <div className=\"resource-info\">\r\n <span className=\"resource-name\">{resource.name}</span>\r\n {resource.department && (\r\n <span className=\"resource-dept\">{resource.department}</span>\r\n )}\r\n </div>\r\n <span className=\"resource-capacity\">{resource.maxCapacity}h/day</span>\r\n </div>\r\n\r\n {/* Time Cells */}\r\n <div className=\"time-cells\">\r\n {timePeriods.map((period, idx) => {\r\n const cellAllocations = getCellAllocations(resource.id, period);\r\n const util = utilizationMap.get(resource.id)?.get(period.getTime());\r\n const isHovered =\r\n hoveredCell?.resourceId === resource.id &&\r\n hoveredCell?.date.getTime() === period.getTime();\r\n\r\n return (\r\n <div\r\n key={idx}\r\n className={`time-cell ${isHovered ? 'time-cell--hovered' : ''}`}\r\n style={{ backgroundColor: getCellColor(resource.id, period) }}\r\n onClick={() => handleCellClick(resource.id, period)}\r\n onMouseEnter={() => setHoveredCell({ resourceId: resource.id, date: period })}\r\n onMouseLeave={() => setHoveredCell(null)}\r\n >\r\n {cellAllocations.length > 0 && (\r\n <div className=\"allocation-indicators\">\r\n {cellAllocations.slice(0, 2).map((alloc) => (\r\n <div\r\n key={alloc.id}\r\n className={`allocation-dot ${alloc.status}`}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setSelectedAllocation(alloc.id);\r\n }}\r\n />\r\n ))}\r\n {cellAllocations.length > 2 && (\r\n <span className=\"more-indicator\">+{cellAllocations.length - 2}</span>\r\n )}\r\n </div>\r\n )}\r\n\r\n {config.showUtilization && util && util.allocatedHours > 0 && (\r\n <span className=\"utilization-label\">{util.allocatedHours.toFixed(1)}h</span>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n {/* Expanded Allocations */}\r\n {expandedResources.has(resource.id) && (\r\n <div className=\"expanded-allocations\">\r\n {allocations\r\n .filter((a) => a.resourceId === resource.id)\r\n .map((allocation) => {\r\n const startIdx = timePeriods.findIndex(\r\n (p) => p.getTime() <= allocation.start.getTime(),\r\n );\r\n const endIdx = timePeriods.findIndex(\r\n (p) => p.getTime() >= allocation.end.getTime(),\r\n );\r\n\r\n if (startIdx === -1) {\r\n return null;\r\n }\r\n\r\n const span = Math.max(1, endIdx - startIdx);\r\n const leftPercent = (startIdx / timePeriods.length) * 100;\r\n const widthPercent = (span / timePeriods.length) * 100;\r\n\r\n return (\r\n <div\r\n key={allocation.id}\r\n className={`allocation-bar ${allocation.status} ${selectedAllocation === allocation.id ? 'selected' : ''}`}\r\n style={{\r\n left: `${leftPercent}%`,\r\n width: `${widthPercent}%`,\r\n }}\r\n onClick={() => setSelectedAllocation(allocation.id)}\r\n >\r\n <span className=\"allocation-label\">{allocation.hoursPerDay}h/day</span>\r\n {!readOnly && (\r\n <button\r\n className=\"delete-allocation\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onAllocationDelete?.(allocation.id);\r\n }}\r\n >\r\n ×\r\n </button>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Allocation Modal */}\r\n {showAllocationModal && (\r\n <div className=\"modal-overlay\" onClick={() => setShowAllocationModal(false)}>\r\n <div className=\"allocation-modal\" onClick={(e) => e.stopPropagation()}>\r\n <h3>Create Allocation</h3>\r\n <div className=\"modal-form\">\r\n <label>\r\n Resource\r\n <select\r\n value={newAllocation.resourceId || ''}\r\n onChange={(e) =>\r\n setNewAllocation((prev) => ({ ...prev, resourceId: e.target.value }))\r\n }\r\n >\r\n <option value=\"\">Select resource...</option>\r\n {resources.map((r) => (\r\n <option key={r.id} value={r.id}>\r\n {r.name}\r\n </option>\r\n ))}\r\n </select>\r\n </label>\r\n <label>\r\n Start Date\r\n <input\r\n type=\"date\"\r\n value={newAllocation.start?.toISOString().split('T')[0] || ''}\r\n onChange={(e) =>\r\n setNewAllocation((prev) => ({ ...prev, start: new Date(e.target.value) }))\r\n }\r\n />\r\n </label>\r\n <label>\r\n End Date\r\n <input\r\n type=\"date\"\r\n value={newAllocation.end?.toISOString().split('T')[0] || ''}\r\n onChange={(e) =>\r\n setNewAllocation((prev) => ({ ...prev, end: new Date(e.target.value) }))\r\n }\r\n />\r\n </label>\r\n <label>\r\n Hours per Day\r\n <input\r\n type=\"number\"\r\n min=\"0.5\"\r\n max=\"24\"\r\n step=\"0.5\"\r\n value={newAllocation.hoursPerDay || 8}\r\n onChange={(e) =>\r\n setNewAllocation((prev) => ({\r\n ...prev,\r\n hoursPerDay: parseFloat(e.target.value),\r\n }))\r\n }\r\n />\r\n </label>\r\n <label>\r\n Status\r\n <select\r\n value={newAllocation.status || 'tentative'}\r\n onChange={(e) =>\r\n setNewAllocation((prev) => ({\r\n ...prev,\r\n status: e.target.value as Allocation['status'],\r\n }))\r\n }\r\n >\r\n <option value=\"tentative\">Tentative</option>\r\n <option value=\"confirmed\">Confirmed</option>\r\n </select>\r\n </label>\r\n <label>\r\n Notes\r\n <textarea\r\n value={newAllocation.notes || ''}\r\n onChange={(e) => setNewAllocation((prev) => ({ ...prev, notes: e.target.value }))}\r\n placeholder=\"Optional notes...\"\r\n />\r\n </label>\r\n </div>\r\n <div className=\"modal-actions\">\r\n <button className=\"cancel-button\" onClick={() => setShowAllocationModal(false)}>\r\n Cancel\r\n </button>\r\n <button className=\"create-button\" onClick={handleCreateAllocation}>\r\n Create Allocation\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default NiceResourceAllocation;\r\n","/* eslint-disable jsx-a11y/click-events-have-key-events -- modal overlay backdrops (Esc-on-parent provides keyboard close), selection rows in .map() accompanied by visible cursor:pointer styling and sibling buttons; full keyboard migration via useAccessibleClick + extracted subcomponents tracked in TODO_1.0.10 A2.3 */\r\n/**\r\n * @component NiceInventoryManager\r\n * @description Inventory management and stock control interface\r\n * @package @nice2dev/ui-erp\r\n */\r\n\r\nimport React, { useState, useMemo } from 'react';\r\n\r\nimport type {\r\n NiceInventoryManagerProps,\r\n InventoryItem,\r\n InventoryTransaction,\r\n InventoryViewConfig,\r\n InventoryFilters,\r\n InventoryStatus,\r\n TransactionType,\r\n} from './types';\r\n\r\nconst DEFAULT_VIEW_CONFIG: InventoryViewConfig = {\r\n view: 'grid',\r\n sortBy: 'name',\r\n sortOrder: 'asc',\r\n showImages: true,\r\n pageSize: 24,\r\n};\r\n\r\nexport const NiceInventoryManager: React.FC<NiceInventoryManagerProps> = ({\r\n items,\r\n transactions = [],\r\n viewConfig: externalConfig,\r\n onItemCreate,\r\n onItemUpdate,\r\n onItemDelete,\r\n onTransactionCreate,\r\n onStockCount,\r\n onItemClick,\r\n readOnly = false,\r\n className = '',\r\n}) => {\r\n void onStockCount;\r\n const config = { ...DEFAULT_VIEW_CONFIG, ...externalConfig };\r\n\r\n const [filters, setFilters] = useState<InventoryFilters>({});\r\n const [view, setView] = useState<'grid' | 'list' | 'kanban'>(config.view);\r\n const [sortBy, setSortBy] = useState(config.sortBy);\r\n const [sortOrder, setSortOrder] = useState(config.sortOrder);\r\n const [page, setPage] = useState(1);\r\n const [selectedItems, setSelectedItems] = useState<Set<string>>(new Set());\r\n const [showItemModal, setShowItemModal] = useState(false);\r\n const [showTransactionModal, setShowTransactionModal] = useState(false);\r\n const [editingItem, setEditingItem] = useState<Partial<InventoryItem> | null>(null);\r\n const [newTransaction, setNewTransaction] = useState<Partial<InventoryTransaction>>({});\r\n const [activeTab, setActiveTab] = useState<'inventory' | 'transactions' | 'reorder'>('inventory');\r\n\r\n // Get unique categories\r\n const categories = useMemo(() => {\r\n return Array.from(new Set(items.map((item) => item.category))).sort();\r\n }, [items]);\r\n\r\n // Filter and sort items\r\n const filteredItems = useMemo(() => {\r\n let result = [...items];\r\n\r\n // Apply filters\r\n if (filters.searchQuery) {\r\n const query = filters.searchQuery.toLowerCase();\r\n result = result.filter(\r\n (item) =>\r\n item.name.toLowerCase().includes(query) ||\r\n item.sku.toLowerCase().includes(query) ||\r\n item.description?.toLowerCase().includes(query),\r\n );\r\n }\r\n\r\n if (filters.categories?.length) {\r\n result = result.filter((item) => filters.categories!.includes(item.category));\r\n }\r\n\r\n if (filters.statuses?.length) {\r\n result = result.filter((item) => filters.statuses!.includes(item.status));\r\n }\r\n\r\n if (filters.lowStockOnly) {\r\n result = result.filter((item) => item.quantity <= item.reorderLevel);\r\n }\r\n\r\n // Sort\r\n result.sort((a, b) => {\r\n let comparison = 0;\r\n switch (sortBy) {\r\n case 'name':\r\n comparison = a.name.localeCompare(b.name);\r\n break;\r\n case 'sku':\r\n comparison = a.sku.localeCompare(b.sku);\r\n break;\r\n case 'quantity':\r\n comparison = a.quantity - b.quantity;\r\n break;\r\n case 'value':\r\n comparison = a.quantity * a.cost.amount - b.quantity * b.cost.amount;\r\n break;\r\n case 'lastUpdated':\r\n comparison = (a.lastCountDate?.getTime() || 0) - (b.lastCountDate?.getTime() || 0);\r\n break;\r\n }\r\n return sortOrder === 'asc' ? comparison : -comparison;\r\n });\r\n\r\n return result;\r\n }, [items, filters, sortBy, sortOrder]);\r\n\r\n // Paginated items\r\n const paginatedItems = useMemo(() => {\r\n const start = (page - 1) * config.pageSize;\r\n return filteredItems.slice(start, start + config.pageSize);\r\n }, [filteredItems, page, config.pageSize]);\r\n\r\n const totalPages = Math.ceil(filteredItems.length / config.pageSize);\r\n\r\n // Items needing reorder\r\n const reorderItems = useMemo(() => {\r\n return items.filter((item) => item.quantity <= item.reorderLevel);\r\n }, [items]);\r\n\r\n // Recent transactions\r\n const recentTransactions = useMemo(() => {\r\n return [...transactions].sort((a, b) => b.date.getTime() - a.date.getTime()).slice(0, 50);\r\n }, [transactions]);\r\n\r\n // Group items for kanban view\r\n const kanbanGroups = useMemo(() => {\r\n if (view !== 'kanban') {\r\n return null;\r\n }\r\n\r\n const groups = new Map<InventoryStatus, InventoryItem[]>();\r\n const statuses: InventoryStatus[] = [\r\n 'in-stock',\r\n 'low-stock',\r\n 'out-of-stock',\r\n 'on-order',\r\n 'discontinued',\r\n ];\r\n\r\n statuses.forEach((status) => groups.set(status, []));\r\n\r\n filteredItems.forEach((item) => {\r\n groups.get(item.status)?.push(item);\r\n });\r\n\r\n return groups;\r\n }, [filteredItems, view]);\r\n\r\n const getStatusColor = (status: InventoryStatus): string => {\r\n switch (status) {\r\n case 'in-stock':\r\n return 'var(--nice-success, #22c55e)';\r\n case 'low-stock':\r\n return 'var(--nice-warning, #f59e0b)';\r\n case 'out-of-stock':\r\n return 'var(--nice-danger, #ef4444)';\r\n case 'on-order':\r\n return 'var(--nice-primary, #3b82f6)';\r\n case 'discontinued':\r\n return 'var(--nice-text-secondary, #6b7280)';\r\n default:\r\n return 'var(--nice-text-secondary, #6b7280)';\r\n }\r\n };\r\n\r\n const getTransactionIcon = (type: TransactionType): string => {\r\n switch (type) {\r\n case 'receipt':\r\n return 'đŸ“Ĩ';\r\n case 'issue':\r\n return '📤';\r\n case 'transfer':\r\n return '🔄';\r\n case 'adjustment':\r\n return 'âœī¸';\r\n case 'return':\r\n return 'â†Šī¸';\r\n case 'count':\r\n return '📊';\r\n case 'write-off':\r\n return '❌';\r\n default:\r\n return '📋';\r\n }\r\n };\r\n\r\n const formatCurrency = (amount: number, symbol: string = '$'): string => {\r\n return `${symbol}${amount.toFixed(2)}`;\r\n };\r\n\r\n const handleItemSubmit = () => {\r\n if (!editingItem) {\r\n return;\r\n }\r\n\r\n if (editingItem.id) {\r\n onItemUpdate?.(editingItem as InventoryItem);\r\n } else {\r\n onItemCreate?.(editingItem as Omit<InventoryItem, 'id'>);\r\n }\r\n\r\n setShowItemModal(false);\r\n setEditingItem(null);\r\n };\r\n\r\n const handleTransactionSubmit = () => {\r\n if (newTransaction.itemId && newTransaction.type && newTransaction.quantity) {\r\n onTransactionCreate?.({\r\n itemId: newTransaction.itemId,\r\n type: newTransaction.type as TransactionType,\r\n quantity: newTransaction.quantity,\r\n date: new Date(),\r\n reference: newTransaction.reference,\r\n notes: newTransaction.notes,\r\n });\r\n setShowTransactionModal(false);\r\n setNewTransaction({});\r\n }\r\n };\r\n\r\n const toggleItemSelection = (itemId: string) => {\r\n setSelectedItems((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(itemId)) {\r\n next.delete(itemId);\r\n } else {\r\n next.add(itemId);\r\n }\r\n return next;\r\n });\r\n };\r\n\r\n return (\r\n <div className={`nice-inventory-manager ${className}`}>\r\n {/* Toolbar */}\r\n <header className=\"inventory__toolbar\">\r\n <div className=\"toolbar__left\">\r\n <div className=\"search-box\">\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search items...\"\r\n value={filters.searchQuery || ''}\r\n onChange={(e) => setFilters((prev) => ({ ...prev, searchQuery: e.target.value }))}\r\n />\r\n <span className=\"search-icon\">🔍</span>\r\n </div>\r\n <select\r\n value={filters.categories?.[0] || ''}\r\n onChange={(e) =>\r\n setFilters((prev) => ({\r\n ...prev,\r\n categories: e.target.value ? [e.target.value] : undefined,\r\n }))\r\n }\r\n >\r\n <option value=\"\">All Categories</option>\r\n {categories.map((cat) => (\r\n <option key={cat} value={cat}>\r\n {cat}\r\n </option>\r\n ))}\r\n </select>\r\n <label className=\"filter-checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n checked={filters.lowStockOnly || false}\r\n onChange={(e) => setFilters((prev) => ({ ...prev, lowStockOnly: e.target.checked }))}\r\n />\r\n Low Stock Only\r\n </label>\r\n </div>\r\n <div className=\"toolbar__right\">\r\n <div className=\"view-selector\">\r\n {(['grid', 'list', 'kanban'] as const).map((v) => (\r\n <button\r\n key={v}\r\n className={`view-button ${view === v ? 'view-button--active' : ''}`}\r\n onClick={() => setView(v)}\r\n >\r\n {v === 'grid' ? '⊞' : v === 'list' ? '☰' : 'â–Ļ'}\r\n </button>\r\n ))}\r\n </div>\r\n {!readOnly && (\r\n <button\r\n className=\"add-button\"\r\n onClick={() => {\r\n setEditingItem({\r\n category: categories[0],\r\n unit: 'pcs',\r\n quantity: 0,\r\n reorderLevel: 10,\r\n reorderQuantity: 100,\r\n cost: { amount: 0, currency: { code: 'USD', symbol: '$', decimalPlaces: 2 } },\r\n status: 'in-stock',\r\n });\r\n setShowItemModal(true);\r\n }}\r\n >\r\n + Add Item\r\n </button>\r\n )}\r\n </div>\r\n </header>\r\n\r\n {/* Tabs */}\r\n <div className=\"inventory__tabs\">\r\n <button\r\n className={`tab ${activeTab === 'inventory' ? 'tab--active' : ''}`}\r\n onClick={() => setActiveTab('inventory')}\r\n >\r\n Inventory ({items.length})\r\n </button>\r\n <button\r\n className={`tab ${activeTab === 'transactions' ? 'tab--active' : ''}`}\r\n onClick={() => setActiveTab('transactions')}\r\n >\r\n Transactions ({transactions.length})\r\n </button>\r\n <button\r\n className={`tab ${activeTab === 'reorder' ? 'tab--active' : ''}`}\r\n onClick={() => setActiveTab('reorder')}\r\n >\r\n Reorder Alerts\r\n {reorderItems.length > 0 && <span className=\"alert-badge\">{reorderItems.length}</span>}\r\n </button>\r\n </div>\r\n\r\n <div className=\"inventory__content\">\r\n {/* Inventory Tab */}\r\n {activeTab === 'inventory' && (\r\n <>\r\n {/* Grid View */}\r\n {view === 'grid' && (\r\n <div className=\"items-grid\">\r\n {paginatedItems.map((item) => (\r\n <div\r\n key={item.id}\r\n className={`item-card ${selectedItems.has(item.id) ? 'item-card--selected' : ''}`}\r\n onClick={() => onItemClick?.(item)}\r\n >\r\n {!readOnly && (\r\n <input\r\n type=\"checkbox\"\r\n className=\"item-checkbox\"\r\n checked={selectedItems.has(item.id)}\r\n onChange={() => toggleItemSelection(item.id)}\r\n onClick={(e) => e.stopPropagation()}\r\n />\r\n )}\r\n {config.showImages && (\r\n <div className=\"item-image\">\r\n {item.images?.[0] ? (\r\n <img src={item.images[0]} alt={item.name} />\r\n ) : (\r\n <span className=\"placeholder-image\">đŸ“Ļ</span>\r\n )}\r\n </div>\r\n )}\r\n <div className=\"item-info\">\r\n <span className=\"item-sku\">{item.sku}</span>\r\n <h4 className=\"item-name\">{item.name}</h4>\r\n <span className=\"item-category\">{item.category}</span>\r\n </div>\r\n <div className=\"item-stock\">\r\n <span\r\n className=\"status-badge\"\r\n style={{ backgroundColor: getStatusColor(item.status) }}\r\n >\r\n {item.status.replace('-', ' ')}\r\n </span>\r\n <span className=\"quantity\">\r\n {item.quantity} {item.unit}\r\n </span>\r\n {item.quantity <= item.reorderLevel && (\r\n <span className=\"reorder-alert\">âš ī¸ Low Stock</span>\r\n )}\r\n </div>\r\n <div className=\"item-value\">\r\n {formatCurrency(item.quantity * item.cost.amount, item.cost.currency.symbol)}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* List View */}\r\n {view === 'list' && (\r\n <div className=\"items-table\">\r\n <table>\r\n <thead>\r\n <tr>\r\n {!readOnly && <th></th>}\r\n <th\r\n onClick={() => {\r\n setSortBy('sku');\r\n setSortOrder((prev) => (prev === 'asc' ? 'desc' : 'asc'));\r\n }}\r\n >\r\n SKU {sortBy === 'sku' && (sortOrder === 'asc' ? '↑' : '↓')}\r\n </th>\r\n <th\r\n onClick={() => {\r\n setSortBy('name');\r\n setSortOrder((prev) => (prev === 'asc' ? 'desc' : 'asc'));\r\n }}\r\n >\r\n Name {sortBy === 'name' && (sortOrder === 'asc' ? '↑' : '↓')}\r\n </th>\r\n <th>Category</th>\r\n <th\r\n onClick={() => {\r\n setSortBy('quantity');\r\n setSortOrder((prev) => (prev === 'asc' ? 'desc' : 'asc'));\r\n }}\r\n >\r\n Qty {sortBy === 'quantity' && (sortOrder === 'asc' ? '↑' : '↓')}\r\n </th>\r\n <th>Status</th>\r\n <th>Location</th>\r\n <th\r\n onClick={() => {\r\n setSortBy('value');\r\n setSortOrder((prev) => (prev === 'asc' ? 'desc' : 'asc'));\r\n }}\r\n >\r\n Value {sortBy === 'value' && (sortOrder === 'asc' ? '↑' : '↓')}\r\n </th>\r\n {!readOnly && <th>Actions</th>}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {paginatedItems.map((item) => (\r\n <tr\r\n key={item.id}\r\n className={selectedItems.has(item.id) ? 'row--selected' : ''}\r\n onClick={() => onItemClick?.(item)}\r\n >\r\n {!readOnly && (\r\n <td>\r\n <input\r\n type=\"checkbox\"\r\n checked={selectedItems.has(item.id)}\r\n onChange={() => toggleItemSelection(item.id)}\r\n onClick={(e) => e.stopPropagation()}\r\n />\r\n </td>\r\n )}\r\n <td className=\"sku-cell\">{item.sku}</td>\r\n <td>{item.name}</td>\r\n <td>{item.category}</td>\r\n <td className={item.quantity <= item.reorderLevel ? 'low-stock' : ''}>\r\n {item.quantity} {item.unit}\r\n </td>\r\n <td>\r\n <span\r\n className=\"status-badge\"\r\n style={{ backgroundColor: getStatusColor(item.status) }}\r\n >\r\n {item.status.replace('-', ' ')}\r\n </span>\r\n </td>\r\n <td>\r\n {item.location\r\n ? `${item.location.warehouseName}${item.location.aisle ? ` / ${item.location.aisle}` : ''}`\r\n : '-'}\r\n </td>\r\n <td>\r\n {formatCurrency(\r\n item.quantity * item.cost.amount,\r\n item.cost.currency.symbol,\r\n )}\r\n </td>\r\n {!readOnly && (\r\n <td className=\"actions-cell\">\r\n <button\r\n className=\"action-btn\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setEditingItem(item);\r\n setShowItemModal(true);\r\n }}\r\n >\r\n âœī¸\r\n </button>\r\n <button\r\n className=\"action-btn\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setNewTransaction({ itemId: item.id });\r\n setShowTransactionModal(true);\r\n }}\r\n >\r\n 📝\r\n </button>\r\n <button\r\n className=\"action-btn action-btn--danger\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onItemDelete?.(item.id);\r\n }}\r\n >\r\n đŸ—‘ī¸\r\n </button>\r\n </td>\r\n )}\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n\r\n {/* Kanban View */}\r\n {view === 'kanban' && kanbanGroups && (\r\n <div className=\"items-kanban\">\r\n {Array.from(kanbanGroups.entries()).map(([status, statusItems]) => (\r\n <div key={status} className=\"kanban-column\">\r\n <div className=\"column-header\" style={{ borderColor: getStatusColor(status) }}>\r\n <span\r\n className=\"status-dot\"\r\n style={{ backgroundColor: getStatusColor(status) }}\r\n />\r\n <span className=\"column-title\">{status.replace('-', ' ')}</span>\r\n <span className=\"column-count\">{statusItems.length}</span>\r\n </div>\r\n <div className=\"column-items\">\r\n {statusItems.map((item) => (\r\n <div\r\n key={item.id}\r\n className=\"kanban-card\"\r\n onClick={() => onItemClick?.(item)}\r\n >\r\n <span className=\"card-sku\">{item.sku}</span>\r\n <span className=\"card-name\">{item.name}</span>\r\n <span className=\"card-qty\">\r\n {item.quantity} {item.unit}\r\n </span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Pagination */}\r\n {totalPages > 1 && (\r\n <div className=\"pagination\">\r\n <button disabled={page === 1} onClick={() => setPage((p) => p - 1)}>\r\n Previous\r\n </button>\r\n <span>\r\n Page {page} of {totalPages}\r\n </span>\r\n <button disabled={page === totalPages} onClick={() => setPage((p) => p + 1)}>\r\n Next\r\n </button>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n\r\n {/* Transactions Tab */}\r\n {activeTab === 'transactions' && (\r\n <div className=\"transactions-tab\">\r\n {!readOnly && (\r\n <button\r\n className=\"add-transaction-button\"\r\n onClick={() => setShowTransactionModal(true)}\r\n >\r\n + New Transaction\r\n </button>\r\n )}\r\n <div className=\"transactions-list\">\r\n {recentTransactions.map((tx) => {\r\n const item = items.find((i) => i.id === tx.itemId);\r\n return (\r\n <div key={tx.id} className=\"transaction-item\">\r\n <span className=\"tx-icon\">{getTransactionIcon(tx.type)}</span>\r\n <div className=\"tx-info\">\r\n <span className=\"tx-type\">{tx.type}</span>\r\n <span className=\"tx-item\">{item?.name || tx.itemId}</span>\r\n </div>\r\n <span\r\n className={`tx-qty ${tx.type === 'receipt' || tx.type === 'return' ? 'positive' : 'negative'}`}\r\n >\r\n {tx.type === 'receipt' || tx.type === 'return' ? '+' : '-'}\r\n {tx.quantity}\r\n </span>\r\n <span className=\"tx-date\">{tx.date.toLocaleString()}</span>\r\n {tx.reference && <span className=\"tx-ref\">Ref: {tx.reference}</span>}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Reorder Tab */}\r\n {activeTab === 'reorder' && (\r\n <div className=\"reorder-tab\">\r\n {reorderItems.length === 0 ? (\r\n <div className=\"empty-state\">\r\n <span className=\"empty-icon\">✅</span>\r\n <p>All items are sufficiently stocked</p>\r\n </div>\r\n ) : (\r\n <div className=\"reorder-list\">\r\n {reorderItems.map((item) => (\r\n <div key={item.id} className=\"reorder-item\">\r\n <div className=\"reorder-info\">\r\n <span className=\"reorder-sku\">{item.sku}</span>\r\n <span className=\"reorder-name\">{item.name}</span>\r\n </div>\r\n <div className=\"reorder-stock\">\r\n <span className=\"current-qty\">\r\n Current: {item.quantity} {item.unit}\r\n </span>\r\n <span className=\"reorder-level\">Reorder at: {item.reorderLevel}</span>\r\n <span className=\"reorder-qty\">Order qty: {item.reorderQuantity}</span>\r\n </div>\r\n {item.supplier && <span className=\"supplier-name\">{item.supplier.name}</span>}\r\n {!readOnly && (\r\n <button\r\n className=\"create-po-button\"\r\n onClick={() => console.log('Create PO for', item.id)}\r\n >\r\n Create PO\r\n </button>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Item Modal */}\r\n {showItemModal && editingItem && (\r\n <div className=\"modal-overlay\" onClick={() => setShowItemModal(false)}>\r\n <div className=\"item-modal\" onClick={(e) => e.stopPropagation()}>\r\n <h3>{editingItem.id ? 'Edit Item' : 'Add New Item'}</h3>\r\n <div className=\"modal-form\">\r\n <div className=\"form-row\">\r\n <label>\r\n SKU\r\n <input\r\n type=\"text\"\r\n value={editingItem.sku || ''}\r\n onChange={(e) => setEditingItem((prev) => ({ ...prev!, sku: e.target.value }))}\r\n />\r\n </label>\r\n <label>\r\n Name\r\n <input\r\n type=\"text\"\r\n value={editingItem.name || ''}\r\n onChange={(e) => setEditingItem((prev) => ({ ...prev!, name: e.target.value }))}\r\n />\r\n </label>\r\n </div>\r\n <label>\r\n Description\r\n <textarea\r\n value={editingItem.description || ''}\r\n onChange={(e) =>\r\n setEditingItem((prev) => ({ ...prev!, description: e.target.value }))\r\n }\r\n />\r\n </label>\r\n <div className=\"form-row\">\r\n <label>\r\n Category\r\n <input\r\n type=\"text\"\r\n value={editingItem.category || ''}\r\n onChange={(e) =>\r\n setEditingItem((prev) => ({ ...prev!, category: e.target.value }))\r\n }\r\n list=\"categories\"\r\n />\r\n <datalist id=\"categories\">\r\n {categories.map((c) => (\r\n <option key={c} value={c} />\r\n ))}\r\n </datalist>\r\n </label>\r\n <label>\r\n Unit\r\n <input\r\n type=\"text\"\r\n value={editingItem.unit || ''}\r\n onChange={(e) => setEditingItem((prev) => ({ ...prev!, unit: e.target.value }))}\r\n />\r\n </label>\r\n </div>\r\n <div className=\"form-row\">\r\n <label>\r\n Quantity\r\n <input\r\n type=\"number\"\r\n value={editingItem.quantity || 0}\r\n onChange={(e) =>\r\n setEditingItem((prev) => ({ ...prev!, quantity: parseInt(e.target.value) }))\r\n }\r\n />\r\n </label>\r\n <label>\r\n Reorder Level\r\n <input\r\n type=\"number\"\r\n value={editingItem.reorderLevel || 0}\r\n onChange={(e) =>\r\n setEditingItem((prev) => ({\r\n ...prev!,\r\n reorderLevel: parseInt(e.target.value),\r\n }))\r\n }\r\n />\r\n </label>\r\n <label>\r\n Reorder Qty\r\n <input\r\n type=\"number\"\r\n value={editingItem.reorderQuantity || 0}\r\n onChange={(e) =>\r\n setEditingItem((prev) => ({\r\n ...prev!,\r\n reorderQuantity: parseInt(e.target.value),\r\n }))\r\n }\r\n />\r\n </label>\r\n </div>\r\n <label>\r\n Unit Cost\r\n <input\r\n type=\"number\"\r\n step=\"0.01\"\r\n value={editingItem.cost?.amount || 0}\r\n onChange={(e) =>\r\n setEditingItem((prev) => ({\r\n ...prev!,\r\n cost: {\r\n ...prev!.cost!,\r\n amount: parseFloat(e.target.value),\r\n },\r\n }))\r\n }\r\n />\r\n </label>\r\n </div>\r\n <div className=\"modal-actions\">\r\n <button className=\"cancel-button\" onClick={() => setShowItemModal(false)}>\r\n Cancel\r\n </button>\r\n <button className=\"save-button\" onClick={handleItemSubmit}>\r\n {editingItem.id ? 'Save Changes' : 'Create Item'}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Transaction Modal */}\r\n {showTransactionModal && (\r\n <div className=\"modal-overlay\" onClick={() => setShowTransactionModal(false)}>\r\n <div className=\"transaction-modal\" onClick={(e) => e.stopPropagation()}>\r\n <h3>Create Transaction</h3>\r\n <div className=\"modal-form\">\r\n <label>\r\n Item\r\n <select\r\n value={newTransaction.itemId || ''}\r\n onChange={(e) =>\r\n setNewTransaction((prev) => ({ ...prev, itemId: e.target.value }))\r\n }\r\n >\r\n <option value=\"\">Select item...</option>\r\n {items.map((item) => (\r\n <option key={item.id} value={item.id}>\r\n {item.sku} - {item.name}\r\n </option>\r\n ))}\r\n </select>\r\n </label>\r\n <label>\r\n Type\r\n <select\r\n value={newTransaction.type || ''}\r\n onChange={(e) =>\r\n setNewTransaction((prev) => ({\r\n ...prev,\r\n type: e.target.value as TransactionType,\r\n }))\r\n }\r\n >\r\n <option value=\"\">Select type...</option>\r\n <option value=\"receipt\">Receipt</option>\r\n <option value=\"issue\">Issue</option>\r\n <option value=\"transfer\">Transfer</option>\r\n <option value=\"adjustment\">Adjustment</option>\r\n <option value=\"return\">Return</option>\r\n <option value=\"write-off\">Write-off</option>\r\n </select>\r\n </label>\r\n <label>\r\n Quantity\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n value={newTransaction.quantity || ''}\r\n onChange={(e) =>\r\n setNewTransaction((prev) => ({ ...prev, quantity: parseInt(e.target.value) }))\r\n }\r\n />\r\n </label>\r\n <label>\r\n Reference\r\n <input\r\n type=\"text\"\r\n value={newTransaction.reference || ''}\r\n onChange={(e) =>\r\n setNewTransaction((prev) => ({ ...prev, reference: e.target.value }))\r\n }\r\n placeholder=\"PO number, invoice, etc.\"\r\n />\r\n </label>\r\n <label>\r\n Notes\r\n <textarea\r\n value={newTransaction.notes || ''}\r\n onChange={(e) =>\r\n setNewTransaction((prev) => ({ ...prev, notes: e.target.value }))\r\n }\r\n />\r\n </label>\r\n </div>\r\n <div className=\"modal-actions\">\r\n <button className=\"cancel-button\" onClick={() => setShowTransactionModal(false)}>\r\n Cancel\r\n </button>\r\n <button className=\"save-button\" onClick={handleTransactionSubmit}>\r\n Create Transaction\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default NiceInventoryManager;\r\n","/**\r\n * NiceInvoiceView — read-only invoice viewer (header + lines + totals + VAT\r\n * breakdown + status timeline).\r\n */\r\nimport type { NiceBaseProps } from '@nice2dev/ui-core';\r\nimport React, { forwardRef, useMemo } from 'react';\r\n\r\nimport type { Invoice, InvoiceLine, InvoiceStatus } from './types';\r\n\r\nexport interface NiceInvoiceViewProps extends NiceBaseProps {\r\n invoice: Invoice;\r\n /** Locale for formatting amounts and dates. */\r\n locale?: string;\r\n /** Currency code; falls back to `invoice.currency` then to the line currency. */\r\n currency?: string;\r\n /** Hide individual sections. */\r\n hideSections?: Partial<{ header: boolean; lines: boolean; vat: boolean; totals: boolean; timeline: boolean; notes: boolean }>;\r\n /** Custom labels (i18n hook). */\r\n labels?: Partial<{\r\n invoiceNumber: string; issueDate: string; dueDate: string; seller: string; buyer: string;\r\n description: string; qty: string; unitPrice: string; vat: string; net: string; gross: string;\r\n subtotal: string; vatTotal: string; total: string; status: string; vatBreakdown: string;\r\n timeline: string; notes: string; vatId: string;\r\n }>;\r\n /** Optional click handler for actions (e.g. download PDF). */\r\n onAction?: (action: 'download' | 'print' | 'send') => void;\r\n /** Show action toolbar. Default: false. */\r\n showActions?: boolean;\r\n /** Density. */\r\n density?: 'comfortable' | 'compact';\r\n}\r\n\r\nconst STATUS_COLOR: Record<InvoiceStatus, string> = {\r\n draft: 'var(--nice-color-muted, #6b7280)',\r\n issued: 'var(--nice-color-info, #2563eb)',\r\n sent: 'var(--nice-color-info, #2563eb)',\r\n paid: 'var(--nice-color-success, #16a34a)',\r\n 'partially-paid': 'var(--nice-color-warning, #ca8a04)',\r\n overdue: 'var(--nice-color-danger, #dc2626)',\r\n cancelled: 'var(--nice-color-muted, #6b7280)',\r\n};\r\n\r\nfunction lineNet(line: InvoiceLine): number {\r\n const gross = line.quantity * line.unitPrice.amount;\r\n const discounted = line.discount ? gross * (1 - line.discount) : gross;\r\n return Math.round(discounted);\r\n}\r\n\r\nfunction lineVat(line: InvoiceLine): number {\r\n return Math.round(lineNet(line) * line.vatRate);\r\n}\r\n\r\nfunction fmtMoney(amount: number, currency: string | { code: string; decimalPlaces?: number }, locale?: string): string {\r\n const code = typeof currency === 'string' ? currency : currency.code;\r\n const decimals = typeof currency === 'string' ? 2 : currency.decimalPlaces ?? 2;\r\n return new Intl.NumberFormat(locale, { style: 'currency', currency: code }).format(amount / Math.pow(10, decimals));\r\n}\r\nfunction fmtDate(d: Date | string, locale?: string): string {\r\n const dt = d instanceof Date ? d : new Date(d);\r\n return new Intl.DateTimeFormat(locale, { dateStyle: 'medium' }).format(dt);\r\n}\r\n\r\nexport const NiceInvoiceView = forwardRef<HTMLElement, NiceInvoiceViewProps>(\r\n function NiceInvoiceView(\r\n { invoice, locale, currency, hideSections, labels, onAction, showActions = false, density = 'comfortable', className, style, id },\r\n ref,\r\n ) {\r\n const cur = currency ?? invoice.currency ?? invoice.lines[0]?.unitPrice.currency ?? 'EUR';\r\n const L = {\r\n invoiceNumber: 'Invoice', issueDate: 'Issue date', dueDate: 'Due date',\r\n seller: 'Seller', buyer: 'Buyer', description: 'Description', qty: 'Qty',\r\n unitPrice: 'Unit price', vat: 'VAT', net: 'Net', gross: 'Gross',\r\n subtotal: 'Subtotal', vatTotal: 'VAT total', total: 'Total', status: 'Status',\r\n vatBreakdown: 'VAT breakdown', timeline: 'History', notes: 'Notes', vatId: 'VAT ID',\r\n ...labels,\r\n };\r\n\r\n const totals = useMemo(() => {\r\n let net = 0;\r\n let vat = 0;\r\n const byRate = new Map<number, { net: number; vat: number }>();\r\n for (const ln of invoice.lines) {\r\n const n = lineNet(ln);\r\n const v = lineVat(ln);\r\n net += n;\r\n vat += v;\r\n const cell = byRate.get(ln.vatRate) ?? { net: 0, vat: 0 };\r\n cell.net += n;\r\n cell.vat += v;\r\n byRate.set(ln.vatRate, cell);\r\n }\r\n return { net, vat, gross: net + vat, byRate };\r\n }, [invoice.lines]);\r\n\r\n return (\r\n <article\r\n ref={ref as React.Ref<HTMLElement>}\r\n id={id}\r\n className={`nice-invoice-view nice-invoice-view--${density} ${className ?? ''}`}\r\n style={style}\r\n aria-label={`${L.invoiceNumber} ${invoice.invoiceNumber}`}\r\n >\r\n {!hideSections?.header && (\r\n <header className=\"nice-invoice-view__header\">\r\n <div>\r\n <div className=\"nice-invoice-view__title\">\r\n {L.invoiceNumber} <strong>{invoice.invoiceNumber}</strong>\r\n </div>\r\n <div className=\"nice-invoice-view__dates\">\r\n <span>{L.issueDate}: {fmtDate(invoice.issueDate, locale)}</span>\r\n <span>{L.dueDate}: {fmtDate(invoice.dueDate, locale)}</span>\r\n </div>\r\n </div>\r\n <div className=\"nice-invoice-view__status\" style={{ color: STATUS_COLOR[invoice.status] }}>\r\n <span aria-hidden>●</span> {invoice.status}\r\n </div>\r\n {showActions && (\r\n <div className=\"nice-invoice-view__actions\">\r\n <button type=\"button\" onClick={() => onAction?.('download')}>↓</button>\r\n <button type=\"button\" onClick={() => onAction?.('print')}>⎙</button>\r\n <button type=\"button\" onClick={() => onAction?.('send')}>✉</button>\r\n </div>\r\n )}\r\n </header>\r\n )}\r\n\r\n {!hideSections?.header && (\r\n <section className=\"nice-invoice-view__parties\">\r\n <div>\r\n <h4>{L.seller}</h4>\r\n <div>{invoice.seller.name}</div>\r\n {invoice.seller.vatId && <div>{L.vatId}: {invoice.seller.vatId}</div>}\r\n </div>\r\n <div>\r\n <h4>{L.buyer}</h4>\r\n <div>{invoice.buyer.name}</div>\r\n {invoice.buyer.vatId && <div>{L.vatId}: {invoice.buyer.vatId}</div>}\r\n </div>\r\n </section>\r\n )}\r\n\r\n {!hideSections?.lines && (\r\n <table className=\"nice-invoice-view__lines\">\r\n <thead>\r\n <tr>\r\n <th>{L.description}</th>\r\n <th className=\"nice-num\">{L.qty}</th>\r\n <th className=\"nice-num\">{L.unitPrice}</th>\r\n <th className=\"nice-num\">{L.vat}</th>\r\n <th className=\"nice-num\">{L.net}</th>\r\n <th className=\"nice-num\">{L.gross}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {invoice.lines.map((ln) => {\r\n const n = lineNet(ln);\r\n const v = lineVat(ln);\r\n return (\r\n <tr key={ln.id}>\r\n <td>{ln.description}</td>\r\n <td className=\"nice-num\">{ln.quantity}{ln.unit ? ` ${ln.unit}` : ''}</td>\r\n <td className=\"nice-num\">{fmtMoney(ln.unitPrice.amount, cur, locale)}</td>\r\n <td className=\"nice-num\">{(ln.vatRate * 100).toFixed(0)}%</td>\r\n <td className=\"nice-num\">{fmtMoney(n, cur, locale)}</td>\r\n <td className=\"nice-num\">{fmtMoney(n + v, cur, locale)}</td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n )}\r\n\r\n {!hideSections?.vat && totals.byRate.size > 0 && (\r\n <section className=\"nice-invoice-view__vat\">\r\n <h4>{L.vatBreakdown}</h4>\r\n <table>\r\n <thead>\r\n <tr><th>{L.vat}</th><th className=\"nice-num\">{L.net}</th><th className=\"nice-num\">{L.vat}</th><th className=\"nice-num\">{L.gross}</th></tr>\r\n </thead>\r\n <tbody>\r\n {[...totals.byRate.entries()].sort((a, b) => b[0] - a[0]).map(([rate, c]) => (\r\n <tr key={rate}>\r\n <td>{(rate * 100).toFixed(0)}%</td>\r\n <td className=\"nice-num\">{fmtMoney(c.net, cur, locale)}</td>\r\n <td className=\"nice-num\">{fmtMoney(c.vat, cur, locale)}</td>\r\n <td className=\"nice-num\">{fmtMoney(c.net + c.vat, cur, locale)}</td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </section>\r\n )}\r\n\r\n {!hideSections?.totals && (\r\n <section className=\"nice-invoice-view__totals\" aria-label={L.total}>\r\n <div><span>{L.subtotal}</span><span>{fmtMoney(totals.net, cur, locale)}</span></div>\r\n <div><span>{L.vatTotal}</span><span>{fmtMoney(totals.vat, cur, locale)}</span></div>\r\n <div className=\"nice-invoice-view__grand\"><span>{L.total}</span><strong>{fmtMoney(totals.gross, cur, locale)}</strong></div>\r\n </section>\r\n )}\r\n\r\n {!hideSections?.timeline && invoice.history && invoice.history.length > 0 && (\r\n <section className=\"nice-invoice-view__timeline\">\r\n <h4>{L.timeline}</h4>\r\n <ol>\r\n {invoice.history.map((h, i) => (\r\n <li key={i}>\r\n <span className=\"nice-invoice-view__t-date\">{fmtDate(h.at, locale)}</span>\r\n <span className=\"nice-invoice-view__t-status\" style={{ color: STATUS_COLOR[h.status] }}>{h.status}</span>\r\n {h.note && <span className=\"nice-invoice-view__t-note\"> — {h.note}</span>}\r\n </li>\r\n ))}\r\n </ol>\r\n </section>\r\n )}\r\n\r\n {!hideSections?.notes && invoice.notes && (\r\n <section className=\"nice-invoice-view__notes\"><h4>{L.notes}</h4><p>{invoice.notes}</p></section>\r\n )}\r\n </article>\r\n );\r\n },\r\n);\r\n","/**\r\n * NiceWarehouseView — visual warehouse map with rack/shelf/bin grid and\r\n * occupancy heat-map.\r\n */\r\nimport type { NiceBaseProps } from '@nice2dev/ui-core';\r\nimport React, { forwardRef, useMemo, useState } from 'react';\r\n\r\nimport type { InventoryItem, WarehouseLocation } from './types';\r\n\r\nexport interface WarehouseCell {\r\n /** Composite location, used as React key (e.g. `A-12-3-B`). */\r\n location: WarehouseLocation;\r\n /** Items currently stored at the location. */\r\n items: InventoryItem[];\r\n /** 0..1 occupancy ratio. */\r\n occupancy: number;\r\n /** Optional row/col coordinates for layout. Otherwise derived from rack/aisle/shelf/bin. */\r\n row?: number;\r\n col?: number;\r\n}\r\n\r\nexport interface NiceWarehouseViewProps extends NiceBaseProps {\r\n /** Warehouse identifier (used in the title). */\r\n warehouseName: string;\r\n /** Cells to render. */\r\n cells: WarehouseCell[];\r\n /** Heat-map color stops (low → high). */\r\n colors?: { low: string; mid: string; high: string };\r\n /** Click handler for a cell. */\r\n onCellClick?: (cell: WarehouseCell) => void;\r\n /** Show legend (default `true`). */\r\n showLegend?: boolean;\r\n /** Cell size in px (default 48). */\r\n cellSize?: number;\r\n /** Optional aisle separators every N columns. */\r\n aisleEvery?: number;\r\n}\r\n\r\nfunction colorFor(occ: number, colors: { low: string; mid: string; high: string }): string {\r\n if (occ <= 0.01) return colors.low;\r\n if (occ < 0.5) return colors.low;\r\n if (occ < 0.85) return colors.mid;\r\n return colors.high;\r\n}\r\n\r\nexport const NiceWarehouseView = forwardRef<HTMLDivElement, NiceWarehouseViewProps>(\r\n function NiceWarehouseView(\r\n { warehouseName, cells, colors = { low: '#dcfce7', mid: '#fde68a', high: '#fecaca' }, onCellClick, showLegend = true, cellSize = 48, aisleEvery = 4, className, style, id },\r\n ref,\r\n ) {\r\n const [hovered, setHovered] = useState<WarehouseCell | null>(null);\r\n\r\n const grid = useMemo(() => {\r\n // If row/col are missing, derive a 2D layout from rack + bin.\r\n const rows = new Map<string, WarehouseCell[]>();\r\n for (const c of cells) {\r\n const rowKey = c.row !== undefined ? `r${c.row}` : c.location.rack ?? c.location.aisle ?? '0';\r\n let arr = rows.get(rowKey);\r\n if (!arr) {\r\n arr = [];\r\n rows.set(rowKey, arr);\r\n }\r\n arr.push(c);\r\n }\r\n return [...rows.entries()].map(([rowKey, arr]) => ({ rowKey, cells: arr }));\r\n }, [cells]);\r\n\r\n return (\r\n <div ref={ref} id={id} className={`nice-warehouse-view ${className ?? ''}`} style={style}>\r\n <header className=\"nice-warehouse-view__header\">\r\n <h3>{warehouseName}</h3>\r\n {showLegend && (\r\n <div className=\"nice-warehouse-view__legend\" aria-label=\"Occupancy legend\">\r\n <span style={{ background: colors.low }} /> low\r\n <span style={{ background: colors.mid }} /> mid\r\n <span style={{ background: colors.high }} /> high\r\n </div>\r\n )}\r\n </header>\r\n <div className=\"nice-warehouse-view__grid\" role=\"grid\" aria-label={warehouseName}>\r\n {grid.map(({ rowKey, cells: row }) => (\r\n <div key={rowKey} className=\"nice-warehouse-view__row\" role=\"row\">\r\n {row.map((c, idx) => {\r\n const key = [c.location.rack, c.location.aisle, c.location.shelf, c.location.bin]\r\n .filter(Boolean)\r\n .join('-') || String(idx);\r\n const aisleBreak = aisleEvery > 0 && idx > 0 && idx % aisleEvery === 0;\r\n return (\r\n <React.Fragment key={key}>\r\n {aisleBreak && <div className=\"nice-warehouse-view__aisle\" aria-hidden />}\r\n <button\r\n type=\"button\"\r\n role=\"gridcell\"\r\n className=\"nice-warehouse-view__cell\"\r\n style={{\r\n width: cellSize,\r\n height: cellSize,\r\n background: colorFor(c.occupancy, colors),\r\n }}\r\n title={`${key} — ${(c.occupancy * 100).toFixed(0)}% (${c.items.length} items)`}\r\n onClick={() => onCellClick?.(c)}\r\n onMouseEnter={() => setHovered(c)}\r\n onMouseLeave={() => setHovered(null)}\r\n >\r\n <span className=\"nice-warehouse-view__bin\">{c.location.bin ?? c.location.shelf ?? ''}</span>\r\n </button>\r\n </React.Fragment>\r\n );\r\n })}\r\n </div>\r\n ))}\r\n </div>\r\n {hovered && (\r\n <aside className=\"nice-warehouse-view__details\" aria-live=\"polite\">\r\n <strong>{hovered.location.rack}/{hovered.location.shelf}/{hovered.location.bin}</strong>\r\n <div>{hovered.items.length} items ¡ {(hovered.occupancy * 100).toFixed(0)}% full</div>\r\n <ul>\r\n {hovered.items.slice(0, 5).map((it) => (\r\n <li key={it.id}>{it.sku} — {it.name}</li>\r\n ))}\r\n {hovered.items.length > 5 && <li>â€Ļ+{hovered.items.length - 5}</li>}\r\n </ul>\r\n </aside>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n","/**\r\n * NicePurchaseOrder — list + detail view for purchase orders.\r\n */\r\nimport type { NiceBaseProps } from '@nice2dev/ui-core';\r\nimport { forwardRef, useMemo, useState } from 'react';\r\n\r\nimport type { NicePurchaseOrderProps as BaseProps, PurchaseOrder, PurchaseOrderStatus } from './types';\r\n\r\nexport interface NicePurchaseOrderViewProps extends BaseProps, NiceBaseProps {\r\n /** Show in list+detail master/detail mode (default `true`). */\r\n selectable?: boolean;\r\n /** Initial selection. */\r\n initialSelectedId?: string;\r\n /** Locale. */\r\n locale?: string;\r\n /** Custom labels. */\r\n labels?: Partial<{\r\n orderNumber: string; supplier: string; status: string; orderDate: string;\r\n expected: string; actual: string; total: string; items: string; sku: string;\r\n name: string; qty: string; received: string; unitPrice: string; lineTotal: string;\r\n notes: string; approve: string; cancel: string; receive: string;\r\n }>;\r\n}\r\n\r\nconst STATUS_TINT: Record<PurchaseOrderStatus, string> = {\r\n draft: '#6b7280',\r\n 'pending-approval': '#ca8a04',\r\n approved: '#2563eb',\r\n ordered: '#0891b2',\r\n 'partially-received': '#9333ea',\r\n received: '#16a34a',\r\n cancelled: '#dc2626',\r\n};\r\n\r\nfunction fmtMoney(amount: number, currency: { code: string; decimalPlaces?: number } | string, locale?: string): string {\r\n const code = typeof currency === 'string' ? currency : currency.code;\r\n const decimals = typeof currency === 'string' ? 2 : currency.decimalPlaces ?? 2;\r\n return new Intl.NumberFormat(locale, { style: 'currency', currency: code }).format(amount / Math.pow(10, decimals));\r\n}\r\nfunction fmtDate(d?: Date | string, locale?: string): string {\r\n if (!d) return '—';\r\n const dt = d instanceof Date ? d : new Date(d);\r\n return new Intl.DateTimeFormat(locale, { dateStyle: 'medium' }).format(dt);\r\n}\r\n\r\nexport const NicePurchaseOrder = forwardRef<HTMLDivElement, NicePurchaseOrderViewProps>(\r\n function NicePurchaseOrder(\r\n { orders, selectable = true, initialSelectedId, locale, labels, readOnly, onOrderApprove, onReceiveItems, onOrderUpdate, className, style, id },\r\n ref,\r\n ) {\r\n const [selectedId, setSelectedId] = useState<string | undefined>(initialSelectedId ?? orders[0]?.id);\r\n const L = {\r\n orderNumber: 'PO #', supplier: 'Supplier', status: 'Status', orderDate: 'Ordered',\r\n expected: 'Expected', actual: 'Received', total: 'Total', items: 'Items', sku: 'SKU',\r\n name: 'Item', qty: 'Qty', received: 'Recv', unitPrice: 'Unit', lineTotal: 'Subtotal',\r\n notes: 'Notes', approve: 'Approve', cancel: 'Cancel', receive: 'Receive all', ...labels,\r\n };\r\n\r\n const selected: PurchaseOrder | undefined = useMemo(\r\n () => orders.find((o) => o.id === selectedId),\r\n [orders, selectedId],\r\n );\r\n\r\n return (\r\n <div ref={ref} id={id} className={`nice-purchase-order ${className ?? ''}`} style={style}>\r\n <table className=\"nice-purchase-order__list\">\r\n <thead>\r\n <tr>\r\n <th>{L.orderNumber}</th>\r\n <th>{L.supplier}</th>\r\n <th>{L.status}</th>\r\n <th>{L.orderDate}</th>\r\n <th>{L.expected}</th>\r\n <th className=\"nice-num\">{L.total}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {orders.map((o) => (\r\n <tr\r\n key={o.id}\r\n aria-selected={o.id === selectedId}\r\n className={o.id === selectedId ? 'is-selected' : undefined}\r\n onClick={() => selectable && setSelectedId(o.id)}\r\n >\r\n <td>{o.orderNumber}</td>\r\n <td>{o.supplier.name}</td>\r\n <td><span style={{ color: STATUS_TINT[o.status] }}>● {o.status}</span></td>\r\n <td>{fmtDate(o.orderDate, locale)}</td>\r\n <td>{fmtDate(o.expectedDelivery, locale)}</td>\r\n <td className=\"nice-num\">{fmtMoney(o.total.amount, o.total.currency, locale)}</td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n\r\n {selectable && selected && (\r\n <section className=\"nice-purchase-order__detail\" aria-label={`${L.orderNumber} ${selected.orderNumber}`}>\r\n <header>\r\n <h3>{selected.orderNumber} — {selected.supplier.name}</h3>\r\n {!readOnly && (\r\n <div className=\"nice-purchase-order__actions\">\r\n {selected.status === 'pending-approval' && onOrderApprove && (\r\n <button type=\"button\" onClick={() => onOrderApprove(selected.id)}>{L.approve}</button>\r\n )}\r\n {(selected.status === 'ordered' || selected.status === 'partially-received') && onReceiveItems && (\r\n <button\r\n type=\"button\"\r\n onClick={() => onReceiveItems(selected.id, selected.items.map((it) => ({ itemId: it.itemId, quantity: it.quantity - (it.receivedQuantity ?? 0) })))}\r\n >{L.receive}</button>\r\n )}\r\n {onOrderUpdate && selected.status === 'draft' && (\r\n <button type=\"button\" onClick={() => onOrderUpdate({ ...selected, status: 'pending-approval' })}>Submit</button>\r\n )}\r\n </div>\r\n )}\r\n </header>\r\n <table className=\"nice-purchase-order__items\">\r\n <thead>\r\n <tr>\r\n <th>{L.sku}</th>\r\n <th>{L.name}</th>\r\n <th className=\"nice-num\">{L.qty}</th>\r\n <th className=\"nice-num\">{L.received}</th>\r\n <th className=\"nice-num\">{L.unitPrice}</th>\r\n <th className=\"nice-num\">{L.lineTotal}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {selected.items.map((it) => (\r\n <tr key={it.itemId}>\r\n <td>{it.sku}</td>\r\n <td>{it.itemName}</td>\r\n <td className=\"nice-num\">{it.quantity}</td>\r\n <td className=\"nice-num\">{it.receivedQuantity ?? 0}</td>\r\n <td className=\"nice-num\">{fmtMoney(it.unitPrice.amount, it.unitPrice.currency, locale)}</td>\r\n <td className=\"nice-num\">{fmtMoney(it.lineTotal.amount, it.lineTotal.currency, locale)}</td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n <tfoot>\r\n <tr>\r\n <td colSpan={5} className=\"nice-num\">{L.total}</td>\r\n <td className=\"nice-num\"><strong>{fmtMoney(selected.total.amount, selected.total.currency, locale)}</strong></td>\r\n </tr>\r\n </tfoot>\r\n </table>\r\n {selected.notes && <p className=\"nice-purchase-order__notes\"><strong>{L.notes}:</strong> {selected.notes}</p>}\r\n </section>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n","/**\r\n * NiceHRDashboard — at-a-glance HR widgets (FTE, headcount, vacation, sick).\r\n */\r\nimport type { NiceBaseProps } from '@nice2dev/ui-core';\r\nimport React, { forwardRef, useMemo } from 'react';\r\n\r\nimport type { Employee } from './types';\r\n\r\nexport interface NiceHRDashboardProps extends NiceBaseProps {\r\n employees: Employee[];\r\n /** Custom widget labels. */\r\n labels?: Partial<{\r\n headcount: string; fte: string; vacationBalance: string; sickLeave: string;\r\n departments: string; activeEmployees: string;\r\n }>;\r\n /** Hide individual widgets. */\r\n hideWidgets?: Partial<{ headcount: boolean; fte: boolean; vacation: boolean; sick: boolean; departments: boolean }>;\r\n /** Locale for number formatting. */\r\n locale?: string;\r\n /** Density. */\r\n density?: 'comfortable' | 'compact';\r\n /** Click handler for a widget — useful for drilldowns. */\r\n onWidgetClick?: (widget: 'headcount' | 'fte' | 'vacation' | 'sick' | 'departments') => void;\r\n}\r\n\r\ninterface Stats {\r\n headcount: number;\r\n active: number;\r\n fte: number;\r\n vacationAvg: number;\r\n sickAvg: number;\r\n byDepartment: Map<string, number>;\r\n}\r\n\r\nexport const NiceHRDashboard = forwardRef<HTMLDivElement, NiceHRDashboardProps>(\r\n function NiceHRDashboard(\r\n { employees, labels, hideWidgets, locale, density = 'comfortable', onWidgetClick, className, style, id },\r\n ref,\r\n ) {\r\n const L = {\r\n headcount: 'Headcount', fte: 'FTE', vacationBalance: 'Avg vacation balance',\r\n sickLeave: 'Avg sick days (YTD)', departments: 'Departments', activeEmployees: 'Active',\r\n ...labels,\r\n };\r\n\r\n const stats: Stats = useMemo(() => {\r\n const active = employees.filter((e) => e.active !== false);\r\n const fte = active.reduce((s, e) => s + (e.fte ?? 1), 0);\r\n const vacationAvg = active.length === 0 ? 0 : active.reduce((s, e) => s + (e.vacationBalanceDays ?? 0), 0) / active.length;\r\n const sickAvg = active.length === 0 ? 0 : active.reduce((s, e) => s + (e.sickLeaveDaysYtd ?? 0), 0) / active.length;\r\n const byDepartment = new Map<string, number>();\r\n for (const e of active) {\r\n const k = e.department ?? '—';\r\n byDepartment.set(k, (byDepartment.get(k) ?? 0) + 1);\r\n }\r\n return { headcount: employees.length, active: active.length, fte, vacationAvg, sickAvg, byDepartment };\r\n }, [employees]);\r\n\r\n const fmt = (n: number, d = 1): string => n.toLocaleString(locale, { maximumFractionDigits: d });\r\n\r\n const Widget: React.FC<{\r\n kind: 'headcount' | 'fte' | 'vacation' | 'sick' | 'departments';\r\n label: string;\r\n value: React.ReactNode;\r\n hint?: React.ReactNode;\r\n }> = ({ kind, label, value, hint }) => (\r\n <button\r\n type=\"button\"\r\n className=\"nice-hr-dashboard__widget\"\r\n onClick={() => onWidgetClick?.(kind)}\r\n >\r\n <span className=\"nice-hr-dashboard__label\">{label}</span>\r\n <span className=\"nice-hr-dashboard__value\">{value}</span>\r\n {hint && <span className=\"nice-hr-dashboard__hint\">{hint}</span>}\r\n </button>\r\n );\r\n\r\n return (\r\n <div ref={ref} id={id} className={`nice-hr-dashboard nice-hr-dashboard--${density} ${className ?? ''}`} style={style} role=\"group\" aria-label=\"HR dashboard\">\r\n {!hideWidgets?.headcount && (\r\n <Widget kind=\"headcount\" label={L.headcount} value={fmt(stats.headcount, 0)} hint={`${L.activeEmployees}: ${fmt(stats.active, 0)}`} />\r\n )}\r\n {!hideWidgets?.fte && <Widget kind=\"fte\" label={L.fte} value={fmt(stats.fte, 2)} />}\r\n {!hideWidgets?.vacation && <Widget kind=\"vacation\" label={L.vacationBalance} value={`${fmt(stats.vacationAvg, 1)} d`} />}\r\n {!hideWidgets?.sick && <Widget kind=\"sick\" label={L.sickLeave} value={`${fmt(stats.sickAvg, 1)} d`} />}\r\n {!hideWidgets?.departments && (\r\n <Widget\r\n kind=\"departments\"\r\n label={L.departments}\r\n value={fmt(stats.byDepartment.size, 0)}\r\n hint={\r\n <ul className=\"nice-hr-dashboard__dept-list\">\r\n {[...stats.byDepartment.entries()].slice(0, 5).map(([d, n]) => (\r\n <li key={d}>{d}: {n}</li>\r\n ))}\r\n </ul>\r\n }\r\n />\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n","/**\r\n * @nice2dev/ui-erp — mock ERP API hook for tests, Storybook, and demos.\r\n */\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\n\r\nimport type {\r\n Employee,\r\n InventoryItem,\r\n Invoice,\r\n PurchaseOrder,\r\n Resource,\r\n Supplier,\r\n VatRate,\r\n} from './types';\r\n\r\nexport interface MockErpApi {\r\n loading: boolean;\r\n error: Error | null;\r\n invoices: Invoice[];\r\n purchaseOrders: PurchaseOrder[];\r\n inventory: InventoryItem[];\r\n suppliers: Supplier[];\r\n employees: Employee[];\r\n resources: Resource[];\r\n vatRates: VatRate[];\r\n refresh: () => Promise<void>;\r\n upsertInvoice: (invoice: Invoice) => Promise<void>;\r\n upsertPurchaseOrder: (po: PurchaseOrder) => Promise<void>;\r\n upsertInventory: (item: InventoryItem) => Promise<void>;\r\n}\r\n\r\nexport interface UseMockErpApiOptions {\r\n /** Artificial latency in ms (default 300). */\r\n latencyMs?: number;\r\n /** Probability (0..1) that a write will reject — handy for error-state UI testing. */\r\n errorRate?: number;\r\n /** Seed data overrides. */\r\n seed?: Partial<{\r\n invoices: Invoice[];\r\n purchaseOrders: PurchaseOrder[];\r\n inventory: InventoryItem[];\r\n suppliers: Supplier[];\r\n employees: Employee[];\r\n resources: Resource[];\r\n vatRates: VatRate[];\r\n }>;\r\n}\r\n\r\nconst wait = (ms: number): Promise<void> => new Promise((r) => setTimeout(r, ms));\r\n\r\nexport const NICE_VAT_PRESETS: Record<'PL' | 'EU' | 'UK', VatRate[]> = {\r\n PL: [\r\n { code: 'PL-23', rate: 0.23, label: '23%', description: 'Stawka podstawowa' },\r\n { code: 'PL-8', rate: 0.08, label: '8%', description: 'Stawka obniÅŧona' },\r\n { code: 'PL-5', rate: 0.05, label: '5%', description: 'Stawka obniÅŧona' },\r\n { code: 'PL-0', rate: 0, label: '0%', description: 'Stawka zerowa (eksport)' },\r\n { code: 'PL-zw', rate: 0, label: 'zw.', description: 'Zwolnienie' },\r\n ],\r\n EU: [\r\n { code: 'EU-21', rate: 0.21, label: '21%' },\r\n { code: 'EU-19', rate: 0.19, label: '19%' },\r\n { code: 'EU-9', rate: 0.09, label: '9%' },\r\n { code: 'EU-0', rate: 0, label: '0%' },\r\n ],\r\n UK: [\r\n { code: 'UK-20', rate: 0.2, label: '20%', description: 'Standard' },\r\n { code: 'UK-5', rate: 0.05, label: '5%', description: 'Reduced' },\r\n { code: 'UK-0', rate: 0, label: '0%', description: 'Zero' },\r\n ],\r\n};\r\n\r\nconst DEFAULT_SEED: Required<NonNullable<UseMockErpApiOptions['seed']>> = {\r\n invoices: [],\r\n purchaseOrders: [],\r\n inventory: [],\r\n suppliers: [],\r\n employees: [],\r\n resources: [],\r\n vatRates: NICE_VAT_PRESETS.PL,\r\n};\r\n\r\n/**\r\n * Hook returning a mock ERP API with simulated loading/error states.\r\n * Useful for storybook stories, integration tests, and offline demos.\r\n */\r\nexport function useMockErpApi(options: UseMockErpApiOptions = {}): MockErpApi {\r\n const { latencyMs = 300, errorRate = 0, seed } = options;\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<Error | null>(null);\r\n const [data, setData] = useState(() => ({ ...DEFAULT_SEED, ...seed }));\r\n const settledRef = useRef(false);\r\n\r\n const refresh = useCallback(async () => {\r\n setLoading(true);\r\n setError(null);\r\n await wait(latencyMs);\r\n if (Math.random() < errorRate) {\r\n setError(new Error('Mock ERP API: simulated failure'));\r\n } else {\r\n setData((d) => ({ ...d }));\r\n }\r\n setLoading(false);\r\n }, [latencyMs, errorRate]);\r\n\r\n useEffect(() => {\r\n if (settledRef.current) return;\r\n settledRef.current = true;\r\n void refresh();\r\n }, [refresh]);\r\n\r\n const writeWith = useCallback(\r\n async <K extends keyof typeof DEFAULT_SEED>(key: K, item: (typeof DEFAULT_SEED)[K][number]) => {\r\n await wait(latencyMs);\r\n if (Math.random() < errorRate) throw new Error('Mock ERP API: write failed');\r\n setData((d) => {\r\n const arr = [...(d[key] as Array<{ id: string }>)];\r\n const idx = arr.findIndex((i) => i.id === (item as { id: string }).id);\r\n if (idx >= 0) arr[idx] = item as typeof arr[number];\r\n else arr.push(item as typeof arr[number]);\r\n return { ...d, [key]: arr } as typeof d;\r\n });\r\n },\r\n [latencyMs, errorRate],\r\n );\r\n\r\n return useMemo<MockErpApi>(\r\n () => ({\r\n loading,\r\n error,\r\n invoices: data.invoices,\r\n purchaseOrders: data.purchaseOrders,\r\n inventory: data.inventory,\r\n suppliers: data.suppliers,\r\n employees: data.employees,\r\n resources: data.resources,\r\n vatRates: data.vatRates,\r\n refresh,\r\n upsertInvoice: (i) => writeWith('invoices', i),\r\n upsertPurchaseOrder: (p) => writeWith('purchaseOrders', p),\r\n upsertInventory: (i) => writeWith('inventory', i),\r\n }),\r\n [loading, error, data, refresh, writeWith],\r\n );\r\n}\r\n","/**\r\n * NiceVatTable — editable VAT-rate table with PL/EU/UK presets.\r\n */\r\nimport type { NiceBaseProps } from '@nice2dev/ui-core';\r\nimport { forwardRef, useCallback, useState } from 'react';\r\n\r\nimport { NICE_VAT_PRESETS } from './useMockErpApi';\r\nimport type { VatRate } from './types';\r\n\r\nexport interface NiceVatTableProps extends NiceBaseProps {\r\n /** Country/preset (used when `rates` not supplied). */\r\n country?: 'PL' | 'EU' | 'UK';\r\n /** Explicit rates (override preset). */\r\n rates?: VatRate[];\r\n /** Allow inline editing. */\r\n editable?: boolean;\r\n /** Notify on rate change. */\r\n onChange?: (rates: VatRate[]) => void;\r\n /** Called when a row is removed. */\r\n onRemove?: (code: string) => void;\r\n /** Locale for percentage formatting. */\r\n locale?: string;\r\n /** Custom labels. */\r\n labels?: Partial<{ code: string; rate: string; label: string; description: string; add: string; remove: string }>;\r\n /** Density. */\r\n density?: 'comfortable' | 'compact';\r\n}\r\n\r\nexport const NiceVatTable = forwardRef<HTMLDivElement, NiceVatTableProps>(\r\n function NiceVatTable(\r\n { country = 'PL', rates, editable = false, onChange, onRemove, locale, labels, density = 'comfortable', className, style, id },\r\n ref,\r\n ) {\r\n const [internal, setInternal] = useState<VatRate[]>(rates ?? NICE_VAT_PRESETS[country]);\r\n const L = { code: 'Code', rate: 'Rate', label: 'Label', description: 'Description', add: '+ Add', remove: 'Remove', ...labels };\r\n\r\n const update = useCallback(\r\n (next: VatRate[]) => {\r\n setInternal(next);\r\n onChange?.(next);\r\n },\r\n [onChange],\r\n );\r\n\r\n const onCellEdit = (idx: number, key: keyof VatRate, raw: string): void => {\r\n const next = [...internal];\r\n const r = { ...next[idx] };\r\n if (key === 'rate') {\r\n const n = Number(raw.replace(',', '.'));\r\n if (!Number.isFinite(n)) return;\r\n r.rate = n > 1 ? n / 100 : n;\r\n } else if (key === 'code' || key === 'label' || key === 'description') {\r\n (r as Record<string, unknown>)[key] = raw;\r\n }\r\n next[idx] = r;\r\n update(next);\r\n };\r\n\r\n const addRow = (): void => {\r\n update([...internal, { code: `NEW-${internal.length + 1}`, rate: 0, label: '0%' }]);\r\n };\r\n\r\n const removeRow = (idx: number): void => {\r\n const code = internal[idx].code;\r\n const next = internal.filter((_, i) => i !== idx);\r\n update(next);\r\n onRemove?.(code);\r\n };\r\n\r\n return (\r\n <div ref={ref} id={id} className={`nice-vat-table nice-vat-table--${density} ${className ?? ''}`} style={style}>\r\n <table>\r\n <thead>\r\n <tr>\r\n <th>{L.code}</th>\r\n <th className=\"nice-num\">{L.rate}</th>\r\n <th>{L.label}</th>\r\n <th>{L.description}</th>\r\n {editable && <th aria-label={L.remove} />}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {internal.map((r, idx) => (\r\n <tr key={r.code}>\r\n <td>\r\n {editable\r\n ? <input value={r.code} onChange={(e) => onCellEdit(idx, 'code', e.target.value)} />\r\n : r.code}\r\n </td>\r\n <td className=\"nice-num\">\r\n {editable\r\n ? <input type=\"number\" step=\"0.01\" min={0} max={1} value={r.rate} onChange={(e) => onCellEdit(idx, 'rate', e.target.value)} />\r\n : `${(r.rate * 100).toLocaleString(locale, { maximumFractionDigits: 2 })}%`}\r\n </td>\r\n <td>\r\n {editable\r\n ? <input value={r.label ?? ''} onChange={(e) => onCellEdit(idx, 'label', e.target.value)} />\r\n : r.label ?? ''}\r\n </td>\r\n <td>\r\n {editable\r\n ? <input value={r.description ?? ''} onChange={(e) => onCellEdit(idx, 'description', e.target.value)} />\r\n : r.description ?? ''}\r\n </td>\r\n {editable && (\r\n <td><button type=\"button\" onClick={() => removeRow(idx)} aria-label={L.remove}>×</button></td>\r\n )}\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n {editable && <button type=\"button\" className=\"nice-vat-table__add\" onClick={addRow}>{L.add}</button>}\r\n </div>\r\n );\r\n },\r\n);\r\n","/**\r\n * NiceJpkExporter — generates Polish JPK_V7M / JPK_FA XML for invoices.\r\n * NOTE: schemas in this initial release are simplified and intended for\r\n * UI/dev workflows; production exports should use a verified XSD.\r\n */\r\nimport type { NiceBaseProps } from '@nice2dev/ui-core';\r\nimport { forwardRef, useCallback, useState } from 'react';\r\n\r\nimport type { Invoice, JpkExportOptions } from './types';\r\n\r\nexport interface NiceJpkExporterProps extends NiceBaseProps {\r\n invoices: Invoice[];\r\n taxpayer: JpkExportOptions['taxpayer'];\r\n /** Default export format. */\r\n defaultFormat?: JpkExportOptions['format'];\r\n /** Default reporting period. */\r\n defaultPeriod?: { from: Date; to: Date };\r\n /** Custom XML builder (advanced override). */\r\n buildXml?: (opts: JpkExportOptions) => string;\r\n /** Called with the produced XML and Blob. */\r\n onExport?: (xml: string, blob: Blob, opts: JpkExportOptions) => void;\r\n /** Filename helper (default: `JPK_V7M_${YYYY}-${MM}.xml`). */\r\n filenameFor?: (opts: JpkExportOptions) => string;\r\n /** Custom labels. */\r\n labels?: Partial<{ format: string; period: string; from: string; to: string; export: string; download: string }>;\r\n}\r\n\r\nfunction pad(n: number): string {\r\n return n < 10 ? `0${n}` : String(n);\r\n}\r\nfunction isoDate(d: Date): string {\r\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\r\n}\r\n\r\nfunction escapeXml(s: string): string {\r\n return s\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&apos;');\r\n}\r\n\r\nfunction defaultBuildXml(opts: JpkExportOptions): string {\r\n const { format, period, taxpayer, invoices } = opts;\r\n const lines: string[] = [];\r\n lines.push('<?xml version=\"1.0\" encoding=\"UTF-8\"?>');\r\n lines.push(`<JPK xmlns=\"http://jpk.mf.gov.pl/wzor/2022/01/01/${format}/\" formCode=\"${format}\">`);\r\n lines.push(' <Naglowek>');\r\n lines.push(` <KodFormularza>${format}</KodFormularza>`);\r\n lines.push(` <DataOd>${isoDate(period.from)}</DataOd>`);\r\n lines.push(` <DataDo>${isoDate(period.to)}</DataDo>`);\r\n lines.push(' </Naglowek>');\r\n lines.push(' <Podmiot1>');\r\n lines.push(` <NIP>${escapeXml(taxpayer.nip)}</NIP>`);\r\n lines.push(` <PelnaNazwa>${escapeXml(taxpayer.name)}</PelnaNazwa>`);\r\n if (taxpayer.regon) lines.push(` <REGON>${escapeXml(taxpayer.regon)}</REGON>`);\r\n lines.push(' </Podmiot1>');\r\n for (const inv of invoices) {\r\n lines.push(' <Faktura>');\r\n lines.push(` <NumerFaktury>${escapeXml(inv.invoiceNumber)}</NumerFaktury>`);\r\n lines.push(` <DataWystawienia>${isoDate(inv.issueDate instanceof Date ? inv.issueDate : new Date(inv.issueDate))}</DataWystawienia>`);\r\n lines.push(` <NazwaNabywcy>${escapeXml(inv.buyer.name)}</NazwaNabywcy>`);\r\n if (inv.buyer.vatId) lines.push(` <NIPNabywcy>${escapeXml(inv.buyer.vatId)}</NIPNabywcy>`);\r\n let net = 0;\r\n let vat = 0;\r\n for (const ln of inv.lines) {\r\n const n = Math.round(ln.quantity * ln.unitPrice.amount * (1 - (ln.discount ?? 0)));\r\n const v = Math.round(n * ln.vatRate);\r\n net += n;\r\n vat += v;\r\n }\r\n lines.push(` <SumaNetto>${(net / 100).toFixed(2)}</SumaNetto>`);\r\n lines.push(` <SumaVAT>${(vat / 100).toFixed(2)}</SumaVAT>`);\r\n lines.push(` <SumaBrutto>${((net + vat) / 100).toFixed(2)}</SumaBrutto>`);\r\n lines.push(' </Faktura>');\r\n }\r\n lines.push('</JPK>');\r\n return lines.join('\\n');\r\n}\r\n\r\nexport const NiceJpkExporter = forwardRef<HTMLDivElement, NiceJpkExporterProps>(\r\n function NiceJpkExporter(\r\n { invoices, taxpayer, defaultFormat = 'JPK_V7M', defaultPeriod, buildXml = defaultBuildXml, onExport, filenameFor, labels, className, style, id },\r\n ref,\r\n ) {\r\n const today = new Date();\r\n const [format, setFormat] = useState<JpkExportOptions['format']>(defaultFormat);\r\n const [from, setFrom] = useState<string>(isoDate(defaultPeriod?.from ?? new Date(today.getFullYear(), today.getMonth(), 1)));\r\n const [to, setTo] = useState<string>(isoDate(defaultPeriod?.to ?? new Date(today.getFullYear(), today.getMonth() + 1, 0)));\r\n const L = { format: 'Format', period: 'Period', from: 'From', to: 'To', export: 'Export', download: 'Download', ...labels };\r\n\r\n const exportNow = useCallback(() => {\r\n const opts: JpkExportOptions = {\r\n format,\r\n period: { from: new Date(from), to: new Date(to) },\r\n taxpayer,\r\n invoices,\r\n };\r\n const xml = buildXml(opts);\r\n const blob = new Blob([xml], { type: 'application/xml' });\r\n const filename = filenameFor?.(opts) ?? `${format}_${from}_${to}.xml`;\r\n onExport?.(xml, blob, opts);\r\n // Trigger browser download\r\n if (typeof window !== 'undefined' && typeof URL.createObjectURL === 'function') {\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = filename;\r\n document.body.appendChild(a);\r\n a.click();\r\n a.remove();\r\n URL.revokeObjectURL(url);\r\n }\r\n }, [format, from, to, taxpayer, invoices, buildXml, onExport, filenameFor]);\r\n\r\n return (\r\n <div ref={ref} id={id} className={`nice-jpk-exporter ${className ?? ''}`} style={style}>\r\n <label>\r\n {L.format}\r\n <select value={format} onChange={(e) => setFormat(e.target.value as JpkExportOptions['format'])}>\r\n <option value=\"JPK_V7M\">JPK_V7M</option>\r\n <option value=\"JPK_V7K\">JPK_V7K</option>\r\n <option value=\"JPK_FA\">JPK_FA</option>\r\n </select>\r\n </label>\r\n <label>{L.from}<input type=\"date\" value={from} onChange={(e) => setFrom(e.target.value)} /></label>\r\n <label>{L.to}<input type=\"date\" value={to} onChange={(e) => setTo(e.target.value)} /></label>\r\n <button type=\"button\" onClick={exportNow}>{L.export}</button>\r\n <small>{invoices.length} invoices ready</small>\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nexport { defaultBuildXml as buildJpkXml };\r\n"],"names":["DEFAULT_VIEW_CONFIG","_a","_b","fmtMoney","fmtDate","NiceInvoiceView","NiceWarehouseView","NicePurchaseOrder","NiceHRDashboard","NiceVatTable","NiceJpkExporter"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/NiceResourceAllocation.tsx","../src/NiceInventoryManager.tsx","../src/NiceInvoiceView.tsx","../src/NiceWarehouseView.tsx","../src/NicePurchaseOrder.tsx","../src/NiceHRDashboard.tsx","../src/useMockErpApi.ts","../src/NiceVatTable.tsx","../src/NiceJpkExporter.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/click-events-have-key-events -- modal overlay backdrops (Esc-on-parent provides keyboard close), selection rows in .map() accompanied by visible cursor:pointer styling and sibling buttons; full keyboard migration via useAccessibleClick + extracted subcomponents tracked in TODO_1.0.10 A2.3 */\r\n/**\r\n * @component NiceResourceAllocation\r\n * @description Resource allocation and capacity planning grid\r\n * @package @nice2dev/ui-erp\r\n */\r\n\r\nimport React, { useState, useMemo, useCallback } from 'react';\r\n\r\nimport type {\r\n NiceResourceAllocationProps,\r\n Allocation,\r\n AllocationViewConfig,\r\n TimeUnit,\r\n ResourceUtilization,\r\n AllocationConflict,\r\n} from './types';\r\n\r\nconst DEFAULT_VIEW_CONFIG: AllocationViewConfig = {\r\n timeUnit: 'day',\r\n showUtilization: true,\r\n showConflicts: true,\r\n groupBy: 'resource',\r\n utilizationThreshold: 80,\r\n};\r\n\r\nconst TIME_INCREMENTS: Record<TimeUnit, number> = {\r\n hour: 60 * 60 * 1000,\r\n day: 24 * 60 * 60 * 1000,\r\n week: 7 * 24 * 60 * 60 * 1000,\r\n month: 30 * 24 * 60 * 60 * 1000,\r\n quarter: 90 * 24 * 60 * 60 * 1000,\r\n year: 365 * 24 * 60 * 60 * 1000,\r\n};\r\n\r\nexport const NiceResourceAllocation: React.FC<NiceResourceAllocationProps> = ({\r\n resources,\r\n allocations,\r\n dateRange,\r\n viewConfig: externalConfig,\r\n onAllocationCreate,\r\n onAllocationUpdate,\r\n onAllocationDelete,\r\n onResourceClick,\r\n readOnly = false,\r\n className = '',\r\n}) => {\r\n void onAllocationUpdate;\r\n const config = { ...DEFAULT_VIEW_CONFIG, ...externalConfig };\r\n\r\n const [selectedAllocation, setSelectedAllocation] = useState<string | null>(null);\r\n const [hoveredCell, setHoveredCell] = useState<{ resourceId: string; date: Date } | null>(null);\r\n const [timeUnit, setTimeUnit] = useState<TimeUnit>(config.timeUnit);\r\n const [expandedResources, setExpandedResources] = useState<Set<string>>(\r\n new Set(resources.map((r) => r.id)),\r\n );\r\n const [showAllocationModal, setShowAllocationModal] = useState(false);\r\n const [newAllocation, setNewAllocation] = useState<Partial<Allocation>>({});\r\n\r\n // Generate time periods\r\n const timePeriods = useMemo(() => {\r\n const periods: Date[] = [];\r\n const increment = TIME_INCREMENTS[timeUnit];\r\n let current = new Date(dateRange.start);\r\n\r\n while (current <= dateRange.end) {\r\n periods.push(new Date(current));\r\n current = new Date(current.getTime() + increment);\r\n }\r\n\r\n return periods;\r\n }, [dateRange.start, dateRange.end, timeUnit]);\r\n\r\n // Calculate utilization per resource per period\r\n const utilizationMap = useMemo(() => {\r\n const map = new Map<string, Map<number, ResourceUtilization>>();\r\n\r\n resources.forEach((resource) => {\r\n const resourceMap = new Map<number, ResourceUtilization>();\r\n\r\n timePeriods.forEach((period) => {\r\n const periodStart = period.getTime();\r\n const periodEnd = periodStart + TIME_INCREMENTS[timeUnit];\r\n\r\n // Find allocations overlapping this period\r\n const periodAllocations = allocations.filter((a) => {\r\n if (a.resourceId !== resource.id) {\r\n return false;\r\n }\r\n const allocStart = a.start.getTime();\r\n const allocEnd = a.end.getTime();\r\n return allocStart < periodEnd && allocEnd > periodStart;\r\n });\r\n\r\n const allocatedHours = periodAllocations.reduce((sum, a) => sum + a.hoursPerDay, 0);\r\n const availableHours = resource.maxCapacity;\r\n const utilizationPercent = availableHours > 0 ? (allocatedHours / availableHours) * 100 : 0;\r\n\r\n resourceMap.set(periodStart, {\r\n resourceId: resource.id,\r\n period: { start: period, end: new Date(periodEnd) },\r\n allocatedHours,\r\n availableHours,\r\n utilizationPercent,\r\n overallocated: utilizationPercent > 100,\r\n });\r\n });\r\n\r\n map.set(resource.id, resourceMap);\r\n });\r\n\r\n return map;\r\n }, [resources, allocations, timePeriods, timeUnit]);\r\n\r\n // Find conflicts\r\n const conflicts = useMemo(() => {\r\n const conflictList: AllocationConflict[] = [];\r\n\r\n utilizationMap.forEach((resourceMap, resourceId) => {\r\n const resource = resources.find((r) => r.id === resourceId)!;\r\n resourceMap.forEach((util, periodStart) => {\r\n if (util.overallocated) {\r\n const period = new Date(periodStart);\r\n const periodEnd = periodStart + TIME_INCREMENTS[timeUnit];\r\n const conflictAllocations = allocations.filter((a) => {\r\n if (a.resourceId !== resourceId) {\r\n return false;\r\n }\r\n const allocStart = a.start.getTime();\r\n const allocEnd = a.end.getTime();\r\n return allocStart < periodEnd && allocEnd > periodStart;\r\n });\r\n\r\n conflictList.push({\r\n resourceId,\r\n date: period,\r\n allocatedHours: util.allocatedHours,\r\n maxCapacity: resource.maxCapacity,\r\n allocations: conflictAllocations,\r\n });\r\n }\r\n });\r\n });\r\n\r\n return conflictList;\r\n }, [utilizationMap, allocations, resources, timeUnit]);\r\n\r\n // Get allocations for a cell\r\n const getCellAllocations = useCallback(\r\n (resourceId: string, date: Date): Allocation[] => {\r\n const periodStart = date.getTime();\r\n const periodEnd = periodStart + TIME_INCREMENTS[timeUnit];\r\n\r\n return allocations.filter((a) => {\r\n if (a.resourceId !== resourceId) {\r\n return false;\r\n }\r\n const allocStart = a.start.getTime();\r\n const allocEnd = a.end.getTime();\r\n return allocStart < periodEnd && allocEnd > periodStart;\r\n });\r\n },\r\n [allocations, timeUnit],\r\n );\r\n\r\n // Get cell color based on utilization\r\n const getCellColor = (resourceId: string, date: Date): string => {\r\n const util = utilizationMap.get(resourceId)?.get(date.getTime());\r\n if (!util) {\r\n return 'transparent';\r\n }\r\n\r\n if (util.overallocated) {\r\n return 'var(--nice-danger-tint-40, rgba(239, 68, 68, 0.4))';\r\n }\r\n if (util.utilizationPercent >= config.utilizationThreshold) {\r\n return 'var(--nice-warning-tint-30, rgba(245, 158, 11, 0.3))';\r\n }\r\n if (util.utilizationPercent > 0) {\r\n return 'var(--nice-success-tint-20, rgba(34, 197, 94, 0.2))';\r\n }\r\n return 'transparent';\r\n };\r\n\r\n const formatDate = (date: Date): string => {\r\n switch (timeUnit) {\r\n case 'hour':\r\n return date.toLocaleTimeString([], { hour: '2-digit' });\r\n case 'day':\r\n return date.toLocaleDateString([], { weekday: 'short', day: 'numeric' });\r\n case 'week':\r\n return `W${Math.ceil(date.getDate() / 7)}`;\r\n case 'month':\r\n return date.toLocaleDateString([], { month: 'short' });\r\n default:\r\n return date.toLocaleDateString();\r\n }\r\n };\r\n\r\n const handleCellClick = (resourceId: string, date: Date) => {\r\n if (readOnly) {\r\n return;\r\n }\r\n\r\n setNewAllocation({\r\n resourceId,\r\n start: date,\r\n end: new Date(date.getTime() + TIME_INCREMENTS[timeUnit]),\r\n hoursPerDay: resources.find((r) => r.id === resourceId)?.maxCapacity || 8,\r\n status: 'tentative',\r\n });\r\n setShowAllocationModal(true);\r\n };\r\n\r\n const handleCreateAllocation = () => {\r\n if (newAllocation.resourceId && newAllocation.start && newAllocation.end) {\r\n onAllocationCreate?.({\r\n resourceId: newAllocation.resourceId,\r\n start: newAllocation.start,\r\n end: newAllocation.end,\r\n hoursPerDay: newAllocation.hoursPerDay || 8,\r\n status: newAllocation.status || 'tentative',\r\n notes: newAllocation.notes,\r\n });\r\n setShowAllocationModal(false);\r\n setNewAllocation({});\r\n }\r\n };\r\n\r\n const toggleResource = (resourceId: string) => {\r\n setExpandedResources((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(resourceId)) {\r\n next.delete(resourceId);\r\n } else {\r\n next.add(resourceId);\r\n }\r\n return next;\r\n });\r\n };\r\n\r\n const getResourceTypeIcon = (type: string): string => {\r\n switch (type) {\r\n case 'human':\r\n return '👤';\r\n case 'equipment':\r\n return '🔧';\r\n case 'room':\r\n return 'đŸĸ';\r\n case 'vehicle':\r\n return '🚗';\r\n case 'material':\r\n return 'đŸ“Ļ';\r\n default:\r\n return '📋';\r\n }\r\n };\r\n\r\n return (\r\n <div className={`nice-resource-allocation ${className}`}>\r\n {/* Toolbar */}\r\n <header className=\"allocation__toolbar\">\r\n <div className=\"toolbar__left\">\r\n <h2>Resource Allocation</h2>\r\n <span className=\"date-range\">\r\n {dateRange.start.toLocaleDateString()} - {dateRange.end.toLocaleDateString()}\r\n </span>\r\n </div>\r\n <div className=\"toolbar__center\">\r\n <div className=\"time-unit-selector\">\r\n {(['day', 'week', 'month'] as TimeUnit[]).map((unit) => (\r\n <button\r\n key={unit}\r\n className={`unit-button ${timeUnit === unit ? 'unit-button--active' : ''}`}\r\n onClick={() => setTimeUnit(unit)}\r\n >\r\n {unit.charAt(0).toUpperCase() + unit.slice(1)}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n <div className=\"toolbar__right\">\r\n {config.showConflicts && conflicts.length > 0 && (\r\n <div className=\"conflicts-badge\">\r\n <span className=\"badge-icon\">âš ī¸</span>\r\n {conflicts.length} Conflict{conflicts.length !== 1 ? 's' : ''}\r\n </div>\r\n )}\r\n </div>\r\n </header>\r\n\r\n {/* Legend */}\r\n <div className=\"allocation__legend\">\r\n <div className=\"legend-item\">\r\n <span className=\"legend-color\" style={{ backgroundColor: 'var(--nice-success-tint-20, rgba(34, 197, 94, 0.2))' }} />\r\n <span>Allocated</span>\r\n </div>\r\n <div className=\"legend-item\">\r\n <span className=\"legend-color\" style={{ backgroundColor: 'var(--nice-warning-tint-30, rgba(245, 158, 11, 0.3))' }} />\r\n <span>\r\n High Utilization ({'>'}={config.utilizationThreshold}%)\r\n </span>\r\n </div>\r\n <div className=\"legend-item\">\r\n <span className=\"legend-color\" style={{ backgroundColor: 'var(--nice-danger-tint-40, rgba(239, 68, 68, 0.4))' }} />\r\n <span>Overallocated</span>\r\n </div>\r\n </div>\r\n\r\n {/* Grid */}\r\n <div className=\"allocation__grid\">\r\n {/* Header Row */}\r\n <div className=\"grid__header\">\r\n <div className=\"resource-header\">Resource</div>\r\n <div className=\"time-headers\">\r\n {timePeriods.map((period, idx) => (\r\n <div key={idx} className=\"time-header\">\r\n {formatDate(period)}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Resource Rows */}\r\n <div className=\"grid__body\">\r\n {resources.map((resource) => (\r\n <div key={resource.id} className=\"resource-row\">\r\n {/* Resource Info */}\r\n <div className=\"resource-cell\" onClick={() => onResourceClick?.(resource)}>\r\n <button\r\n className=\"expand-button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n toggleResource(resource.id);\r\n }}\r\n >\r\n {expandedResources.has(resource.id) ? '▾' : '▸'}\r\n </button>\r\n <span className=\"resource-icon\">{getResourceTypeIcon(resource.type)}</span>\r\n <div className=\"resource-info\">\r\n <span className=\"resource-name\">{resource.name}</span>\r\n {resource.department && (\r\n <span className=\"resource-dept\">{resource.department}</span>\r\n )}\r\n </div>\r\n <span className=\"resource-capacity\">{resource.maxCapacity}h/day</span>\r\n </div>\r\n\r\n {/* Time Cells */}\r\n <div className=\"time-cells\">\r\n {timePeriods.map((period, idx) => {\r\n const cellAllocations = getCellAllocations(resource.id, period);\r\n const util = utilizationMap.get(resource.id)?.get(period.getTime());\r\n const isHovered =\r\n hoveredCell?.resourceId === resource.id &&\r\n hoveredCell?.date.getTime() === period.getTime();\r\n\r\n return (\r\n <div\r\n key={idx}\r\n className={`time-cell ${isHovered ? 'time-cell--hovered' : ''}`}\r\n style={{ backgroundColor: getCellColor(resource.id, period) }}\r\n onClick={() => handleCellClick(resource.id, period)}\r\n onMouseEnter={() => setHoveredCell({ resourceId: resource.id, date: period })}\r\n onMouseLeave={() => setHoveredCell(null)}\r\n >\r\n {cellAllocations.length > 0 && (\r\n <div className=\"allocation-indicators\">\r\n {cellAllocations.slice(0, 2).map((alloc) => (\r\n <div\r\n key={alloc.id}\r\n className={`allocation-dot ${alloc.status}`}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setSelectedAllocation(alloc.id);\r\n }}\r\n />\r\n ))}\r\n {cellAllocations.length > 2 && (\r\n <span className=\"more-indicator\">+{cellAllocations.length - 2}</span>\r\n )}\r\n </div>\r\n )}\r\n\r\n {config.showUtilization && util && util.allocatedHours > 0 && (\r\n <span className=\"utilization-label\">{util.allocatedHours.toFixed(1)}h</span>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n {/* Expanded Allocations */}\r\n {expandedResources.has(resource.id) && (\r\n <div className=\"expanded-allocations\">\r\n {allocations\r\n .filter((a) => a.resourceId === resource.id)\r\n .map((allocation) => {\r\n const startIdx = timePeriods.findIndex(\r\n (p) => p.getTime() <= allocation.start.getTime(),\r\n );\r\n const endIdx = timePeriods.findIndex(\r\n (p) => p.getTime() >= allocation.end.getTime(),\r\n );\r\n\r\n if (startIdx === -1) {\r\n return null;\r\n }\r\n\r\n const span = Math.max(1, endIdx - startIdx);\r\n const leftPercent = (startIdx / timePeriods.length) * 100;\r\n const widthPercent = (span / timePeriods.length) * 100;\r\n\r\n return (\r\n <div\r\n key={allocation.id}\r\n className={`allocation-bar ${allocation.status} ${selectedAllocation === allocation.id ? 'selected' : ''}`}\r\n style={{\r\n left: `${leftPercent}%`,\r\n width: `${widthPercent}%`,\r\n }}\r\n onClick={() => setSelectedAllocation(allocation.id)}\r\n >\r\n <span className=\"allocation-label\">{allocation.hoursPerDay}h/day</span>\r\n {!readOnly && (\r\n <button\r\n className=\"delete-allocation\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onAllocationDelete?.(allocation.id);\r\n }}\r\n >\r\n ×\r\n </button>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Allocation Modal */}\r\n {showAllocationModal && (\r\n <div className=\"modal-overlay\" onClick={() => setShowAllocationModal(false)}>\r\n <div className=\"allocation-modal\" onClick={(e) => e.stopPropagation()}>\r\n <h3>Create Allocation</h3>\r\n <div className=\"modal-form\">\r\n <label>\r\n Resource\r\n <select\r\n value={newAllocation.resourceId || ''}\r\n onChange={(e) =>\r\n setNewAllocation((prev) => ({ ...prev, resourceId: e.target.value }))\r\n }\r\n >\r\n <option value=\"\">Select resource...</option>\r\n {resources.map((r) => (\r\n <option key={r.id} value={r.id}>\r\n {r.name}\r\n </option>\r\n ))}\r\n </select>\r\n </label>\r\n <label>\r\n Start Date\r\n <input\r\n type=\"date\"\r\n value={newAllocation.start?.toISOString().split('T')[0] || ''}\r\n onChange={(e) =>\r\n setNewAllocation((prev) => ({ ...prev, start: new Date(e.target.value) }))\r\n }\r\n />\r\n </label>\r\n <label>\r\n End Date\r\n <input\r\n type=\"date\"\r\n value={newAllocation.end?.toISOString().split('T')[0] || ''}\r\n onChange={(e) =>\r\n setNewAllocation((prev) => ({ ...prev, end: new Date(e.target.value) }))\r\n }\r\n />\r\n </label>\r\n <label>\r\n Hours per Day\r\n <input\r\n type=\"number\"\r\n min=\"0.5\"\r\n max=\"24\"\r\n step=\"0.5\"\r\n value={newAllocation.hoursPerDay || 8}\r\n onChange={(e) =>\r\n setNewAllocation((prev) => ({\r\n ...prev,\r\n hoursPerDay: parseFloat(e.target.value),\r\n }))\r\n }\r\n />\r\n </label>\r\n <label>\r\n Status\r\n <select\r\n value={newAllocation.status || 'tentative'}\r\n onChange={(e) =>\r\n setNewAllocation((prev) => ({\r\n ...prev,\r\n status: e.target.value as Allocation['status'],\r\n }))\r\n }\r\n >\r\n <option value=\"tentative\">Tentative</option>\r\n <option value=\"confirmed\">Confirmed</option>\r\n </select>\r\n </label>\r\n <label>\r\n Notes\r\n <textarea\r\n value={newAllocation.notes || ''}\r\n onChange={(e) => setNewAllocation((prev) => ({ ...prev, notes: e.target.value }))}\r\n placeholder=\"Optional notes...\"\r\n />\r\n </label>\r\n </div>\r\n <div className=\"modal-actions\">\r\n <button className=\"cancel-button\" onClick={() => setShowAllocationModal(false)}>\r\n Cancel\r\n </button>\r\n <button className=\"create-button\" onClick={handleCreateAllocation}>\r\n Create Allocation\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default NiceResourceAllocation;\r\n","/* eslint-disable jsx-a11y/click-events-have-key-events -- modal overlay backdrops (Esc-on-parent provides keyboard close), selection rows in .map() accompanied by visible cursor:pointer styling and sibling buttons; full keyboard migration via useAccessibleClick + extracted subcomponents tracked in TODO_1.0.10 A2.3 */\r\n/**\r\n * @component NiceInventoryManager\r\n * @description Inventory management and stock control interface\r\n * @package @nice2dev/ui-erp\r\n */\r\n\r\nimport React, { useState, useMemo } from 'react';\r\n\r\nimport type {\r\n NiceInventoryManagerProps,\r\n InventoryItem,\r\n InventoryTransaction,\r\n InventoryViewConfig,\r\n InventoryFilters,\r\n InventoryStatus,\r\n TransactionType,\r\n} from './types';\r\n\r\nconst DEFAULT_VIEW_CONFIG: InventoryViewConfig = {\r\n view: 'grid',\r\n sortBy: 'name',\r\n sortOrder: 'asc',\r\n showImages: true,\r\n pageSize: 24,\r\n};\r\n\r\nexport const NiceInventoryManager: React.FC<NiceInventoryManagerProps> = ({\r\n items,\r\n transactions = [],\r\n viewConfig: externalConfig,\r\n onItemCreate,\r\n onItemUpdate,\r\n onItemDelete,\r\n onTransactionCreate,\r\n onStockCount,\r\n onItemClick,\r\n readOnly = false,\r\n className = '',\r\n}) => {\r\n void onStockCount;\r\n const config = { ...DEFAULT_VIEW_CONFIG, ...externalConfig };\r\n\r\n const [filters, setFilters] = useState<InventoryFilters>({});\r\n const [view, setView] = useState<'grid' | 'list' | 'kanban'>(config.view);\r\n const [sortBy, setSortBy] = useState(config.sortBy);\r\n const [sortOrder, setSortOrder] = useState(config.sortOrder);\r\n const [page, setPage] = useState(1);\r\n const [selectedItems, setSelectedItems] = useState<Set<string>>(new Set());\r\n const [showItemModal, setShowItemModal] = useState(false);\r\n const [showTransactionModal, setShowTransactionModal] = useState(false);\r\n const [editingItem, setEditingItem] = useState<Partial<InventoryItem> | null>(null);\r\n const [newTransaction, setNewTransaction] = useState<Partial<InventoryTransaction>>({});\r\n const [activeTab, setActiveTab] = useState<'inventory' | 'transactions' | 'reorder'>('inventory');\r\n\r\n // Get unique categories\r\n const categories = useMemo(() => {\r\n return Array.from(new Set(items.map((item) => item.category))).sort();\r\n }, [items]);\r\n\r\n // Filter and sort items\r\n const filteredItems = useMemo(() => {\r\n let result = [...items];\r\n\r\n // Apply filters\r\n if (filters.searchQuery) {\r\n const query = filters.searchQuery.toLowerCase();\r\n result = result.filter(\r\n (item) =>\r\n item.name.toLowerCase().includes(query) ||\r\n item.sku.toLowerCase().includes(query) ||\r\n item.description?.toLowerCase().includes(query),\r\n );\r\n }\r\n\r\n if (filters.categories?.length) {\r\n result = result.filter((item) => filters.categories!.includes(item.category));\r\n }\r\n\r\n if (filters.statuses?.length) {\r\n result = result.filter((item) => filters.statuses!.includes(item.status));\r\n }\r\n\r\n if (filters.lowStockOnly) {\r\n result = result.filter((item) => item.quantity <= item.reorderLevel);\r\n }\r\n\r\n // Sort\r\n result.sort((a, b) => {\r\n let comparison = 0;\r\n switch (sortBy) {\r\n case 'name':\r\n comparison = a.name.localeCompare(b.name);\r\n break;\r\n case 'sku':\r\n comparison = a.sku.localeCompare(b.sku);\r\n break;\r\n case 'quantity':\r\n comparison = a.quantity - b.quantity;\r\n break;\r\n case 'value':\r\n comparison = a.quantity * a.cost.amount - b.quantity * b.cost.amount;\r\n break;\r\n case 'lastUpdated':\r\n comparison = (a.lastCountDate?.getTime() || 0) - (b.lastCountDate?.getTime() || 0);\r\n break;\r\n }\r\n return sortOrder === 'asc' ? comparison : -comparison;\r\n });\r\n\r\n return result;\r\n }, [items, filters, sortBy, sortOrder]);\r\n\r\n // Paginated items\r\n const paginatedItems = useMemo(() => {\r\n const start = (page - 1) * config.pageSize;\r\n return filteredItems.slice(start, start + config.pageSize);\r\n }, [filteredItems, page, config.pageSize]);\r\n\r\n const totalPages = Math.ceil(filteredItems.length / config.pageSize);\r\n\r\n // Items needing reorder\r\n const reorderItems = useMemo(() => {\r\n return items.filter((item) => item.quantity <= item.reorderLevel);\r\n }, [items]);\r\n\r\n // Recent transactions\r\n const recentTransactions = useMemo(() => {\r\n return [...transactions].sort((a, b) => b.date.getTime() - a.date.getTime()).slice(0, 50);\r\n }, [transactions]);\r\n\r\n // Group items for kanban view\r\n const kanbanGroups = useMemo(() => {\r\n if (view !== 'kanban') {\r\n return null;\r\n }\r\n\r\n const groups = new Map<InventoryStatus, InventoryItem[]>();\r\n const statuses: InventoryStatus[] = [\r\n 'in-stock',\r\n 'low-stock',\r\n 'out-of-stock',\r\n 'on-order',\r\n 'discontinued',\r\n ];\r\n\r\n statuses.forEach((status) => groups.set(status, []));\r\n\r\n filteredItems.forEach((item) => {\r\n groups.get(item.status)?.push(item);\r\n });\r\n\r\n return groups;\r\n }, [filteredItems, view]);\r\n\r\n const getStatusColor = (status: InventoryStatus): string => {\r\n switch (status) {\r\n case 'in-stock':\r\n return 'var(--nice-success, #22c55e)';\r\n case 'low-stock':\r\n return 'var(--nice-warning, #f59e0b)';\r\n case 'out-of-stock':\r\n return 'var(--nice-danger, #ef4444)';\r\n case 'on-order':\r\n return 'var(--nice-primary, #3b82f6)';\r\n case 'discontinued':\r\n return 'var(--nice-text-secondary, #6b7280)';\r\n default:\r\n return 'var(--nice-text-secondary, #6b7280)';\r\n }\r\n };\r\n\r\n const getTransactionIcon = (type: TransactionType): string => {\r\n switch (type) {\r\n case 'receipt':\r\n return 'đŸ“Ĩ';\r\n case 'issue':\r\n return '📤';\r\n case 'transfer':\r\n return '🔄';\r\n case 'adjustment':\r\n return 'âœī¸';\r\n case 'return':\r\n return 'â†Šī¸';\r\n case 'count':\r\n return '📊';\r\n case 'write-off':\r\n return '❌';\r\n default:\r\n return '📋';\r\n }\r\n };\r\n\r\n const formatCurrency = (amount: number, symbol: string = '$'): string => {\r\n return `${symbol}${amount.toFixed(2)}`;\r\n };\r\n\r\n const handleItemSubmit = () => {\r\n if (!editingItem) {\r\n return;\r\n }\r\n\r\n if (editingItem.id) {\r\n onItemUpdate?.(editingItem as InventoryItem);\r\n } else {\r\n onItemCreate?.(editingItem as Omit<InventoryItem, 'id'>);\r\n }\r\n\r\n setShowItemModal(false);\r\n setEditingItem(null);\r\n };\r\n\r\n const handleTransactionSubmit = () => {\r\n if (newTransaction.itemId && newTransaction.type && newTransaction.quantity) {\r\n onTransactionCreate?.({\r\n itemId: newTransaction.itemId,\r\n type: newTransaction.type as TransactionType,\r\n quantity: newTransaction.quantity,\r\n date: new Date(),\r\n reference: newTransaction.reference,\r\n notes: newTransaction.notes,\r\n });\r\n setShowTransactionModal(false);\r\n setNewTransaction({});\r\n }\r\n };\r\n\r\n const toggleItemSelection = (itemId: string) => {\r\n setSelectedItems((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(itemId)) {\r\n next.delete(itemId);\r\n } else {\r\n next.add(itemId);\r\n }\r\n return next;\r\n });\r\n };\r\n\r\n return (\r\n <div className={`nice-inventory-manager ${className}`}>\r\n {/* Toolbar */}\r\n <header className=\"inventory__toolbar\">\r\n <div className=\"toolbar__left\">\r\n <div className=\"search-box\">\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search items...\"\r\n value={filters.searchQuery || ''}\r\n onChange={(e) => setFilters((prev) => ({ ...prev, searchQuery: e.target.value }))}\r\n />\r\n <span className=\"search-icon\">🔍</span>\r\n </div>\r\n <select\r\n value={filters.categories?.[0] || ''}\r\n onChange={(e) =>\r\n setFilters((prev) => ({\r\n ...prev,\r\n categories: e.target.value ? [e.target.value] : undefined,\r\n }))\r\n }\r\n >\r\n <option value=\"\">All Categories</option>\r\n {categories.map((cat) => (\r\n <option key={cat} value={cat}>\r\n {cat}\r\n </option>\r\n ))}\r\n </select>\r\n <label className=\"filter-checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n checked={filters.lowStockOnly || false}\r\n onChange={(e) => setFilters((prev) => ({ ...prev, lowStockOnly: e.target.checked }))}\r\n />\r\n Low Stock Only\r\n </label>\r\n </div>\r\n <div className=\"toolbar__right\">\r\n <div className=\"view-selector\">\r\n {(['grid', 'list', 'kanban'] as const).map((v) => (\r\n <button\r\n key={v}\r\n className={`view-button ${view === v ? 'view-button--active' : ''}`}\r\n onClick={() => setView(v)}\r\n >\r\n {v === 'grid' ? '⊞' : v === 'list' ? '☰' : 'â–Ļ'}\r\n </button>\r\n ))}\r\n </div>\r\n {!readOnly && (\r\n <button\r\n className=\"add-button\"\r\n onClick={() => {\r\n setEditingItem({\r\n category: categories[0],\r\n unit: 'pcs',\r\n quantity: 0,\r\n reorderLevel: 10,\r\n reorderQuantity: 100,\r\n cost: { amount: 0, currency: { code: 'USD', symbol: '$', decimalPlaces: 2 } },\r\n status: 'in-stock',\r\n });\r\n setShowItemModal(true);\r\n }}\r\n >\r\n + Add Item\r\n </button>\r\n )}\r\n </div>\r\n </header>\r\n\r\n {/* Tabs */}\r\n <div className=\"inventory__tabs\">\r\n <button\r\n className={`tab ${activeTab === 'inventory' ? 'tab--active' : ''}`}\r\n onClick={() => setActiveTab('inventory')}\r\n >\r\n Inventory ({items.length})\r\n </button>\r\n <button\r\n className={`tab ${activeTab === 'transactions' ? 'tab--active' : ''}`}\r\n onClick={() => setActiveTab('transactions')}\r\n >\r\n Transactions ({transactions.length})\r\n </button>\r\n <button\r\n className={`tab ${activeTab === 'reorder' ? 'tab--active' : ''}`}\r\n onClick={() => setActiveTab('reorder')}\r\n >\r\n Reorder Alerts\r\n {reorderItems.length > 0 && <span className=\"alert-badge\">{reorderItems.length}</span>}\r\n </button>\r\n </div>\r\n\r\n <div className=\"inventory__content\">\r\n {/* Inventory Tab */}\r\n {activeTab === 'inventory' && (\r\n <>\r\n {/* Grid View */}\r\n {view === 'grid' && (\r\n <div className=\"items-grid\">\r\n {paginatedItems.map((item) => (\r\n <div\r\n key={item.id}\r\n className={`item-card ${selectedItems.has(item.id) ? 'item-card--selected' : ''}`}\r\n onClick={() => onItemClick?.(item)}\r\n >\r\n {!readOnly && (\r\n <input\r\n type=\"checkbox\"\r\n className=\"item-checkbox\"\r\n checked={selectedItems.has(item.id)}\r\n onChange={() => toggleItemSelection(item.id)}\r\n onClick={(e) => e.stopPropagation()}\r\n />\r\n )}\r\n {config.showImages && (\r\n <div className=\"item-image\">\r\n {item.images?.[0] ? (\r\n <img src={item.images[0]} alt={item.name} />\r\n ) : (\r\n <span className=\"placeholder-image\">đŸ“Ļ</span>\r\n )}\r\n </div>\r\n )}\r\n <div className=\"item-info\">\r\n <span className=\"item-sku\">{item.sku}</span>\r\n <h4 className=\"item-name\">{item.name}</h4>\r\n <span className=\"item-category\">{item.category}</span>\r\n </div>\r\n <div className=\"item-stock\">\r\n <span\r\n className=\"status-badge\"\r\n style={{ backgroundColor: getStatusColor(item.status) }}\r\n >\r\n {item.status.replace('-', ' ')}\r\n </span>\r\n <span className=\"quantity\">\r\n {item.quantity} {item.unit}\r\n </span>\r\n {item.quantity <= item.reorderLevel && (\r\n <span className=\"reorder-alert\">âš ī¸ Low Stock</span>\r\n )}\r\n </div>\r\n <div className=\"item-value\">\r\n {formatCurrency(item.quantity * item.cost.amount, item.cost.currency.symbol)}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* List View */}\r\n {view === 'list' && (\r\n <div className=\"items-table\">\r\n <table>\r\n <thead>\r\n <tr>\r\n {!readOnly && <th></th>}\r\n <th\r\n onClick={() => {\r\n setSortBy('sku');\r\n setSortOrder((prev) => (prev === 'asc' ? 'desc' : 'asc'));\r\n }}\r\n >\r\n SKU {sortBy === 'sku' && (sortOrder === 'asc' ? '↑' : '↓')}\r\n </th>\r\n <th\r\n onClick={() => {\r\n setSortBy('name');\r\n setSortOrder((prev) => (prev === 'asc' ? 'desc' : 'asc'));\r\n }}\r\n >\r\n Name {sortBy === 'name' && (sortOrder === 'asc' ? '↑' : '↓')}\r\n </th>\r\n <th>Category</th>\r\n <th\r\n onClick={() => {\r\n setSortBy('quantity');\r\n setSortOrder((prev) => (prev === 'asc' ? 'desc' : 'asc'));\r\n }}\r\n >\r\n Qty {sortBy === 'quantity' && (sortOrder === 'asc' ? '↑' : '↓')}\r\n </th>\r\n <th>Status</th>\r\n <th>Location</th>\r\n <th\r\n onClick={() => {\r\n setSortBy('value');\r\n setSortOrder((prev) => (prev === 'asc' ? 'desc' : 'asc'));\r\n }}\r\n >\r\n Value {sortBy === 'value' && (sortOrder === 'asc' ? '↑' : '↓')}\r\n </th>\r\n {!readOnly && <th>Actions</th>}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {paginatedItems.map((item) => (\r\n <tr\r\n key={item.id}\r\n className={selectedItems.has(item.id) ? 'row--selected' : ''}\r\n onClick={() => onItemClick?.(item)}\r\n >\r\n {!readOnly && (\r\n <td>\r\n <input\r\n type=\"checkbox\"\r\n checked={selectedItems.has(item.id)}\r\n onChange={() => toggleItemSelection(item.id)}\r\n onClick={(e) => e.stopPropagation()}\r\n />\r\n </td>\r\n )}\r\n <td className=\"sku-cell\">{item.sku}</td>\r\n <td>{item.name}</td>\r\n <td>{item.category}</td>\r\n <td className={item.quantity <= item.reorderLevel ? 'low-stock' : ''}>\r\n {item.quantity} {item.unit}\r\n </td>\r\n <td>\r\n <span\r\n className=\"status-badge\"\r\n style={{ backgroundColor: getStatusColor(item.status) }}\r\n >\r\n {item.status.replace('-', ' ')}\r\n </span>\r\n </td>\r\n <td>\r\n {item.location\r\n ? `${item.location.warehouseName}${item.location.aisle ? ` / ${item.location.aisle}` : ''}`\r\n : '-'}\r\n </td>\r\n <td>\r\n {formatCurrency(\r\n item.quantity * item.cost.amount,\r\n item.cost.currency.symbol,\r\n )}\r\n </td>\r\n {!readOnly && (\r\n <td className=\"actions-cell\">\r\n <button\r\n className=\"action-btn\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setEditingItem(item);\r\n setShowItemModal(true);\r\n }}\r\n >\r\n âœī¸\r\n </button>\r\n <button\r\n className=\"action-btn\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setNewTransaction({ itemId: item.id });\r\n setShowTransactionModal(true);\r\n }}\r\n >\r\n 📝\r\n </button>\r\n <button\r\n className=\"action-btn action-btn--danger\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onItemDelete?.(item.id);\r\n }}\r\n >\r\n đŸ—‘ī¸\r\n </button>\r\n </td>\r\n )}\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n\r\n {/* Kanban View */}\r\n {view === 'kanban' && kanbanGroups && (\r\n <div className=\"items-kanban\">\r\n {Array.from(kanbanGroups.entries()).map(([status, statusItems]) => (\r\n <div key={status} className=\"kanban-column\">\r\n <div className=\"column-header\" style={{ borderColor: getStatusColor(status) }}>\r\n <span\r\n className=\"status-dot\"\r\n style={{ backgroundColor: getStatusColor(status) }}\r\n />\r\n <span className=\"column-title\">{status.replace('-', ' ')}</span>\r\n <span className=\"column-count\">{statusItems.length}</span>\r\n </div>\r\n <div className=\"column-items\">\r\n {statusItems.map((item) => (\r\n <div\r\n key={item.id}\r\n className=\"kanban-card\"\r\n onClick={() => onItemClick?.(item)}\r\n >\r\n <span className=\"card-sku\">{item.sku}</span>\r\n <span className=\"card-name\">{item.name}</span>\r\n <span className=\"card-qty\">\r\n {item.quantity} {item.unit}\r\n </span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Pagination */}\r\n {totalPages > 1 && (\r\n <div className=\"pagination\">\r\n <button disabled={page === 1} onClick={() => setPage((p) => p - 1)}>\r\n Previous\r\n </button>\r\n <span>\r\n Page {page} of {totalPages}\r\n </span>\r\n <button disabled={page === totalPages} onClick={() => setPage((p) => p + 1)}>\r\n Next\r\n </button>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n\r\n {/* Transactions Tab */}\r\n {activeTab === 'transactions' && (\r\n <div className=\"transactions-tab\">\r\n {!readOnly && (\r\n <button\r\n className=\"add-transaction-button\"\r\n onClick={() => setShowTransactionModal(true)}\r\n >\r\n + New Transaction\r\n </button>\r\n )}\r\n <div className=\"transactions-list\">\r\n {recentTransactions.map((tx) => {\r\n const item = items.find((i) => i.id === tx.itemId);\r\n return (\r\n <div key={tx.id} className=\"transaction-item\">\r\n <span className=\"tx-icon\">{getTransactionIcon(tx.type)}</span>\r\n <div className=\"tx-info\">\r\n <span className=\"tx-type\">{tx.type}</span>\r\n <span className=\"tx-item\">{item?.name || tx.itemId}</span>\r\n </div>\r\n <span\r\n className={`tx-qty ${tx.type === 'receipt' || tx.type === 'return' ? 'positive' : 'negative'}`}\r\n >\r\n {tx.type === 'receipt' || tx.type === 'return' ? '+' : '-'}\r\n {tx.quantity}\r\n </span>\r\n <span className=\"tx-date\">{tx.date.toLocaleString()}</span>\r\n {tx.reference && <span className=\"tx-ref\">Ref: {tx.reference}</span>}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Reorder Tab */}\r\n {activeTab === 'reorder' && (\r\n <div className=\"reorder-tab\">\r\n {reorderItems.length === 0 ? (\r\n <div className=\"empty-state\">\r\n <span className=\"empty-icon\">✅</span>\r\n <p>All items are sufficiently stocked</p>\r\n </div>\r\n ) : (\r\n <div className=\"reorder-list\">\r\n {reorderItems.map((item) => (\r\n <div key={item.id} className=\"reorder-item\">\r\n <div className=\"reorder-info\">\r\n <span className=\"reorder-sku\">{item.sku}</span>\r\n <span className=\"reorder-name\">{item.name}</span>\r\n </div>\r\n <div className=\"reorder-stock\">\r\n <span className=\"current-qty\">\r\n Current: {item.quantity} {item.unit}\r\n </span>\r\n <span className=\"reorder-level\">Reorder at: {item.reorderLevel}</span>\r\n <span className=\"reorder-qty\">Order qty: {item.reorderQuantity}</span>\r\n </div>\r\n {item.supplier && <span className=\"supplier-name\">{item.supplier.name}</span>}\r\n {!readOnly && (\r\n <button\r\n className=\"create-po-button\"\r\n onClick={() => console.log('Create PO for', item.id)}\r\n >\r\n Create PO\r\n </button>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Item Modal */}\r\n {showItemModal && editingItem && (\r\n <div className=\"modal-overlay\" onClick={() => setShowItemModal(false)}>\r\n <div className=\"item-modal\" onClick={(e) => e.stopPropagation()}>\r\n <h3>{editingItem.id ? 'Edit Item' : 'Add New Item'}</h3>\r\n <div className=\"modal-form\">\r\n <div className=\"form-row\">\r\n <label>\r\n SKU\r\n <input\r\n type=\"text\"\r\n value={editingItem.sku || ''}\r\n onChange={(e) => setEditingItem((prev) => ({ ...prev!, sku: e.target.value }))}\r\n />\r\n </label>\r\n <label>\r\n Name\r\n <input\r\n type=\"text\"\r\n value={editingItem.name || ''}\r\n onChange={(e) => setEditingItem((prev) => ({ ...prev!, name: e.target.value }))}\r\n />\r\n </label>\r\n </div>\r\n <label>\r\n Description\r\n <textarea\r\n value={editingItem.description || ''}\r\n onChange={(e) =>\r\n setEditingItem((prev) => ({ ...prev!, description: e.target.value }))\r\n }\r\n />\r\n </label>\r\n <div className=\"form-row\">\r\n <label>\r\n Category\r\n <input\r\n type=\"text\"\r\n value={editingItem.category || ''}\r\n onChange={(e) =>\r\n setEditingItem((prev) => ({ ...prev!, category: e.target.value }))\r\n }\r\n list=\"categories\"\r\n />\r\n <datalist id=\"categories\">\r\n {categories.map((c) => (\r\n <option key={c} value={c} />\r\n ))}\r\n </datalist>\r\n </label>\r\n <label>\r\n Unit\r\n <input\r\n type=\"text\"\r\n value={editingItem.unit || ''}\r\n onChange={(e) => setEditingItem((prev) => ({ ...prev!, unit: e.target.value }))}\r\n />\r\n </label>\r\n </div>\r\n <div className=\"form-row\">\r\n <label>\r\n Quantity\r\n <input\r\n type=\"number\"\r\n value={editingItem.quantity || 0}\r\n onChange={(e) =>\r\n setEditingItem((prev) => ({ ...prev!, quantity: parseInt(e.target.value) }))\r\n }\r\n />\r\n </label>\r\n <label>\r\n Reorder Level\r\n <input\r\n type=\"number\"\r\n value={editingItem.reorderLevel || 0}\r\n onChange={(e) =>\r\n setEditingItem((prev) => ({\r\n ...prev!,\r\n reorderLevel: parseInt(e.target.value),\r\n }))\r\n }\r\n />\r\n </label>\r\n <label>\r\n Reorder Qty\r\n <input\r\n type=\"number\"\r\n value={editingItem.reorderQuantity || 0}\r\n onChange={(e) =>\r\n setEditingItem((prev) => ({\r\n ...prev!,\r\n reorderQuantity: parseInt(e.target.value),\r\n }))\r\n }\r\n />\r\n </label>\r\n </div>\r\n <label>\r\n Unit Cost\r\n <input\r\n type=\"number\"\r\n step=\"0.01\"\r\n value={editingItem.cost?.amount || 0}\r\n onChange={(e) =>\r\n setEditingItem((prev) => ({\r\n ...prev!,\r\n cost: {\r\n ...prev!.cost!,\r\n amount: parseFloat(e.target.value),\r\n },\r\n }))\r\n }\r\n />\r\n </label>\r\n </div>\r\n <div className=\"modal-actions\">\r\n <button className=\"cancel-button\" onClick={() => setShowItemModal(false)}>\r\n Cancel\r\n </button>\r\n <button className=\"save-button\" onClick={handleItemSubmit}>\r\n {editingItem.id ? 'Save Changes' : 'Create Item'}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Transaction Modal */}\r\n {showTransactionModal && (\r\n <div className=\"modal-overlay\" onClick={() => setShowTransactionModal(false)}>\r\n <div className=\"transaction-modal\" onClick={(e) => e.stopPropagation()}>\r\n <h3>Create Transaction</h3>\r\n <div className=\"modal-form\">\r\n <label>\r\n Item\r\n <select\r\n value={newTransaction.itemId || ''}\r\n onChange={(e) =>\r\n setNewTransaction((prev) => ({ ...prev, itemId: e.target.value }))\r\n }\r\n >\r\n <option value=\"\">Select item...</option>\r\n {items.map((item) => (\r\n <option key={item.id} value={item.id}>\r\n {item.sku} - {item.name}\r\n </option>\r\n ))}\r\n </select>\r\n </label>\r\n <label>\r\n Type\r\n <select\r\n value={newTransaction.type || ''}\r\n onChange={(e) =>\r\n setNewTransaction((prev) => ({\r\n ...prev,\r\n type: e.target.value as TransactionType,\r\n }))\r\n }\r\n >\r\n <option value=\"\">Select type...</option>\r\n <option value=\"receipt\">Receipt</option>\r\n <option value=\"issue\">Issue</option>\r\n <option value=\"transfer\">Transfer</option>\r\n <option value=\"adjustment\">Adjustment</option>\r\n <option value=\"return\">Return</option>\r\n <option value=\"write-off\">Write-off</option>\r\n </select>\r\n </label>\r\n <label>\r\n Quantity\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n value={newTransaction.quantity || ''}\r\n onChange={(e) =>\r\n setNewTransaction((prev) => ({ ...prev, quantity: parseInt(e.target.value) }))\r\n }\r\n />\r\n </label>\r\n <label>\r\n Reference\r\n <input\r\n type=\"text\"\r\n value={newTransaction.reference || ''}\r\n onChange={(e) =>\r\n setNewTransaction((prev) => ({ ...prev, reference: e.target.value }))\r\n }\r\n placeholder=\"PO number, invoice, etc.\"\r\n />\r\n </label>\r\n <label>\r\n Notes\r\n <textarea\r\n value={newTransaction.notes || ''}\r\n onChange={(e) =>\r\n setNewTransaction((prev) => ({ ...prev, notes: e.target.value }))\r\n }\r\n />\r\n </label>\r\n </div>\r\n <div className=\"modal-actions\">\r\n <button className=\"cancel-button\" onClick={() => setShowTransactionModal(false)}>\r\n Cancel\r\n </button>\r\n <button className=\"save-button\" onClick={handleTransactionSubmit}>\r\n Create Transaction\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default NiceInventoryManager;\r\n","/**\r\n * NiceInvoiceView — read-only invoice viewer (header + lines + totals + VAT\r\n * breakdown + status timeline).\r\n */\r\nimport type { NiceBaseProps } from '@nice2dev/ui-core';\r\nimport React, { forwardRef, useMemo } from 'react';\r\n\r\nimport type { Invoice, InvoiceLine, InvoiceStatus } from './types';\r\n\r\nexport interface NiceInvoiceViewProps extends NiceBaseProps {\r\n invoice: Invoice;\r\n /** Locale for formatting amounts and dates. */\r\n locale?: string;\r\n /** Currency code; falls back to `invoice.currency` then to the line currency. */\r\n currency?: string;\r\n /** Hide individual sections. */\r\n hideSections?: Partial<{ header: boolean; lines: boolean; vat: boolean; totals: boolean; timeline: boolean; notes: boolean }>;\r\n /** Custom labels (i18n hook). */\r\n labels?: Partial<{\r\n invoiceNumber: string; issueDate: string; dueDate: string; seller: string; buyer: string;\r\n description: string; qty: string; unitPrice: string; vat: string; net: string; gross: string;\r\n subtotal: string; vatTotal: string; total: string; status: string; vatBreakdown: string;\r\n timeline: string; notes: string; vatId: string;\r\n }>;\r\n /** Optional click handler for actions (e.g. download PDF). */\r\n onAction?: (action: 'download' | 'print' | 'send') => void;\r\n /** Show action toolbar. Default: false. */\r\n showActions?: boolean;\r\n /** Density. */\r\n density?: 'comfortable' | 'compact';\r\n}\r\n\r\nconst STATUS_COLOR: Record<InvoiceStatus, string> = {\r\n draft: 'var(--nice-color-muted, #6b7280)',\r\n issued: 'var(--nice-color-info, #2563eb)',\r\n sent: 'var(--nice-color-info, #2563eb)',\r\n paid: 'var(--nice-color-success, #16a34a)',\r\n 'partially-paid': 'var(--nice-color-warning, #ca8a04)',\r\n overdue: 'var(--nice-color-danger, #dc2626)',\r\n cancelled: 'var(--nice-color-muted, #6b7280)',\r\n};\r\n\r\nfunction lineNet(line: InvoiceLine): number {\r\n const gross = line.quantity * line.unitPrice.amount;\r\n const discounted = line.discount ? gross * (1 - line.discount) : gross;\r\n return Math.round(discounted);\r\n}\r\n\r\nfunction lineVat(line: InvoiceLine): number {\r\n return Math.round(lineNet(line) * line.vatRate);\r\n}\r\n\r\nfunction fmtMoney(amount: number, currency: string | { code: string; decimalPlaces?: number }, locale?: string): string {\r\n const code = typeof currency === 'string' ? currency : currency.code;\r\n const decimals = typeof currency === 'string' ? 2 : currency.decimalPlaces ?? 2;\r\n return new Intl.NumberFormat(locale, { style: 'currency', currency: code }).format(amount / Math.pow(10, decimals));\r\n}\r\nfunction fmtDate(d: Date | string, locale?: string): string {\r\n const dt = d instanceof Date ? d : new Date(d);\r\n return new Intl.DateTimeFormat(locale, { dateStyle: 'medium' }).format(dt);\r\n}\r\n\r\nexport const NiceInvoiceView = forwardRef<HTMLElement, NiceInvoiceViewProps>(\r\n function NiceInvoiceView(\r\n { invoice, locale, currency, hideSections, labels, onAction, showActions = false, density = 'comfortable', className, style, id },\r\n ref,\r\n ) {\r\n const cur = currency ?? invoice.currency ?? invoice.lines[0]?.unitPrice.currency ?? 'EUR';\r\n const L = {\r\n invoiceNumber: 'Invoice', issueDate: 'Issue date', dueDate: 'Due date',\r\n seller: 'Seller', buyer: 'Buyer', description: 'Description', qty: 'Qty',\r\n unitPrice: 'Unit price', vat: 'VAT', net: 'Net', gross: 'Gross',\r\n subtotal: 'Subtotal', vatTotal: 'VAT total', total: 'Total', status: 'Status',\r\n vatBreakdown: 'VAT breakdown', timeline: 'History', notes: 'Notes', vatId: 'VAT ID',\r\n ...labels,\r\n };\r\n\r\n const totals = useMemo(() => {\r\n let net = 0;\r\n let vat = 0;\r\n const byRate = new Map<number, { net: number; vat: number }>();\r\n for (const ln of invoice.lines) {\r\n const n = lineNet(ln);\r\n const v = lineVat(ln);\r\n net += n;\r\n vat += v;\r\n const cell = byRate.get(ln.vatRate) ?? { net: 0, vat: 0 };\r\n cell.net += n;\r\n cell.vat += v;\r\n byRate.set(ln.vatRate, cell);\r\n }\r\n return { net, vat, gross: net + vat, byRate };\r\n }, [invoice.lines]);\r\n\r\n return (\r\n <article\r\n ref={ref as React.Ref<HTMLElement>}\r\n id={id}\r\n className={`nice-invoice-view nice-invoice-view--${density} ${className ?? ''}`}\r\n style={style}\r\n aria-label={`${L.invoiceNumber} ${invoice.invoiceNumber}`}\r\n >\r\n {!hideSections?.header && (\r\n <header className=\"nice-invoice-view__header\">\r\n <div>\r\n <div className=\"nice-invoice-view__title\">\r\n {L.invoiceNumber} <strong>{invoice.invoiceNumber}</strong>\r\n </div>\r\n <div className=\"nice-invoice-view__dates\">\r\n <span>{L.issueDate}: {fmtDate(invoice.issueDate, locale)}</span>\r\n <span>{L.dueDate}: {fmtDate(invoice.dueDate, locale)}</span>\r\n </div>\r\n </div>\r\n <div className=\"nice-invoice-view__status\" style={{ color: STATUS_COLOR[invoice.status] }}>\r\n <span aria-hidden>●</span> {invoice.status}\r\n </div>\r\n {showActions && (\r\n <div className=\"nice-invoice-view__actions\">\r\n <button type=\"button\" onClick={() => onAction?.('download')}>↓</button>\r\n <button type=\"button\" onClick={() => onAction?.('print')}>⎙</button>\r\n <button type=\"button\" onClick={() => onAction?.('send')}>✉</button>\r\n </div>\r\n )}\r\n </header>\r\n )}\r\n\r\n {!hideSections?.header && (\r\n <section className=\"nice-invoice-view__parties\">\r\n <div>\r\n <h4>{L.seller}</h4>\r\n <div>{invoice.seller.name}</div>\r\n {invoice.seller.vatId && <div>{L.vatId}: {invoice.seller.vatId}</div>}\r\n </div>\r\n <div>\r\n <h4>{L.buyer}</h4>\r\n <div>{invoice.buyer.name}</div>\r\n {invoice.buyer.vatId && <div>{L.vatId}: {invoice.buyer.vatId}</div>}\r\n </div>\r\n </section>\r\n )}\r\n\r\n {!hideSections?.lines && (\r\n <table className=\"nice-invoice-view__lines\">\r\n <thead>\r\n <tr>\r\n <th>{L.description}</th>\r\n <th className=\"nice-num\">{L.qty}</th>\r\n <th className=\"nice-num\">{L.unitPrice}</th>\r\n <th className=\"nice-num\">{L.vat}</th>\r\n <th className=\"nice-num\">{L.net}</th>\r\n <th className=\"nice-num\">{L.gross}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {invoice.lines.map((ln) => {\r\n const n = lineNet(ln);\r\n const v = lineVat(ln);\r\n return (\r\n <tr key={ln.id}>\r\n <td>{ln.description}</td>\r\n <td className=\"nice-num\">{ln.quantity}{ln.unit ? ` ${ln.unit}` : ''}</td>\r\n <td className=\"nice-num\">{fmtMoney(ln.unitPrice.amount, cur, locale)}</td>\r\n <td className=\"nice-num\">{(ln.vatRate * 100).toFixed(0)}%</td>\r\n <td className=\"nice-num\">{fmtMoney(n, cur, locale)}</td>\r\n <td className=\"nice-num\">{fmtMoney(n + v, cur, locale)}</td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n )}\r\n\r\n {!hideSections?.vat && totals.byRate.size > 0 && (\r\n <section className=\"nice-invoice-view__vat\">\r\n <h4>{L.vatBreakdown}</h4>\r\n <table>\r\n <thead>\r\n <tr><th>{L.vat}</th><th className=\"nice-num\">{L.net}</th><th className=\"nice-num\">{L.vat}</th><th className=\"nice-num\">{L.gross}</th></tr>\r\n </thead>\r\n <tbody>\r\n {[...totals.byRate.entries()].sort((a, b) => b[0] - a[0]).map(([rate, c]) => (\r\n <tr key={rate}>\r\n <td>{(rate * 100).toFixed(0)}%</td>\r\n <td className=\"nice-num\">{fmtMoney(c.net, cur, locale)}</td>\r\n <td className=\"nice-num\">{fmtMoney(c.vat, cur, locale)}</td>\r\n <td className=\"nice-num\">{fmtMoney(c.net + c.vat, cur, locale)}</td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </section>\r\n )}\r\n\r\n {!hideSections?.totals && (\r\n <section className=\"nice-invoice-view__totals\" aria-label={L.total}>\r\n <div><span>{L.subtotal}</span><span>{fmtMoney(totals.net, cur, locale)}</span></div>\r\n <div><span>{L.vatTotal}</span><span>{fmtMoney(totals.vat, cur, locale)}</span></div>\r\n <div className=\"nice-invoice-view__grand\"><span>{L.total}</span><strong>{fmtMoney(totals.gross, cur, locale)}</strong></div>\r\n </section>\r\n )}\r\n\r\n {!hideSections?.timeline && invoice.history && invoice.history.length > 0 && (\r\n <section className=\"nice-invoice-view__timeline\">\r\n <h4>{L.timeline}</h4>\r\n <ol>\r\n {invoice.history.map((h, i) => (\r\n <li key={i}>\r\n <span className=\"nice-invoice-view__t-date\">{fmtDate(h.at, locale)}</span>\r\n <span className=\"nice-invoice-view__t-status\" style={{ color: STATUS_COLOR[h.status] }}>{h.status}</span>\r\n {h.note && <span className=\"nice-invoice-view__t-note\"> — {h.note}</span>}\r\n </li>\r\n ))}\r\n </ol>\r\n </section>\r\n )}\r\n\r\n {!hideSections?.notes && invoice.notes && (\r\n <section className=\"nice-invoice-view__notes\"><h4>{L.notes}</h4><p>{invoice.notes}</p></section>\r\n )}\r\n </article>\r\n );\r\n },\r\n);\r\n","/**\r\n * NiceWarehouseView — visual warehouse map with rack/shelf/bin grid and\r\n * occupancy heat-map.\r\n */\r\nimport type { NiceBaseProps } from '@nice2dev/ui-core';\r\nimport React, { forwardRef, useMemo, useState } from 'react';\r\n\r\nimport type { InventoryItem, WarehouseLocation } from './types';\r\n\r\nexport interface WarehouseCell {\r\n /** Composite location, used as React key (e.g. `A-12-3-B`). */\r\n location: WarehouseLocation;\r\n /** Items currently stored at the location. */\r\n items: InventoryItem[];\r\n /** 0..1 occupancy ratio. */\r\n occupancy: number;\r\n /** Optional row/col coordinates for layout. Otherwise derived from rack/aisle/shelf/bin. */\r\n row?: number;\r\n col?: number;\r\n}\r\n\r\nexport interface NiceWarehouseViewProps extends NiceBaseProps {\r\n /** Warehouse identifier (used in the title). */\r\n warehouseName: string;\r\n /** Cells to render. */\r\n cells: WarehouseCell[];\r\n /** Heat-map color stops (low → high). */\r\n colors?: { low: string; mid: string; high: string };\r\n /** Click handler for a cell. */\r\n onCellClick?: (cell: WarehouseCell) => void;\r\n /** Show legend (default `true`). */\r\n showLegend?: boolean;\r\n /** Cell size in px (default 48). */\r\n cellSize?: number;\r\n /** Optional aisle separators every N columns. */\r\n aisleEvery?: number;\r\n}\r\n\r\nfunction colorFor(occ: number, colors: { low: string; mid: string; high: string }): string {\r\n if (occ <= 0.01) {\r\n return colors.low;\r\n }\r\n if (occ < 0.5) {\r\n return colors.low;\r\n }\r\n if (occ < 0.85) {\r\n return colors.mid;\r\n }\r\n return colors.high;\r\n}\r\n\r\nexport const NiceWarehouseView = forwardRef<HTMLDivElement, NiceWarehouseViewProps>(\r\n function NiceWarehouseView(\r\n {\r\n warehouseName,\r\n cells,\r\n colors = { low: '#dcfce7', mid: '#fde68a', high: '#fecaca' },\r\n onCellClick,\r\n showLegend = true,\r\n cellSize = 48,\r\n aisleEvery = 4,\r\n className,\r\n style,\r\n id,\r\n },\r\n ref,\r\n ) {\r\n const [hovered, setHovered] = useState<WarehouseCell | null>(null);\r\n\r\n const grid = useMemo(() => {\r\n // If row/col are missing, derive a 2D layout from rack + bin.\r\n const rows = new Map<string, WarehouseCell[]>();\r\n for (const c of cells) {\r\n const rowKey =\r\n c.row !== undefined ? `r${c.row}` : (c.location.rack ?? c.location.aisle ?? '0');\r\n let arr = rows.get(rowKey);\r\n if (!arr) {\r\n arr = [];\r\n rows.set(rowKey, arr);\r\n }\r\n arr.push(c);\r\n }\r\n return [...rows.entries()].map(([rowKey, arr]) => ({ rowKey, cells: arr }));\r\n }, [cells]);\r\n\r\n return (\r\n <div ref={ref} id={id} className={`nice-warehouse-view ${className ?? ''}`} style={style}>\r\n <header className=\"nice-warehouse-view__header\">\r\n <h3>{warehouseName}</h3>\r\n {showLegend && (\r\n <div className=\"nice-warehouse-view__legend\" aria-label=\"Occupancy legend\">\r\n <span style={{ background: colors.low }} /> low\r\n <span style={{ background: colors.mid }} /> mid\r\n <span style={{ background: colors.high }} /> high\r\n </div>\r\n )}\r\n </header>\r\n <div className=\"nice-warehouse-view__grid\" role=\"grid\" aria-label={warehouseName}>\r\n {grid.map(({ rowKey, cells: row }) => (\r\n <div key={rowKey} className=\"nice-warehouse-view__row\" role=\"row\">\r\n {row.map((c, idx) => {\r\n const key =\r\n [c.location.rack, c.location.aisle, c.location.shelf, c.location.bin]\r\n .filter(Boolean)\r\n .join('-') || String(idx);\r\n const aisleBreak = aisleEvery > 0 && idx > 0 && idx % aisleEvery === 0;\r\n return (\r\n <React.Fragment key={key}>\r\n {aisleBreak && <div className=\"nice-warehouse-view__aisle\" aria-hidden />}\r\n <button\r\n type=\"button\"\r\n role=\"gridcell\"\r\n className=\"nice-warehouse-view__cell\"\r\n style={{\r\n width: cellSize,\r\n height: cellSize,\r\n background: colorFor(c.occupancy, colors),\r\n }}\r\n title={`${key} — ${(c.occupancy * 100).toFixed(0)}% (${c.items.length} items)`}\r\n onClick={() => onCellClick?.(c)}\r\n onMouseEnter={() => setHovered(c)}\r\n onMouseLeave={() => setHovered(null)}\r\n >\r\n <span className=\"nice-warehouse-view__bin\">\r\n {c.location.bin ?? c.location.shelf ?? ''}\r\n </span>\r\n </button>\r\n </React.Fragment>\r\n );\r\n })}\r\n </div>\r\n ))}\r\n </div>\r\n {hovered && (\r\n <aside className=\"nice-warehouse-view__details\" aria-live=\"polite\">\r\n <strong>\r\n {hovered.location.rack}/{hovered.location.shelf}/{hovered.location.bin}\r\n </strong>\r\n <div>\r\n {hovered.items.length} items ¡ {(hovered.occupancy * 100).toFixed(0)}% full\r\n </div>\r\n <ul>\r\n {hovered.items.slice(0, 5).map((it) => (\r\n <li key={it.id}>\r\n {it.sku} — {it.name}\r\n </li>\r\n ))}\r\n {hovered.items.length > 5 && <li>â€Ļ+{hovered.items.length - 5}</li>}\r\n </ul>\r\n </aside>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n","/**\r\n * NicePurchaseOrder — list + detail view for purchase orders.\r\n */\r\nimport type { NiceBaseProps } from '@nice2dev/ui-core';\r\nimport { forwardRef, useMemo, useState } from 'react';\r\n\r\nimport type {\r\n NicePurchaseOrderProps as BaseProps,\r\n PurchaseOrder,\r\n PurchaseOrderStatus,\r\n} from './types';\r\n\r\nexport interface NicePurchaseOrderViewProps extends BaseProps, NiceBaseProps {\r\n /** Show in list+detail master/detail mode (default `true`). */\r\n selectable?: boolean;\r\n /** Initial selection. */\r\n initialSelectedId?: string;\r\n /** Locale. */\r\n locale?: string;\r\n /** Custom labels. */\r\n labels?: Partial<{\r\n orderNumber: string;\r\n supplier: string;\r\n status: string;\r\n orderDate: string;\r\n expected: string;\r\n actual: string;\r\n total: string;\r\n items: string;\r\n sku: string;\r\n name: string;\r\n qty: string;\r\n received: string;\r\n unitPrice: string;\r\n lineTotal: string;\r\n notes: string;\r\n approve: string;\r\n cancel: string;\r\n receive: string;\r\n }>;\r\n}\r\n\r\nconst STATUS_TINT: Record<PurchaseOrderStatus, string> = {\r\n draft: '#6b7280',\r\n 'pending-approval': '#ca8a04',\r\n approved: '#2563eb',\r\n ordered: '#0891b2',\r\n 'partially-received': '#9333ea',\r\n received: '#16a34a',\r\n cancelled: '#dc2626',\r\n};\r\n\r\nfunction fmtMoney(\r\n amount: number,\r\n currency: { code: string; decimalPlaces?: number } | string,\r\n locale?: string,\r\n): string {\r\n const code = typeof currency === 'string' ? currency : currency.code;\r\n const decimals = typeof currency === 'string' ? 2 : (currency.decimalPlaces ?? 2);\r\n return new Intl.NumberFormat(locale, { style: 'currency', currency: code }).format(\r\n amount / Math.pow(10, decimals),\r\n );\r\n}\r\nfunction fmtDate(d?: Date | string, locale?: string): string {\r\n if (!d) {\r\n return '—';\r\n }\r\n const dt = d instanceof Date ? d : new Date(d);\r\n return new Intl.DateTimeFormat(locale, { dateStyle: 'medium' }).format(dt);\r\n}\r\n\r\nexport const NicePurchaseOrder = forwardRef<HTMLDivElement, NicePurchaseOrderViewProps>(\r\n function NicePurchaseOrder(\r\n {\r\n orders,\r\n selectable = true,\r\n initialSelectedId,\r\n locale,\r\n labels,\r\n readOnly,\r\n onOrderApprove,\r\n onReceiveItems,\r\n onOrderUpdate,\r\n className,\r\n style,\r\n id,\r\n },\r\n ref,\r\n ) {\r\n const [selectedId, setSelectedId] = useState<string | undefined>(\r\n initialSelectedId ?? orders[0]?.id,\r\n );\r\n const L = {\r\n orderNumber: 'PO #',\r\n supplier: 'Supplier',\r\n status: 'Status',\r\n orderDate: 'Ordered',\r\n expected: 'Expected',\r\n actual: 'Received',\r\n total: 'Total',\r\n items: 'Items',\r\n sku: 'SKU',\r\n name: 'Item',\r\n qty: 'Qty',\r\n received: 'Recv',\r\n unitPrice: 'Unit',\r\n lineTotal: 'Subtotal',\r\n notes: 'Notes',\r\n approve: 'Approve',\r\n cancel: 'Cancel',\r\n receive: 'Receive all',\r\n ...labels,\r\n };\r\n\r\n const selected: PurchaseOrder | undefined = useMemo(\r\n () => orders.find((o) => o.id === selectedId),\r\n [orders, selectedId],\r\n );\r\n\r\n return (\r\n <div ref={ref} id={id} className={`nice-purchase-order ${className ?? ''}`} style={style}>\r\n <table className=\"nice-purchase-order__list\">\r\n <thead>\r\n <tr>\r\n <th>{L.orderNumber}</th>\r\n <th>{L.supplier}</th>\r\n <th>{L.status}</th>\r\n <th>{L.orderDate}</th>\r\n <th>{L.expected}</th>\r\n <th className=\"nice-num\">{L.total}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {orders.map((o) => (\r\n <tr\r\n key={o.id}\r\n aria-selected={o.id === selectedId}\r\n className={o.id === selectedId ? 'is-selected' : undefined}\r\n onClick={() => selectable && setSelectedId(o.id)}\r\n >\r\n <td>{o.orderNumber}</td>\r\n <td>{o.supplier.name}</td>\r\n <td>\r\n <span style={{ color: STATUS_TINT[o.status] }}>● {o.status}</span>\r\n </td>\r\n <td>{fmtDate(o.orderDate, locale)}</td>\r\n <td>{fmtDate(o.expectedDelivery, locale)}</td>\r\n <td className=\"nice-num\">{fmtMoney(o.total.amount, o.total.currency, locale)}</td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n\r\n {selectable && selected && (\r\n <section\r\n className=\"nice-purchase-order__detail\"\r\n aria-label={`${L.orderNumber} ${selected.orderNumber}`}\r\n >\r\n <header>\r\n <h3>\r\n {selected.orderNumber} — {selected.supplier.name}\r\n </h3>\r\n {!readOnly && (\r\n <div className=\"nice-purchase-order__actions\">\r\n {selected.status === 'pending-approval' && onOrderApprove && (\r\n <button type=\"button\" onClick={() => onOrderApprove(selected.id)}>\r\n {L.approve}\r\n </button>\r\n )}\r\n {(selected.status === 'ordered' || selected.status === 'partially-received') &&\r\n onReceiveItems && (\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n onReceiveItems(\r\n selected.id,\r\n selected.items.map((it) => ({\r\n itemId: it.itemId,\r\n quantity: it.quantity - (it.receivedQuantity ?? 0),\r\n })),\r\n )\r\n }\r\n >\r\n {L.receive}\r\n </button>\r\n )}\r\n {onOrderUpdate && selected.status === 'draft' && (\r\n <button\r\n type=\"button\"\r\n onClick={() => onOrderUpdate({ ...selected, status: 'pending-approval' })}\r\n >\r\n Submit\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </header>\r\n <table className=\"nice-purchase-order__items\">\r\n <thead>\r\n <tr>\r\n <th>{L.sku}</th>\r\n <th>{L.name}</th>\r\n <th className=\"nice-num\">{L.qty}</th>\r\n <th className=\"nice-num\">{L.received}</th>\r\n <th className=\"nice-num\">{L.unitPrice}</th>\r\n <th className=\"nice-num\">{L.lineTotal}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {selected.items.map((it) => (\r\n <tr key={it.itemId}>\r\n <td>{it.sku}</td>\r\n <td>{it.itemName}</td>\r\n <td className=\"nice-num\">{it.quantity}</td>\r\n <td className=\"nice-num\">{it.receivedQuantity ?? 0}</td>\r\n <td className=\"nice-num\">\r\n {fmtMoney(it.unitPrice.amount, it.unitPrice.currency, locale)}\r\n </td>\r\n <td className=\"nice-num\">\r\n {fmtMoney(it.lineTotal.amount, it.lineTotal.currency, locale)}\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n <tfoot>\r\n <tr>\r\n <td colSpan={5} className=\"nice-num\">\r\n {L.total}\r\n </td>\r\n <td className=\"nice-num\">\r\n <strong>\r\n {fmtMoney(selected.total.amount, selected.total.currency, locale)}\r\n </strong>\r\n </td>\r\n </tr>\r\n </tfoot>\r\n </table>\r\n {selected.notes && (\r\n <p className=\"nice-purchase-order__notes\">\r\n <strong>{L.notes}:</strong> {selected.notes}\r\n </p>\r\n )}\r\n </section>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n","/**\r\n * NiceHRDashboard — at-a-glance HR widgets (FTE, headcount, vacation, sick).\r\n */\r\nimport type { NiceBaseProps } from '@nice2dev/ui-core';\r\nimport React, { forwardRef, useMemo } from 'react';\r\n\r\nimport type { Employee } from './types';\r\n\r\nexport interface NiceHRDashboardProps extends NiceBaseProps {\r\n employees: Employee[];\r\n /** Custom widget labels. */\r\n labels?: Partial<{\r\n headcount: string; fte: string; vacationBalance: string; sickLeave: string;\r\n departments: string; activeEmployees: string;\r\n }>;\r\n /** Hide individual widgets. */\r\n hideWidgets?: Partial<{ headcount: boolean; fte: boolean; vacation: boolean; sick: boolean; departments: boolean }>;\r\n /** Locale for number formatting. */\r\n locale?: string;\r\n /** Density. */\r\n density?: 'comfortable' | 'compact';\r\n /** Click handler for a widget — useful for drilldowns. */\r\n onWidgetClick?: (widget: 'headcount' | 'fte' | 'vacation' | 'sick' | 'departments') => void;\r\n}\r\n\r\ninterface Stats {\r\n headcount: number;\r\n active: number;\r\n fte: number;\r\n vacationAvg: number;\r\n sickAvg: number;\r\n byDepartment: Map<string, number>;\r\n}\r\n\r\nexport const NiceHRDashboard = forwardRef<HTMLDivElement, NiceHRDashboardProps>(\r\n function NiceHRDashboard(\r\n { employees, labels, hideWidgets, locale, density = 'comfortable', onWidgetClick, className, style, id },\r\n ref,\r\n ) {\r\n const L = {\r\n headcount: 'Headcount', fte: 'FTE', vacationBalance: 'Avg vacation balance',\r\n sickLeave: 'Avg sick days (YTD)', departments: 'Departments', activeEmployees: 'Active',\r\n ...labels,\r\n };\r\n\r\n const stats: Stats = useMemo(() => {\r\n const active = employees.filter((e) => e.active !== false);\r\n const fte = active.reduce((s, e) => s + (e.fte ?? 1), 0);\r\n const vacationAvg = active.length === 0 ? 0 : active.reduce((s, e) => s + (e.vacationBalanceDays ?? 0), 0) / active.length;\r\n const sickAvg = active.length === 0 ? 0 : active.reduce((s, e) => s + (e.sickLeaveDaysYtd ?? 0), 0) / active.length;\r\n const byDepartment = new Map<string, number>();\r\n for (const e of active) {\r\n const k = e.department ?? '—';\r\n byDepartment.set(k, (byDepartment.get(k) ?? 0) + 1);\r\n }\r\n return { headcount: employees.length, active: active.length, fte, vacationAvg, sickAvg, byDepartment };\r\n }, [employees]);\r\n\r\n const fmt = (n: number, d = 1): string => n.toLocaleString(locale, { maximumFractionDigits: d });\r\n\r\n const Widget: React.FC<{\r\n kind: 'headcount' | 'fte' | 'vacation' | 'sick' | 'departments';\r\n label: string;\r\n value: React.ReactNode;\r\n hint?: React.ReactNode;\r\n }> = ({ kind, label, value, hint }) => (\r\n <button\r\n type=\"button\"\r\n className=\"nice-hr-dashboard__widget\"\r\n onClick={() => onWidgetClick?.(kind)}\r\n >\r\n <span className=\"nice-hr-dashboard__label\">{label}</span>\r\n <span className=\"nice-hr-dashboard__value\">{value}</span>\r\n {hint && <span className=\"nice-hr-dashboard__hint\">{hint}</span>}\r\n </button>\r\n );\r\n\r\n return (\r\n <div ref={ref} id={id} className={`nice-hr-dashboard nice-hr-dashboard--${density} ${className ?? ''}`} style={style} role=\"group\" aria-label=\"HR dashboard\">\r\n {!hideWidgets?.headcount && (\r\n <Widget kind=\"headcount\" label={L.headcount} value={fmt(stats.headcount, 0)} hint={`${L.activeEmployees}: ${fmt(stats.active, 0)}`} />\r\n )}\r\n {!hideWidgets?.fte && <Widget kind=\"fte\" label={L.fte} value={fmt(stats.fte, 2)} />}\r\n {!hideWidgets?.vacation && <Widget kind=\"vacation\" label={L.vacationBalance} value={`${fmt(stats.vacationAvg, 1)} d`} />}\r\n {!hideWidgets?.sick && <Widget kind=\"sick\" label={L.sickLeave} value={`${fmt(stats.sickAvg, 1)} d`} />}\r\n {!hideWidgets?.departments && (\r\n <Widget\r\n kind=\"departments\"\r\n label={L.departments}\r\n value={fmt(stats.byDepartment.size, 0)}\r\n hint={\r\n <ul className=\"nice-hr-dashboard__dept-list\">\r\n {[...stats.byDepartment.entries()].slice(0, 5).map(([d, n]) => (\r\n <li key={d}>{d}: {n}</li>\r\n ))}\r\n </ul>\r\n }\r\n />\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n","/**\r\n * @nice2dev/ui-erp — mock ERP API hook for tests, Storybook, and demos.\r\n */\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\n\r\nimport type {\r\n Employee,\r\n InventoryItem,\r\n Invoice,\r\n PurchaseOrder,\r\n Resource,\r\n Supplier,\r\n VatRate,\r\n} from './types';\r\n\r\nexport interface MockErpApi {\r\n loading: boolean;\r\n error: Error | null;\r\n invoices: Invoice[];\r\n purchaseOrders: PurchaseOrder[];\r\n inventory: InventoryItem[];\r\n suppliers: Supplier[];\r\n employees: Employee[];\r\n resources: Resource[];\r\n vatRates: VatRate[];\r\n refresh: () => Promise<void>;\r\n upsertInvoice: (invoice: Invoice) => Promise<void>;\r\n upsertPurchaseOrder: (po: PurchaseOrder) => Promise<void>;\r\n upsertInventory: (item: InventoryItem) => Promise<void>;\r\n}\r\n\r\nexport interface UseMockErpApiOptions {\r\n /** Artificial latency in ms (default 300). */\r\n latencyMs?: number;\r\n /** Probability (0..1) that a write will reject — handy for error-state UI testing. */\r\n errorRate?: number;\r\n /** Seed data overrides. */\r\n seed?: Partial<{\r\n invoices: Invoice[];\r\n purchaseOrders: PurchaseOrder[];\r\n inventory: InventoryItem[];\r\n suppliers: Supplier[];\r\n employees: Employee[];\r\n resources: Resource[];\r\n vatRates: VatRate[];\r\n }>;\r\n}\r\n\r\nconst wait = (ms: number): Promise<void> => new Promise((r) => setTimeout(r, ms));\r\n\r\nexport const NICE_VAT_PRESETS: Record<'PL' | 'EU' | 'UK', VatRate[]> = {\r\n PL: [\r\n { code: 'PL-23', rate: 0.23, label: '23%', description: 'Stawka podstawowa' },\r\n { code: 'PL-8', rate: 0.08, label: '8%', description: 'Stawka obniÅŧona' },\r\n { code: 'PL-5', rate: 0.05, label: '5%', description: 'Stawka obniÅŧona' },\r\n { code: 'PL-0', rate: 0, label: '0%', description: 'Stawka zerowa (eksport)' },\r\n { code: 'PL-zw', rate: 0, label: 'zw.', description: 'Zwolnienie' },\r\n ],\r\n EU: [\r\n { code: 'EU-21', rate: 0.21, label: '21%' },\r\n { code: 'EU-19', rate: 0.19, label: '19%' },\r\n { code: 'EU-9', rate: 0.09, label: '9%' },\r\n { code: 'EU-0', rate: 0, label: '0%' },\r\n ],\r\n UK: [\r\n { code: 'UK-20', rate: 0.2, label: '20%', description: 'Standard' },\r\n { code: 'UK-5', rate: 0.05, label: '5%', description: 'Reduced' },\r\n { code: 'UK-0', rate: 0, label: '0%', description: 'Zero' },\r\n ],\r\n};\r\n\r\nconst DEFAULT_SEED: Required<NonNullable<UseMockErpApiOptions['seed']>> = {\r\n invoices: [],\r\n purchaseOrders: [],\r\n inventory: [],\r\n suppliers: [],\r\n employees: [],\r\n resources: [],\r\n vatRates: NICE_VAT_PRESETS.PL,\r\n};\r\n\r\n/**\r\n * Hook returning a mock ERP API with simulated loading/error states.\r\n * Useful for storybook stories, integration tests, and offline demos.\r\n */\r\nexport function useMockErpApi(options: UseMockErpApiOptions = {}): MockErpApi {\r\n const { latencyMs = 300, errorRate = 0, seed } = options;\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<Error | null>(null);\r\n const [data, setData] = useState(() => ({ ...DEFAULT_SEED, ...seed }));\r\n const settledRef = useRef(false);\r\n\r\n const refresh = useCallback(async () => {\r\n setLoading(true);\r\n setError(null);\r\n await wait(latencyMs);\r\n if (Math.random() < errorRate) {\r\n setError(new Error('Mock ERP API: simulated failure'));\r\n } else {\r\n setData((d) => ({ ...d }));\r\n }\r\n setLoading(false);\r\n }, [latencyMs, errorRate]);\r\n\r\n useEffect(() => {\r\n if (settledRef.current) {\r\n return;\r\n }\r\n settledRef.current = true;\r\n void refresh();\r\n }, [refresh]);\r\n\r\n const writeWith = useCallback(\r\n async <K extends keyof typeof DEFAULT_SEED>(key: K, item: (typeof DEFAULT_SEED)[K][number]) => {\r\n await wait(latencyMs);\r\n if (Math.random() < errorRate) {\r\n throw new Error('Mock ERP API: write failed');\r\n }\r\n setData((d) => {\r\n const arr = [...(d[key] as Array<{ id: string }>)];\r\n const idx = arr.findIndex((i) => i.id === (item as { id: string }).id);\r\n if (idx >= 0) {\r\n arr[idx] = item as (typeof arr)[number];\r\n } else {\r\n arr.push(item as (typeof arr)[number]);\r\n }\r\n return { ...d, [key]: arr } as typeof d;\r\n });\r\n },\r\n [latencyMs, errorRate],\r\n );\r\n\r\n return useMemo<MockErpApi>(\r\n () => ({\r\n loading,\r\n error,\r\n invoices: data.invoices,\r\n purchaseOrders: data.purchaseOrders,\r\n inventory: data.inventory,\r\n suppliers: data.suppliers,\r\n employees: data.employees,\r\n resources: data.resources,\r\n vatRates: data.vatRates,\r\n refresh,\r\n upsertInvoice: (i) => writeWith('invoices', i),\r\n upsertPurchaseOrder: (p) => writeWith('purchaseOrders', p),\r\n upsertInventory: (i) => writeWith('inventory', i),\r\n }),\r\n [loading, error, data, refresh, writeWith],\r\n );\r\n}\r\n","/**\r\n * NiceVatTable — editable VAT-rate table with PL/EU/UK presets.\r\n */\r\nimport type { NiceBaseProps } from '@nice2dev/ui-core';\r\nimport { forwardRef, useCallback, useState } from 'react';\r\n\r\nimport type { VatRate } from './types';\r\nimport { NICE_VAT_PRESETS } from './useMockErpApi';\r\n\r\nexport interface NiceVatTableProps extends NiceBaseProps {\r\n /** Country/preset (used when `rates` not supplied). */\r\n country?: 'PL' | 'EU' | 'UK';\r\n /** Explicit rates (override preset). */\r\n rates?: VatRate[];\r\n /** Allow inline editing. */\r\n editable?: boolean;\r\n /** Notify on rate change. */\r\n onChange?: (rates: VatRate[]) => void;\r\n /** Called when a row is removed. */\r\n onRemove?: (code: string) => void;\r\n /** Locale for percentage formatting. */\r\n locale?: string;\r\n /** Custom labels. */\r\n labels?: Partial<{\r\n code: string;\r\n rate: string;\r\n label: string;\r\n description: string;\r\n add: string;\r\n remove: string;\r\n }>;\r\n /** Density. */\r\n density?: 'comfortable' | 'compact';\r\n}\r\n\r\nexport const NiceVatTable = forwardRef<HTMLDivElement, NiceVatTableProps>(function NiceVatTable(\r\n {\r\n country = 'PL',\r\n rates,\r\n editable = false,\r\n onChange,\r\n onRemove,\r\n locale,\r\n labels,\r\n density = 'comfortable',\r\n className,\r\n style,\r\n id,\r\n },\r\n ref,\r\n) {\r\n const [internal, setInternal] = useState<VatRate[]>(rates ?? NICE_VAT_PRESETS[country]);\r\n const L = {\r\n code: 'Code',\r\n rate: 'Rate',\r\n label: 'Label',\r\n description: 'Description',\r\n add: '+ Add',\r\n remove: 'Remove',\r\n ...labels,\r\n };\r\n\r\n const update = useCallback(\r\n (next: VatRate[]) => {\r\n setInternal(next);\r\n onChange?.(next);\r\n },\r\n [onChange],\r\n );\r\n\r\n const onCellEdit = (idx: number, key: keyof VatRate, raw: string): void => {\r\n const next = [...internal];\r\n const r = { ...next[idx] };\r\n if (key === 'rate') {\r\n const n = Number(raw.replace(',', '.'));\r\n if (!Number.isFinite(n)) {\r\n return;\r\n }\r\n r.rate = n > 1 ? n / 100 : n;\r\n } else if (key === 'code' || key === 'label' || key === 'description') {\r\n (r as Record<string, unknown>)[key] = raw;\r\n }\r\n next[idx] = r;\r\n update(next);\r\n };\r\n\r\n const addRow = (): void => {\r\n update([...internal, { code: `NEW-${internal.length + 1}`, rate: 0, label: '0%' }]);\r\n };\r\n\r\n const removeRow = (idx: number): void => {\r\n const code = internal[idx].code;\r\n const next = internal.filter((_, i) => i !== idx);\r\n update(next);\r\n onRemove?.(code);\r\n };\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n id={id}\r\n className={`nice-vat-table nice-vat-table--${density} ${className ?? ''}`}\r\n style={style}\r\n >\r\n <table>\r\n <thead>\r\n <tr>\r\n <th>{L.code}</th>\r\n <th className=\"nice-num\">{L.rate}</th>\r\n <th>{L.label}</th>\r\n <th>{L.description}</th>\r\n {editable && <th aria-label={L.remove} />}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {internal.map((r, idx) => (\r\n <tr key={r.code}>\r\n <td>\r\n {editable ? (\r\n <input value={r.code} onChange={(e) => onCellEdit(idx, 'code', e.target.value)} />\r\n ) : (\r\n r.code\r\n )}\r\n </td>\r\n <td className=\"nice-num\">\r\n {editable ? (\r\n <input\r\n type=\"number\"\r\n step=\"0.01\"\r\n min={0}\r\n max={1}\r\n value={r.rate}\r\n onChange={(e) => onCellEdit(idx, 'rate', e.target.value)}\r\n />\r\n ) : (\r\n `${(r.rate * 100).toLocaleString(locale, { maximumFractionDigits: 2 })}%`\r\n )}\r\n </td>\r\n <td>\r\n {editable ? (\r\n <input\r\n value={r.label ?? ''}\r\n onChange={(e) => onCellEdit(idx, 'label', e.target.value)}\r\n />\r\n ) : (\r\n (r.label ?? '')\r\n )}\r\n </td>\r\n <td>\r\n {editable ? (\r\n <input\r\n value={r.description ?? ''}\r\n onChange={(e) => onCellEdit(idx, 'description', e.target.value)}\r\n />\r\n ) : (\r\n (r.description ?? '')\r\n )}\r\n </td>\r\n {editable && (\r\n <td>\r\n <button type=\"button\" onClick={() => removeRow(idx)} aria-label={L.remove}>\r\n ×\r\n </button>\r\n </td>\r\n )}\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n {editable && (\r\n <button type=\"button\" className=\"nice-vat-table__add\" onClick={addRow}>\r\n {L.add}\r\n </button>\r\n )}\r\n </div>\r\n );\r\n});\r\n","/**\r\n * NiceJpkExporter — generates Polish JPK_V7M / JPK_FA XML for invoices.\r\n * NOTE: schemas in this initial release are simplified and intended for\r\n * UI/dev workflows; production exports should use a verified XSD.\r\n */\r\nimport type { NiceBaseProps } from '@nice2dev/ui-core';\r\nimport { forwardRef, useCallback, useState } from 'react';\r\n\r\nimport type { Invoice, JpkExportOptions } from './types';\r\n\r\nexport interface NiceJpkExporterProps extends NiceBaseProps {\r\n invoices: Invoice[];\r\n taxpayer: JpkExportOptions['taxpayer'];\r\n /** Default export format. */\r\n defaultFormat?: JpkExportOptions['format'];\r\n /** Default reporting period. */\r\n defaultPeriod?: { from: Date; to: Date };\r\n /** Custom XML builder (advanced override). */\r\n buildXml?: (opts: JpkExportOptions) => string;\r\n /** Called with the produced XML and Blob. */\r\n onExport?: (xml: string, blob: Blob, opts: JpkExportOptions) => void;\r\n /** Filename helper (default: `JPK_V7M_${YYYY}-${MM}.xml`). */\r\n filenameFor?: (opts: JpkExportOptions) => string;\r\n /** Custom labels. */\r\n labels?: Partial<{\r\n format: string;\r\n period: string;\r\n from: string;\r\n to: string;\r\n export: string;\r\n download: string;\r\n }>;\r\n}\r\n\r\nfunction pad(n: number): string {\r\n return n < 10 ? `0${n}` : String(n);\r\n}\r\nfunction isoDate(d: Date): string {\r\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\r\n}\r\n\r\nfunction escapeXml(s: string): string {\r\n return s\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&apos;');\r\n}\r\n\r\nfunction defaultBuildXml(opts: JpkExportOptions): string {\r\n const { format, period, taxpayer, invoices } = opts;\r\n const lines: string[] = [];\r\n lines.push('<?xml version=\"1.0\" encoding=\"UTF-8\"?>');\r\n lines.push(`<JPK xmlns=\"http://jpk.mf.gov.pl/wzor/2022/01/01/${format}/\" formCode=\"${format}\">`);\r\n lines.push(' <Naglowek>');\r\n lines.push(` <KodFormularza>${format}</KodFormularza>`);\r\n lines.push(` <DataOd>${isoDate(period.from)}</DataOd>`);\r\n lines.push(` <DataDo>${isoDate(period.to)}</DataDo>`);\r\n lines.push(' </Naglowek>');\r\n lines.push(' <Podmiot1>');\r\n lines.push(` <NIP>${escapeXml(taxpayer.nip)}</NIP>`);\r\n lines.push(` <PelnaNazwa>${escapeXml(taxpayer.name)}</PelnaNazwa>`);\r\n if (taxpayer.regon) {\r\n lines.push(` <REGON>${escapeXml(taxpayer.regon)}</REGON>`);\r\n }\r\n lines.push(' </Podmiot1>');\r\n for (const inv of invoices) {\r\n lines.push(' <Faktura>');\r\n lines.push(` <NumerFaktury>${escapeXml(inv.invoiceNumber)}</NumerFaktury>`);\r\n lines.push(\r\n ` <DataWystawienia>${isoDate(inv.issueDate instanceof Date ? inv.issueDate : new Date(inv.issueDate))}</DataWystawienia>`,\r\n );\r\n lines.push(` <NazwaNabywcy>${escapeXml(inv.buyer.name)}</NazwaNabywcy>`);\r\n if (inv.buyer.vatId) {\r\n lines.push(` <NIPNabywcy>${escapeXml(inv.buyer.vatId)}</NIPNabywcy>`);\r\n }\r\n let net = 0;\r\n let vat = 0;\r\n for (const ln of inv.lines) {\r\n const n = Math.round(ln.quantity * ln.unitPrice.amount * (1 - (ln.discount ?? 0)));\r\n const v = Math.round(n * ln.vatRate);\r\n net += n;\r\n vat += v;\r\n }\r\n lines.push(` <SumaNetto>${(net / 100).toFixed(2)}</SumaNetto>`);\r\n lines.push(` <SumaVAT>${(vat / 100).toFixed(2)}</SumaVAT>`);\r\n lines.push(` <SumaBrutto>${((net + vat) / 100).toFixed(2)}</SumaBrutto>`);\r\n lines.push(' </Faktura>');\r\n }\r\n lines.push('</JPK>');\r\n return lines.join('\\n');\r\n}\r\n\r\nexport const NiceJpkExporter = forwardRef<HTMLDivElement, NiceJpkExporterProps>(\r\n function NiceJpkExporter(\r\n {\r\n invoices,\r\n taxpayer,\r\n defaultFormat = 'JPK_V7M',\r\n defaultPeriod,\r\n buildXml = defaultBuildXml,\r\n onExport,\r\n filenameFor,\r\n labels,\r\n className,\r\n style,\r\n id,\r\n },\r\n ref,\r\n ) {\r\n const today = new Date();\r\n const [format, setFormat] = useState<JpkExportOptions['format']>(defaultFormat);\r\n const [from, setFrom] = useState<string>(\r\n isoDate(defaultPeriod?.from ?? new Date(today.getFullYear(), today.getMonth(), 1)),\r\n );\r\n const [to, setTo] = useState<string>(\r\n isoDate(defaultPeriod?.to ?? new Date(today.getFullYear(), today.getMonth() + 1, 0)),\r\n );\r\n const L = {\r\n format: 'Format',\r\n period: 'Period',\r\n from: 'From',\r\n to: 'To',\r\n export: 'Export',\r\n download: 'Download',\r\n ...labels,\r\n };\r\n\r\n const exportNow = useCallback(() => {\r\n const opts: JpkExportOptions = {\r\n format,\r\n period: { from: new Date(from), to: new Date(to) },\r\n taxpayer,\r\n invoices,\r\n };\r\n const xml = buildXml(opts);\r\n const blob = new Blob([xml], { type: 'application/xml' });\r\n const filename = filenameFor?.(opts) ?? `${format}_${from}_${to}.xml`;\r\n onExport?.(xml, blob, opts);\r\n // Trigger browser download\r\n if (typeof window !== 'undefined' && typeof URL.createObjectURL === 'function') {\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = filename;\r\n document.body.appendChild(a);\r\n a.click();\r\n a.remove();\r\n URL.revokeObjectURL(url);\r\n }\r\n }, [format, from, to, taxpayer, invoices, buildXml, onExport, filenameFor]);\r\n\r\n return (\r\n <div ref={ref} id={id} className={`nice-jpk-exporter ${className ?? ''}`} style={style}>\r\n <label>\r\n {L.format}\r\n <select\r\n value={format}\r\n onChange={(e) => setFormat(e.target.value as JpkExportOptions['format'])}\r\n >\r\n <option value=\"JPK_V7M\">JPK_V7M</option>\r\n <option value=\"JPK_V7K\">JPK_V7K</option>\r\n <option value=\"JPK_FA\">JPK_FA</option>\r\n </select>\r\n </label>\r\n <label>\r\n {L.from}\r\n <input type=\"date\" value={from} onChange={(e) => setFrom(e.target.value)} />\r\n </label>\r\n <label>\r\n {L.to}\r\n <input type=\"date\" value={to} onChange={(e) => setTo(e.target.value)} />\r\n </label>\r\n <button type=\"button\" onClick={exportNow}>\r\n {L.export}\r\n </button>\r\n <small>{invoices.length} invoices ready</small>\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nexport { defaultBuildXml as buildJpkXml };\r\n"],"names":["DEFAULT_VIEW_CONFIG","_a","_b","fmtMoney","fmtDate","NiceInvoiceView","NiceWarehouseView","NicePurchaseOrder","NiceHRDashboard","NiceVatTable","NiceJpkExporter"],"mappings":"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"}