diff --git a/attached_assets/{3604C248-7F41-46CC-8972-47C38222F2B0}_1762265360405.png b/attached_assets/{3604C248-7F41-46CC-8972-47C38222F2B0}_1762265360405.png new file mode 100644 index 0000000..707933a Binary files /dev/null and b/attached_assets/{3604C248-7F41-46CC-8972-47C38222F2B0}_1762265360405.png differ diff --git a/attached_assets/{F5E72738-3287-4989-AD4F-8A12528BD627}_1762265876680.png b/attached_assets/{F5E72738-3287-4989-AD4F-8A12528BD627}_1762265876680.png new file mode 100644 index 0000000..f61803a Binary files /dev/null and b/attached_assets/{F5E72738-3287-4989-AD4F-8A12528BD627}_1762265876680.png differ diff --git a/client/src/pages/BLReconciliation.tsx b/client/src/pages/BLReconciliation.tsx index ef7b7ff..aa2299f 100644 --- a/client/src/pages/BLReconciliation.tsx +++ b/client/src/pages/BLReconciliation.tsx @@ -705,8 +705,18 @@ export default function BLReconciliation() { description: "Livraison supprimée avec succès", }); - queryClient.invalidateQueries({ queryKey: ['/api/deliveries/bl'] }); + // Mise à jour optimiste du cache local pour disparition immédiate + queryClient.setQueryData(['/api/deliveries/bl', selectedStoreId], (oldData: any) => { + if (!oldData) return oldData; + return oldData.filter((d: any) => d.id !== deliveryId); + }); + + // Force refetch pour synchroniser avec le serveur + queryClient.refetchQueries({ queryKey: ['/api/deliveries/bl'] }); + queryClient.refetchQueries({ queryKey: ['/api/deliveries'] }); } catch (error) { + // En cas d'erreur, refetch pour annuler la mise à jour optimiste + queryClient.refetchQueries({ queryKey: ['/api/deliveries/bl'] }); toast({ title: "Erreur", description: "Impossible de supprimer la livraison", diff --git a/server/storage.ts b/server/storage.ts index f448ec8..ef00317 100644 --- a/server/storage.ts +++ b/server/storage.ts @@ -1948,7 +1948,18 @@ export class DatabaseStorage implements IStorage { query = query.where(and(...conditions)); } - const results = await query.orderBy(asc(dlcProducts.expiryDate)); + // Tri intelligent : produits actifs en premier, puis produits traités/validés en dernier + const results = await query.orderBy( + // Priorité 1 : Produits actifs d'abord (non validés, non traités, stock disponible) + sql`CASE + WHEN ${dlcProducts.status} = 'valides' THEN 3 + WHEN ${dlcProducts.stockEpuise} = true THEN 2 + WHEN ${dlcProducts.processedUntilExpiry} = true THEN 2 + ELSE 1 + END`, + // Priorité 2 : Date d'expiration (croissante) + asc(dlcProducts.expiryDate) + ); return results.map((row: any) => ({ ...row.dlcProduct,