Browse Source

push 03082025

master
andrymodeste 4 months ago
parent
commit
c9f4a0ce45
  1. 3
      lib/models/command_detail.dart
  2. 31
      lib/models/tables_order.dart
  3. 28
      lib/pages/login_screen.dart
  4. 4
      lib/services/restaurant_api_service.dart
  5. 14
      lib/widgets/command_card.dart

3
lib/models/command_detail.dart

@ -16,6 +16,7 @@ class CommandeDetail {
final DateTime? dateService;
final DateTime createdAt;
final DateTime updatedAt;
final String tablename;
final List<CommandeItem> items;
CommandeDetail({
@ -36,6 +37,7 @@ class CommandeDetail {
required this.createdAt,
required this.updatedAt,
required this.items,
required this.tablename,
});
factory CommandeDetail.fromJson(Map<String, dynamic> json) {
@ -54,6 +56,7 @@ class CommandeDetail {
totalTtc: double.tryParse(data['total_ttc']?.toString() ?? '0') ?? 0.0,
modePaiement: data['mode_paiement'],
commentaires: data['commentaires'],
tablename: json['tablename'] ?? 'Inconnue',
serveur: data['serveur'] ?? 'Serveur par défaut',
dateCommande:
data['date_commande'] != null

31
lib/models/tables_order.dart

@ -10,7 +10,8 @@ class TableOrder {
final double? total; // Optionnel pour les commandes en cours
final bool isEncashed;
final String? time; // Heure de la commande si applicable
final String? date; // Date de la commande si applicable
final DateTime? date; // Date de la commande si applicable
final String? tablename; // Date de la commande si applicable
// final int? persons; // Nombre de personnes si applicable
TableOrder({
@ -25,32 +26,35 @@ class TableOrder {
this.isEncashed = false,
this.time,
this.date,
this.tablename,
// this.persons,
});
factory TableOrder.fromJson(Map<String, dynamic> json) {
return TableOrder(
id: json['id'] ?? 0,
nom: json['nom'] ?? '',
capacity: json['capacity'] ?? 1,
status: json['status'] ?? 'available',
status: json['statut'] ?? 'available',
location: json['location'] ?? '',
createdAt:
json['created_at'] != null
tablename: json['tablename'] ?? '',
createdAt: json['created_at'] != null
? DateTime.parse(json['created_at'])
: DateTime.now(),
updatedAt:
json['updated_at'] != null
updatedAt: json['updated_at'] != null
? DateTime.parse(json['updated_at'])
: DateTime.now(),
total: json['total'] != null ? (json['total'] as num).toDouble() : null,
total: json['total_ht'] != null
? double.tryParse(json['total_ht'].toString())
: null,
isEncashed: json['is_encashed'] ?? false,
time: json['time'],
date: json['date'],
// persons: json['persons'],
date: json['date_commande'] != null
? DateTime.parse(json['date_commande']) // tu avais mis updated_at ici par erreur
: null,
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
@ -58,6 +62,7 @@ class TableOrder {
'capacity': capacity,
'status': status,
'location': location,
'tablename': tablename,
'created_at': createdAt.toIso8601String(),
'updated_at': updatedAt.toIso8601String(),
if (total != null) 'total': total,
@ -122,7 +127,7 @@ class TableOrder {
double? total,
bool? isEncashed,
String? time,
String? date,
DateTime? date,
int? persons,
}) {
return TableOrder(
@ -153,6 +158,10 @@ class TableOrder {
@override
int get hashCode => id.hashCode;
get items => null;
where(bool Function(dynamic commande) param0) {}
}
// Énumération pour les statuts (optionnel, pour plus de type safety)

28
lib/pages/login_screen.dart

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import './tables.dart';
import '../layouts/main_layout.dart';
@ -54,6 +55,15 @@ class _LoginScreenState extends State<LoginScreen> {
super.dispose();
}
// Méthode pour gérer la touche Entrée
void _handleKeyPress(KeyEvent event) {
if (event is KeyDownEvent && event.logicalKey == LogicalKeyboardKey.enter) {
if (!_isLoading) {
_login();
}
}
}
void _login() async {
if (!_formKey.currentState!.validate()) return;
@ -99,7 +109,10 @@ class _LoginScreenState extends State<LoginScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
return KeyboardListener(
focusNode: FocusNode(),
onKeyEvent: _handleKeyPress,
child: Scaffold(
backgroundColor: const Color(0xFFF5F5F5), // Light gray background
body: Center(
child: SingleChildScrollView(
@ -227,6 +240,7 @@ class _LoginScreenState extends State<LoginScreen> {
),
),
keyboardType: TextInputType.emailAddress,
textInputAction: TextInputAction.next,
validator: (value) {
if (value == null || value.isEmpty) {
return 'Veuillez entrer votre email';
@ -279,6 +293,8 @@ class _LoginScreenState extends State<LoginScreen> {
),
),
obscureText: true,
textInputAction: TextInputAction.done,
onFieldSubmitted: (_) => _login(), // Validation quand on appuie sur Entrée
validator: (value) {
if (value == null || value.isEmpty) {
return 'Veuillez entrer votre mot de passe';
@ -368,6 +384,15 @@ class _LoginScreenState extends State<LoginScreen> {
],
),
),
const SizedBox(height: 8),
const Text(
'Astuce : Appuyez sur Entrée pour vous connecter',
style: TextStyle(
fontSize: 12,
color: Colors.grey,
fontStyle: FontStyle.italic,
),
),
],
),
),
@ -378,6 +403,7 @@ class _LoginScreenState extends State<LoginScreen> {
),
),
),
),
);
}
}

4
lib/services/restaurant_api_service.dart

@ -21,7 +21,7 @@ class RestaurantApiService {
static Future<List<TableOrder>> getCommandes() async {
try {
final response = await http
.get(Uri.parse('$baseUrl/api/commandes'), headers: _headers)
.get(Uri.parse('$baseUrl/api/commandes?statut=servie'), headers: _headers)
.timeout(
const Duration(seconds: 30),
onTimeout: () => throw TimeoutException('Délai d\'attente dépassé'),
@ -171,6 +171,7 @@ class RestaurantApiService {
totalTtc: 14.00,
modePaiement: null,
commentaires: null,
tablename: 'a',
serveur: "Serveur par défaut",
dateCommande: DateTime.parse("2025-08-02T15:03:44.000Z"),
dateService: null,
@ -234,7 +235,6 @@ class RestaurantApiService {
updatedAt: DateTime.now(),
total: 27.00,
time: '00:02',
date: '02/08/2025',
),
// Ajoutez d'autres tables de test...
];

14
lib/widgets/command_card.dart

@ -12,8 +12,13 @@ class CommandeCard extends StatelessWidget {
required this.onAllerCaisse,
});
String _formatTime(DateTime dateTime) {
return '${dateTime.hour.toString().padLeft(2, '0')}:${dateTime.minute.toString().padLeft(2, '0')} ${dateTime.day.toString().padLeft(2, '0')}/${dateTime.month.toString().padLeft(2, '0')}/${dateTime.year}';
}
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.only(bottom: 16),
decoration: BoxDecoration(
@ -38,7 +43,7 @@ class CommandeCard extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Table ${commande.tableNumber}',
' ${commande.tablename}',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
@ -57,7 +62,7 @@ class CommandeCard extends StatelessWidget {
Icon(Icons.check_circle, color: Colors.white, size: 16),
SizedBox(width: 4),
Text(
'À encaisser',
'Près à encaisser',
style: TextStyle(
color: Colors.white,
fontSize: 12,
@ -78,7 +83,8 @@ class CommandeCard extends StatelessWidget {
Icon(Icons.access_time, size: 16, color: Colors.grey[600]),
SizedBox(width: 6),
Text(
'${commande.time}${commande.date} ',
// Fixed: Pass DateTime directly, not as string
commande.date != null ? _formatTime(commande.date!) : 'Date non disponible',
style: TextStyle(color: Colors.grey[600], fontSize: 14),
),
],
@ -99,7 +105,7 @@ class CommandeCard extends StatelessWidget {
style: TextStyle(color: Colors.grey[600], fontSize: 14),
),
Text(
'${commande.total?.toStringAsFixed(2)} MGA',
'${commande.total?.toStringAsFixed(2) ?? '0.00'} MGA',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,

Loading…
Cancel
Save