|
|
|
@ -36,9 +36,9 @@ class Client { |
|
|
|
// Fonction helper améliorée pour parser les dates |
|
|
|
static DateTime _parseDateTime(dynamic dateValue) { |
|
|
|
if (dateValue == null) return DateTime.now(); |
|
|
|
|
|
|
|
|
|
|
|
if (dateValue is DateTime) return dateValue; |
|
|
|
|
|
|
|
|
|
|
|
if (dateValue is String) { |
|
|
|
try { |
|
|
|
return DateTime.parse(dateValue); |
|
|
|
@ -47,13 +47,14 @@ class Client { |
|
|
|
return DateTime.now(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Pour MySQL qui peut retourner un Timestamp |
|
|
|
if (dateValue is int) { |
|
|
|
return DateTime.fromMillisecondsSinceEpoch(dateValue); |
|
|
|
} |
|
|
|
|
|
|
|
print("Type de date non reconnu: ${dateValue.runtimeType}, valeur: $dateValue"); |
|
|
|
|
|
|
|
print( |
|
|
|
"Type de date non reconnu: ${dateValue.runtimeType}, valeur: $dateValue"); |
|
|
|
return DateTime.now(); |
|
|
|
} |
|
|
|
|
|
|
|
@ -73,11 +74,7 @@ class Client { |
|
|
|
String get nomComplet => '$prenom $nom'; |
|
|
|
} |
|
|
|
|
|
|
|
enum StatutCommande { |
|
|
|
enAttente, |
|
|
|
confirmee, |
|
|
|
annulee |
|
|
|
} |
|
|
|
enum StatutCommande { enAttente, confirmee, annulee } |
|
|
|
|
|
|
|
class Commande { |
|
|
|
final int? id; |
|
|
|
@ -156,7 +153,7 @@ class Commande { |
|
|
|
statut: StatutCommande.values[(map['statut'] as int)], |
|
|
|
montantTotal: (map['montantTotal'] as num).toDouble(), |
|
|
|
notes: map['notes'] as String?, |
|
|
|
dateLivraison: map['dateLivraison'] != null |
|
|
|
dateLivraison: map['dateLivraison'] != null |
|
|
|
? Client._parseDateTime(map['dateLivraison']) |
|
|
|
: null, |
|
|
|
commandeurId: map['commandeurId'] as int?, |
|
|
|
@ -173,10 +170,7 @@ class Commande { |
|
|
|
} |
|
|
|
|
|
|
|
// REMPLACEZ COMPLÈTEMENT votre classe DetailCommande dans Models/client.dart par celle-ci : |
|
|
|
enum RemiseType { |
|
|
|
pourcentage, |
|
|
|
montant |
|
|
|
} |
|
|
|
enum RemiseType { pourcentage, montant } |
|
|
|
|
|
|
|
class DetailCommande { |
|
|
|
final int? id; |
|
|
|
@ -193,6 +187,7 @@ class DetailCommande { |
|
|
|
final String? produitNom; |
|
|
|
final String? produitImage; |
|
|
|
final String? produitReference; |
|
|
|
final String? produitImei; // NOUVEAU : IMEI du produit, si applicable |
|
|
|
|
|
|
|
DetailCommande({ |
|
|
|
this.id, |
|
|
|
@ -209,6 +204,7 @@ class DetailCommande { |
|
|
|
this.produitNom, |
|
|
|
this.produitImage, |
|
|
|
this.produitReference, |
|
|
|
this.produitImei, |
|
|
|
}); |
|
|
|
|
|
|
|
// Constructeur pour créer un détail sans remise |
|
|
|
@ -222,10 +218,11 @@ class DetailCommande { |
|
|
|
String? produitNom, |
|
|
|
String? produitImage, |
|
|
|
String? produitReference, |
|
|
|
String? produitImei, |
|
|
|
}) { |
|
|
|
final sousTotal = quantite * prixUnitaire; |
|
|
|
final prixFinal = estCadeau ? 0.0 : sousTotal; |
|
|
|
|
|
|
|
|
|
|
|
return DetailCommande( |
|
|
|
id: id, |
|
|
|
commandeId: commandeId, |
|
|
|
@ -238,6 +235,7 @@ class DetailCommande { |
|
|
|
produitNom: produitNom, |
|
|
|
produitImage: produitImage, |
|
|
|
produitReference: produitReference, |
|
|
|
produitImei: produitImei, |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
@ -251,6 +249,7 @@ class DetailCommande { |
|
|
|
String? produitNom, |
|
|
|
String? produitImage, |
|
|
|
String? produitReference, |
|
|
|
String? produitImei, |
|
|
|
}) { |
|
|
|
return DetailCommande( |
|
|
|
id: id, |
|
|
|
@ -264,6 +263,7 @@ class DetailCommande { |
|
|
|
produitNom: produitNom, |
|
|
|
produitImage: produitImage, |
|
|
|
produitReference: produitReference, |
|
|
|
produitImei: produitImei, |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
@ -274,18 +274,18 @@ class DetailCommande { |
|
|
|
}) { |
|
|
|
// Les remises ne s'appliquent pas aux cadeaux |
|
|
|
if (estCadeau) return this; |
|
|
|
|
|
|
|
|
|
|
|
double montantRemiseCalcule = 0.0; |
|
|
|
|
|
|
|
|
|
|
|
if (type == RemiseType.pourcentage) { |
|
|
|
final pourcentage = valeur.clamp(0.0, 100.0); |
|
|
|
montantRemiseCalcule = sousTotal * (pourcentage / 100); |
|
|
|
} else { |
|
|
|
montantRemiseCalcule = valeur.clamp(0.0, sousTotal); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
final prixFinalCalcule = sousTotal - montantRemiseCalcule; |
|
|
|
|
|
|
|
|
|
|
|
return DetailCommande( |
|
|
|
id: id, |
|
|
|
commandeId: commandeId, |
|
|
|
@ -301,6 +301,7 @@ class DetailCommande { |
|
|
|
produitNom: produitNom, |
|
|
|
produitImage: produitImage, |
|
|
|
produitReference: produitReference, |
|
|
|
produitImei: produitImei, |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
@ -321,6 +322,7 @@ class DetailCommande { |
|
|
|
produitNom: produitNom, |
|
|
|
produitImage: produitImage, |
|
|
|
produitReference: produitReference, |
|
|
|
produitImei: produitImei, |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
@ -341,6 +343,7 @@ class DetailCommande { |
|
|
|
produitNom: produitNom, |
|
|
|
produitImage: produitImage, |
|
|
|
produitReference: produitReference, |
|
|
|
produitImei: produitImei, |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
@ -361,12 +364,14 @@ class DetailCommande { |
|
|
|
produitNom: produitNom, |
|
|
|
produitImage: produitImage, |
|
|
|
produitReference: produitReference, |
|
|
|
produitImei: produitImei, |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
// Getters utiles |
|
|
|
bool get aRemise => remiseType != null && montantRemise > 0 && !estCadeau; |
|
|
|
|
|
|
|
bool get aimei => produitImei != null; |
|
|
|
|
|
|
|
double get pourcentageRemise { |
|
|
|
if (!aRemise) return 0.0; |
|
|
|
return (montantRemise / sousTotal) * 100; |
|
|
|
@ -375,7 +380,7 @@ class DetailCommande { |
|
|
|
String get remiseDescription { |
|
|
|
if (estCadeau) return 'CADEAU'; |
|
|
|
if (!aRemise) return ''; |
|
|
|
|
|
|
|
|
|
|
|
if (remiseType == RemiseType.pourcentage) { |
|
|
|
return '-${remiseValeur.toStringAsFixed(0)}%'; |
|
|
|
} else { |
|
|
|
@ -426,12 +431,13 @@ class DetailCommande { |
|
|
|
remiseType: type, |
|
|
|
remiseValeur: (map['remise_valeur'] as num?)?.toDouble() ?? 0.0, |
|
|
|
montantRemise: (map['montant_remise'] as num?)?.toDouble() ?? 0.0, |
|
|
|
prixFinal: (map['prix_final'] as num?)?.toDouble() ?? |
|
|
|
(map['sousTotal'] as num).toDouble(), |
|
|
|
prixFinal: (map['prix_final'] as num?)?.toDouble() ?? |
|
|
|
(map['sousTotal'] as num).toDouble(), |
|
|
|
estCadeau: (map['est_cadeau'] as int?) == 1, |
|
|
|
produitNom: map['produitNom'] as String?, |
|
|
|
produitImage: map['produitImage'] as String?, |
|
|
|
produitReference: map['produitReference'] as String?, |
|
|
|
produitImei: map['produitImei'] as String?, |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|