feat(frontend): module Stock complet (inventaire, historique, ajustements)

- StockMovement model (IN/OUT, stockAvant/Après, sourceDocument)
- StockService : getHistorique, adjust (entrée/sortie manuelle)
- StockProvider : cache historiques par article
- StockScreen : liste articles avec barre de stock visuelle, filtres alertes
- StockDetailScreen : carte résumé gradient, historique mouvements, ajustement dialog
- Tous les modules Flutter connectés — frontend 100% fonctionnel

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-20 20:41:26 +01:00
co-authored by Claude Sonnet 4.6
parent acbf3a1600
commit 796d957fc2
6 changed files with 837 additions and 1 deletions
@@ -0,0 +1,49 @@
import 'package:flutter/material.dart';
import '../models/stock_movement.dart';
import '../services/stock_service.dart';
class StockProvider extends ChangeNotifier {
final Map<int, List<StockMovement>> _historiques = {};
bool _isLoading = false;
String? _error;
bool get isLoading => _isLoading;
String? get error => _error;
List<StockMovement> historiqueOf(int articleId) => _historiques[articleId] ?? [];
Future<void> loadHistorique(int articleId) async {
_isLoading = true;
_error = null;
notifyListeners();
try {
_historiques[articleId] = await StockService.getHistorique(articleId);
} catch (_) {
_error = 'Impossible de charger l\'historique.';
} finally {
_isLoading = false;
notifyListeners();
}
}
Future<String?> adjust({
required int articleId,
required double quantite,
required String type,
required String motif,
}) async {
try {
final mouvement = await StockService.adjust(
articleId: articleId,
quantite: quantite,
type: type,
motif: motif,
);
_historiques[articleId] = [mouvement, ...(_historiques[articleId] ?? [])];
notifyListeners();
return null;
} catch (_) {
return 'Erreur lors de l\'ajustement du stock';
}
}
}