|
|
|
@ -806,12 +806,24 @@ class AppDatabase { |
|
|
|
|
|
|
|
Future<List<Commande>> getCommandes() async { |
|
|
|
final db = await database; |
|
|
|
|
|
|
|
final result = await db.query(''' |
|
|
|
SELECT c.*, cl.nom as clientNom, cl.prenom as clientPrenom, cl.email as clientEmail |
|
|
|
FROM commandes c |
|
|
|
LEFT JOIN clients cl ON c.clientId = cl.id |
|
|
|
ORDER BY c.dateCommande DESC |
|
|
|
'''); |
|
|
|
SELECT |
|
|
|
c.*, |
|
|
|
cl.nom as clientNom, |
|
|
|
cl.prenom as clientPrenom, |
|
|
|
cl.email as clientEmail, |
|
|
|
u.nom as commandeurNom, |
|
|
|
u.prenom as commandeurPrenom, |
|
|
|
pdv.nom as pointDeVenteNom, |
|
|
|
pdv.id as pointDeVenteId |
|
|
|
FROM commandes c |
|
|
|
LEFT JOIN clients cl ON c.clientId = cl.id |
|
|
|
LEFT JOIN users u ON c.commandeurId = u.id |
|
|
|
LEFT JOIN points_de_vente pdv ON u.point_de_vente_id = pdv.id |
|
|
|
ORDER BY c.dateCommande DESC |
|
|
|
'''); |
|
|
|
|
|
|
|
return result.map((row) => Commande.fromMap(row.fields)).toList(); |
|
|
|
} |
|
|
|
|
|
|
|
@ -1447,61 +1459,62 @@ class AppDatabase { |
|
|
|
// --- TRANSACTIONS COMPLEXES --- |
|
|
|
|
|
|
|
// Méthode pour créer une commande complète avec remises |
|
|
|
Future<int> createCommandeComplete( |
|
|
|
Client client, Commande commande, List<DetailCommande> details) async { |
|
|
|
final db = await database; |
|
|
|
Future<int> createCommandeComplete( |
|
|
|
Client client, Commande commande, List<DetailCommande> details) async { |
|
|
|
final db = await database; |
|
|
|
|
|
|
|
try { |
|
|
|
await db.query('START TRANSACTION'); |
|
|
|
try { |
|
|
|
await db.query('START TRANSACTION'); |
|
|
|
|
|
|
|
// 1. Créer ou récupérer le client |
|
|
|
final existingOrNewClient = await createOrGetClient(client); |
|
|
|
final clientId = existingOrNewClient.id!; |
|
|
|
// 1. Créer ou récupérer le client |
|
|
|
final existingOrNewClient = await createOrGetClient(client); |
|
|
|
final clientId = existingOrNewClient.id!; |
|
|
|
|
|
|
|
// 2. Créer la commande |
|
|
|
final commandeMap = commande.toMap(); |
|
|
|
commandeMap.remove('id'); |
|
|
|
commandeMap['clientId'] = clientId; |
|
|
|
// 2. Créer la commande |
|
|
|
final commandeMap = commande.toMap(); |
|
|
|
commandeMap.remove('id'); |
|
|
|
commandeMap['clientId'] = clientId; |
|
|
|
|
|
|
|
final commandeFields = commandeMap.keys.join(', '); |
|
|
|
final commandePlaceholders = List.filled(commandeMap.length, '?').join(', '); |
|
|
|
final commandeFields = commandeMap.keys.join(', '); |
|
|
|
final commandePlaceholders = |
|
|
|
List.filled(commandeMap.length, '?').join(', '); |
|
|
|
|
|
|
|
final commandeResult = await db.query( |
|
|
|
'INSERT INTO commandes ($commandeFields) VALUES ($commandePlaceholders)', |
|
|
|
commandeMap.values.toList(), |
|
|
|
); |
|
|
|
final commandeId = commandeResult.insertId!; |
|
|
|
final commandeResult = await db.query( |
|
|
|
'INSERT INTO commandes ($commandeFields) VALUES ($commandePlaceholders)', |
|
|
|
commandeMap.values.toList(), |
|
|
|
); |
|
|
|
final commandeId = commandeResult.insertId!; |
|
|
|
|
|
|
|
// 3. Créer les détails de commande avec remises |
|
|
|
for (final detail in details) { |
|
|
|
final detailMap = detail.toMap(); |
|
|
|
detailMap.remove('id'); |
|
|
|
detailMap['commandeId'] = commandeId; |
|
|
|
// 3. Créer les détails de commande avec remises |
|
|
|
for (final detail in details) { |
|
|
|
final detailMap = detail.toMap(); |
|
|
|
detailMap.remove('id'); |
|
|
|
detailMap['commandeId'] = commandeId; |
|
|
|
|
|
|
|
final detailFields = detailMap.keys.join(', '); |
|
|
|
final detailPlaceholders = List.filled(detailMap.length, '?').join(', '); |
|
|
|
final detailFields = detailMap.keys.join(', '); |
|
|
|
final detailPlaceholders = |
|
|
|
List.filled(detailMap.length, '?').join(', '); |
|
|
|
|
|
|
|
await db.query( |
|
|
|
'INSERT INTO details_commandes ($detailFields) VALUES ($detailPlaceholders)', |
|
|
|
detailMap.values.toList(), |
|
|
|
); |
|
|
|
await db.query( |
|
|
|
'INSERT INTO details_commandes ($detailFields) VALUES ($detailPlaceholders)', |
|
|
|
detailMap.values.toList(), |
|
|
|
); |
|
|
|
|
|
|
|
// 4. Mettre à jour le stock |
|
|
|
await db.query( |
|
|
|
'UPDATE products SET stock = stock - ? WHERE id = ?', |
|
|
|
[detail.quantite, detail.produitId], |
|
|
|
); |
|
|
|
} |
|
|
|
// 4. Mettre à jour le stock |
|
|
|
await db.query( |
|
|
|
'UPDATE products SET stock = stock - ? WHERE id = ?', |
|
|
|
[detail.quantite, detail.produitId], |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
await db.query('COMMIT'); |
|
|
|
return commandeId; |
|
|
|
} catch (e) { |
|
|
|
await db.query('ROLLBACK'); |
|
|
|
print("Erreur lors de la création de la commande complète: $e"); |
|
|
|
rethrow; |
|
|
|
await db.query('COMMIT'); |
|
|
|
return commandeId; |
|
|
|
} catch (e) { |
|
|
|
await db.query('ROLLBACK'); |
|
|
|
print("Erreur lors de la création de la commande complète: $e"); |
|
|
|
rethrow; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Méthode pour mettre à jour un détail de commande (utile pour modifier les remises) |
|
|
|
Future<int> updateDetailCommande(DetailCommande detail) async { |
|
|
|
|