'use client'; export const dynamic = 'force-dynamic'; import React, { useState, useRef } from 'react'; import { Card } from 'primereact/card'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { Button } from 'primereact/button'; import { Tag } from 'primereact/tag'; import { InputText } from 'primereact/inputtext'; import { Dialog } from 'primereact/dialog'; import { InputNumber } from 'primereact/inputnumber'; import { InputTextarea } from 'primereact/inputtextarea'; import { Dropdown } from 'primereact/dropdown'; import { Toast } from 'primereact/toast'; import { Menu } from 'primereact/menu'; import { Badge } from 'primereact/badge'; import { useStocks } from '../../../../hooks/useStocks'; import { Stock, StockAlert, StockStats, StatutStock, CategorieStock } from '../../../../types/stocks'; const DashboardStocksPage = () => { const { stocks, loading, refresh, entreeStock, sortieStock, inventaire, reserverStock } = useStocks(); const [globalFilter, setGlobalFilter] = useState(''); const [selectedStock, setSelectedStock] = useState(null); const [showEntreeDialog, setShowEntreeDialog] = useState(false); const [showSortieDialog, setShowSortieDialog] = useState(false); const [showInventaireDialog, setShowInventaireDialog] = useState(false); const [showReservationDialog, setShowReservationDialog] = useState(false); const [quantite, setQuantite] = useState(0); const [coutUnitaire, setCoutUnitaire] = useState(0); const [motif, setMotif] = useState(''); const [quantiteReelle, setQuantiteReelle] = useState(0); const [observations, setObservations] = useState(''); const toast = useRef(null); const menuRef = useRef(null); const statutColors: Record = { [StatutStock.ACTIF]: 'success', [StatutStock.INACTIF]: 'warning', [StatutStock.OBSOLETE]: 'warning', [StatutStock.SUPPRIME]: 'danger', [StatutStock.EN_COMMANDE]: 'info', [StatutStock.EN_TRANSIT]: 'info', [StatutStock.EN_CONTROLE]: 'warning', [StatutStock.QUARANTAINE]: 'danger', [StatutStock.DEFECTUEUX]: 'danger', [StatutStock.PERDU]: 'danger', [StatutStock.RESERVE]: 'info', [StatutStock.EN_REPARATION]: 'warning' }; const categorieLabels: Record = { [CategorieStock.MATERIAUX_CONSTRUCTION]: 'Matériaux', [CategorieStock.OUTILLAGE]: 'Outillage', [CategorieStock.QUINCAILLERIE]: 'Quincaillerie', [CategorieStock.EQUIPEMENTS_SECURITE]: 'Sécurité', [CategorieStock.EQUIPEMENTS_TECHNIQUES]: 'Technique', [CategorieStock.CONSOMMABLES]: 'Consommables', [CategorieStock.VEHICULES_ENGINS]: 'Véhicules', [CategorieStock.FOURNITURES_BUREAU]: 'Bureau', [CategorieStock.PRODUITS_CHIMIQUES]: 'Chimiques', [CategorieStock.PIECES_DETACHEES]: 'Pièces', [CategorieStock.EQUIPEMENTS_MESURE]: 'Mesure', [CategorieStock.MOBILIER]: 'Mobilier', [CategorieStock.AUTRE]: 'Autre' }; const statutTemplate = (stock: Stock) => { return ; }; const categorieTemplate = (stock: Stock) => { return ; }; const quantiteTemplate = (stock: Stock) => { const quantiteDisponible = stock.quantiteStock - (stock.quantiteReservee || 0); const severity = stock.quantiteStock === 0 ? 'danger' : stock.quantiteMinimum && stock.quantiteStock < stock.quantiteMinimum ? 'warning' : 'success'; return (
{stock.quantiteReservee && stock.quantiteReservee > 0 && ( ({quantiteDisponible} dispo) )}
); }; const valeurTemplate = (stock: Stock) => { const valeur = stock.quantiteStock * (stock.coutMoyenPondere || 0); return new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR' }).format(valeur); }; const emplacementTemplate = (stock: Stock) => { const parts = []; if (stock.codeZone) parts.push(stock.codeZone); if (stock.codeAllee) parts.push(stock.codeAllee); if (stock.codeEtagere) parts.push(stock.codeEtagere); return parts.join('-') || stock.emplacementStockage || '-'; }; const alertesTemplate = (stock: Stock) => { const alertes = []; if (stock.quantiteStock === 0) { alertes.push(); } else if (stock.quantiteMinimum && stock.quantiteStock < stock.quantiteMinimum) { alertes.push(); } if (stock.datePeremption && new Date(stock.datePeremption) < new Date()) { alertes.push(); } if (stock.articleDangereux) { alertes.push(); } return
{alertes}
; }; const actionTemplate = (stock: Stock) => { const items = [ { label: 'Entrée de stock', icon: 'pi pi-plus', command: () => { setSelectedStock(stock); setQuantite(0); setCoutUnitaire(stock.coutDerniereEntree || 0); setMotif(''); setShowEntreeDialog(true); } }, { label: 'Sortie de stock', icon: 'pi pi-minus', command: () => { setSelectedStock(stock); setQuantite(0); setMotif(''); setShowSortieDialog(true); } }, { label: 'Inventaire', icon: 'pi pi-check-square', command: () => { setSelectedStock(stock); setQuantiteReelle(stock.quantiteStock); setObservations(''); setShowInventaireDialog(true); } }, { label: 'Réserver', icon: 'pi pi-lock', command: () => { setSelectedStock(stock); setQuantite(0); setShowReservationDialog(true); } } ]; return ( <>