You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

88 lines
2.2 KiB

class MenuCategory {
final int id;
final String nom;
final String? description;
final int? ordre;
final bool actif;
MenuCategory({
required this.id,
required this.nom,
this.description,
this.ordre,
required this.actif,
});
factory MenuCategory.fromJson(Map<String, dynamic> json) {
return MenuCategory(
id: json['id'],
nom: json['nom'],
description: json['description'],
ordre: json['ordre'],
actif: json['actif'] ?? true,
);
}
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is MenuCategory &&
runtimeType == other.runtimeType &&
id == other.id;
@override
int get hashCode => id.hashCode;
}
class MenuPlat {
final int id;
final String nom;
final String? commentaire;
final double prix;
final String? ingredients;
final String? imageUrl;
final bool disponible;
final MenuCategory? category; // Single category pour la compatibilité API
final List<MenuCategory>? categories; // Multiple categories si besoin
MenuPlat({
required this.id,
required this.nom,
this.commentaire,
required this.prix,
this.ingredients,
this.imageUrl,
required this.disponible,
this.category,
this.categories,
});
factory MenuPlat.fromJson(Map<String, dynamic> json) {
double parsePrix(dynamic p) {
if (p is int) return p.toDouble();
if (p is double) return p;
if (p is String) return double.tryParse(p) ?? 0;
return 0;
}
return MenuPlat(
id: json['id'],
nom: json['nom'],
commentaire: json['commentaire'],
prix: parsePrix(json['prix']),
ingredients: json['ingredients'],
imageUrl: json['image_url'],
disponible: json['disponible'] ?? true,
// Support pour single category (API actuelle)
category: json['category'] != null
? MenuCategory.fromJson(json['category'])
: null,
// Support pour multiple categories si l'API évolue
categories: json['categories'] != null
? (json['categories'] as List)
.map((c) => MenuCategory.fromJson(c))
.toList()
: null,
);
}
}