Pārlūkot izejas kodu

sola lettura per ordini trasmessi, icone in lista ordini

Fabio Dalle Ave 2 mēneši atpakaļ
vecāks
revīzija
b14f994ad5

BIN
assets/db/Ristoris.db


+ 40 - 19
lib/ui/pages/orders/order_edit_page.dart

@@ -7,6 +7,7 @@ import '../../widgets/cod_desc_dropdown_item.dart';
 import '../../../providers/order_provider.dart';
 import '../../../providers/database_provider.dart';
 import '../../../database/database.dart';
+import '../../../core/constants.dart';
 import 'selezione_cliente_page.dart';
 import 'selezione_articolo_page.dart';
 
@@ -37,6 +38,7 @@ class _OrderEditPageState extends ConsumerState<OrderEditPage>
   int? _selectedPagamento;
 
   bool _dataLoaded = false;
+  bool _readOnly = false;
 
   @override
   void initState() {
@@ -73,6 +75,10 @@ class _OrderEditPageState extends ConsumerState<OrderEditPage>
     final order = orderState.order;
     if (order == null) return;
 
+    if (widget.id != null && order.stato != AppConstants.kStatusNew) {
+      _readOnly = true;
+    }
+
     final cli = order.idCliente;
     final clientiDao = ref.read(clientiDaoProvider);
     final filialiDao = ref.read(filialiDaoProvider);
@@ -212,12 +218,15 @@ class _OrderEditPageState extends ConsumerState<OrderEditPage>
 
     return Scaffold(
       appBar: AppBar(
-        title: Text('Ordine #${orderState.order?.numeroOrdine ?? 'nuovo'}'),
+        title: Text(_readOnly
+            ? 'Ordine #${orderState.order?.numeroOrdine}  - Trasmesso'
+            : 'Ordine #${orderState.order?.numeroOrdine ?? 'nuovo'}'),
         actions: [
-          IconButton(
-            icon: const Icon(Icons.save),
-            onPressed: _salva,
-          ),
+          if (!_readOnly)
+            IconButton(
+              icon: const Icon(Icons.save),
+              onPressed: _salva,
+            ),
         ],
         bottom: TabBar(
           controller: _tabController,
@@ -238,12 +247,13 @@ class _OrderEditPageState extends ConsumerState<OrderEditPage>
                 ],
               ),
       ),
-      floatingActionButton: _tabController.index == 1 && _cliente != null
-          ? FloatingActionButton(
-              onPressed: _aggiungiArticolo,
-              child: const Icon(Icons.add),
-            )
-          : null,
+      floatingActionButton:
+          _tabController.index == 1 && _cliente != null && !_readOnly
+              ? FloatingActionButton(
+                  onPressed: _aggiungiArticolo,
+                  child: const Icon(Icons.add),
+                )
+              : null,
     );
   }
 
@@ -327,10 +337,11 @@ class _OrderEditPageState extends ConsumerState<OrderEditPage>
                       ],
                     ),
                   ),
-                  IconButton(
-                    icon: Icon(Icons.search, color: cs.primary),
-                    onPressed: _selezionaCliente,
-                  ),
+                  if (!_readOnly)
+                    IconButton(
+                      icon: Icon(Icons.search, color: cs.primary),
+                      onPressed: _selezionaCliente,
+                    ),
                 ],
               ),
             ),
@@ -350,7 +361,8 @@ class _OrderEditPageState extends ConsumerState<OrderEditPage>
                   ),
                 )
                 .toList(),
-            onChanged: (v) => setState(() => _selectedFiliale = v),
+            onChanged:
+                _readOnly ? null : (v) => setState(() => _selectedFiliale = v),
           ),
           const SizedBox(height: 16),
           DropdownButtonFormField<int>(
@@ -367,7 +379,8 @@ class _OrderEditPageState extends ConsumerState<OrderEditPage>
                   ),
                 )
                 .toList(),
-            onChanged: (v) => setState(() => _selectedListino = v),
+            onChanged:
+                _readOnly ? null : (v) => setState(() => _selectedListino = v),
           ),
           const SizedBox(height: 16),
           DropdownButtonFormField<int>(
@@ -384,11 +397,14 @@ class _OrderEditPageState extends ConsumerState<OrderEditPage>
                   ),
                 )
                 .toList(),
-            onChanged: (v) => setState(() => _selectedPagamento = v),
+            onChanged: _readOnly
+                ? null
+                : (v) => setState(() => _selectedPagamento = v),
           ),
           const SizedBox(height: 16),
           TextFormField(
             controller: _noteClienteCtrl,
+            enabled: !_readOnly,
             decoration: const InputDecoration(
               labelText: 'Note Cliente',
               alignLabelWithHint: true,
@@ -398,6 +414,7 @@ class _OrderEditPageState extends ConsumerState<OrderEditPage>
           const SizedBox(height: 16),
           TextFormField(
             controller: _noteOrdineCtrl,
+            enabled: !_readOnly,
             decoration: const InputDecoration(
               labelText: 'Note Ordine',
               alignLabelWithHint: true,
@@ -407,6 +424,7 @@ class _OrderEditPageState extends ConsumerState<OrderEditPage>
           const SizedBox(height: 16),
           TextFormField(
             controller: _riferimentoCtrl,
+            enabled: !_readOnly,
             decoration: const InputDecoration(labelText: 'Riferimento'),
             maxLines: 1,
           ),
@@ -425,6 +443,7 @@ class _OrderEditPageState extends ConsumerState<OrderEditPage>
                   itemCount: orderState.lines.length,
                   itemBuilder: (_, i) => _LineCard(
                     line: orderState.lines[i],
+                    readOnly: _readOnly,
                     onDelete: () =>
                         ref.read(orderProvider.notifier).removeLine(i),
                     theme: theme,
@@ -457,11 +476,13 @@ class _OrderEditPageState extends ConsumerState<OrderEditPage>
 
 class _LineCard extends StatelessWidget {
   final RigaOrdine line;
+  final bool readOnly;
   final VoidCallback onDelete;
   final ThemeData theme;
 
   const _LineCard({
     required this.line,
+    required this.readOnly,
     required this.onDelete,
     required this.theme,
   });
@@ -495,7 +516,7 @@ class _LineCard extends StatelessWidget {
                   style: TextStyle(color: Colors.white, fontSize: 10),
                 ),
               ),
-            if (!isPromo)
+            if (!isPromo && !readOnly)
               IconButton(
                 icon: const Icon(Icons.delete_outline, size: 20),
                 onPressed: onDelete,

+ 151 - 37
lib/ui/pages/orders/order_list_page.dart

@@ -4,6 +4,7 @@ import 'package:go_router/go_router.dart';
 import 'package:intl/intl.dart';
 import '../../../providers/auth_provider.dart';
 import '../../../providers/order_provider.dart';
+import '../../../providers/database_provider.dart';
 import '../../../database/database.dart';
 import '../../widgets/search_bar.dart' as sw;
 import '../../widgets/empty_state.dart';
@@ -81,6 +82,43 @@ class _OrderListPageState extends ConsumerState<OrderListPage> {
     super.dispose();
   }
 
+  void _openOrder(VOrdiniData order) {
+    context.push('/dashboard/orders/${order.idOrdine}');
+  }
+
+  Future<void> _deleteOrder(VOrdiniData order) async {
+    final confirmed = await showDialog<bool>(
+      context: context,
+      builder: (ctx) => AlertDialog(
+        title: const Text('Elimina ordine'),
+        content: Text(
+          'Vuoi eliminare l\'ordine n. ${order.numeroOrdine ?? order.idOrdine}?',
+        ),
+        actions: [
+          TextButton(
+            onPressed: () => Navigator.pop(ctx, false),
+            child: const Text('Annulla'),
+          ),
+          FilledButton(
+            onPressed: () => Navigator.pop(ctx, true),
+            child: const Text('Elimina'),
+          ),
+        ],
+      ),
+    );
+    if (confirmed != true) return;
+
+    final agente = ref.read(authProvider).agente;
+    final dao = ref.read(ordiniDaoProvider);
+    await dao.zapOrderLines(order.idOrdine);
+    await dao.deleteOrder(order.idOrdine);
+
+    if (agente != null) {
+      ref.invalidate(ordersViewProvider(agente.idAgente));
+      ref.invalidate(orderStatsProvider(agente.idAgente));
+    }
+  }
+
   @override
   Widget build(BuildContext context) {
     final agente = ref.watch(authProvider).agente;
@@ -131,10 +169,18 @@ class _OrderListPageState extends ConsumerState<OrderListPage> {
                         return ListView.builder(
                           padding: const EdgeInsets.all(16),
                           itemCount: orders.length,
-                          itemBuilder: (_, i) => _OrderCard(order: orders[i]),
+                          itemBuilder: (_, i) => _OrderCard(
+                            order: orders[i],
+                            onEdit: () => _openOrder(orders[i]),
+                            onDelete: () => _deleteOrder(orders[i]),
+                          ),
                         );
                       }
-                      return _OrderTable(orders: orders);
+                      return _OrderTable(
+                        orders: orders,
+                        onEdit: _openOrder,
+                        onDelete: _deleteOrder,
+                      );
                     },
                     loading: () =>
                         const Center(child: CircularProgressIndicator()),
@@ -159,7 +205,13 @@ class _OrderListPageState extends ConsumerState<OrderListPage> {
 
 class _OrderCard extends StatelessWidget {
   final VOrdiniData order;
-  const _OrderCard({required this.order});
+  final VoidCallback onEdit;
+  final VoidCallback onDelete;
+  const _OrderCard({
+    required this.order,
+    required this.onEdit,
+    required this.onDelete,
+  });
 
   @override
   Widget build(BuildContext context) {
@@ -239,6 +291,37 @@ class _OrderCard extends StatelessWidget {
                   textAlign: TextAlign.right,
                 ),
               ),
+              const SizedBox(height: 8),
+              Row(
+                mainAxisAlignment: MainAxisAlignment.end,
+                children: [
+                  if (order.stato == AppConstants.kStatusNew) ...[
+                    IconButton(
+                      icon: const Icon(Icons.edit, size: 20),
+                      onPressed: onEdit,
+                      visualDensity: VisualDensity.compact,
+                    ),
+                    IconButton(
+                      icon: Icon(
+                        Icons.delete_outline,
+                        size: 20,
+                        color: cs.error,
+                      ),
+                      onPressed: onDelete,
+                      visualDensity: VisualDensity.compact,
+                    ),
+                  ] else
+                    IconButton(
+                      icon: Icon(
+                        Icons.visibility,
+                        size: 20,
+                        color: cs.secondary,
+                      ),
+                      onPressed: onEdit,
+                      visualDensity: VisualDensity.compact,
+                    ),
+                ],
+              ),
             ],
           ),
         ),
@@ -249,7 +332,13 @@ class _OrderCard extends StatelessWidget {
 
 class _OrderTable extends StatelessWidget {
   final List<VOrdiniData> orders;
-  const _OrderTable({required this.orders});
+  final void Function(VOrdiniData) onEdit;
+  final void Function(VOrdiniData) onDelete;
+  const _OrderTable({
+    required this.orders,
+    required this.onEdit,
+    required this.onDelete,
+  });
 
   @override
   Widget build(BuildContext context) {
@@ -415,28 +504,35 @@ class _OrderTable extends StatelessWidget {
                                           flex: 1,
                                         ),
                                         _cell(
-                                          IconButton(
-                                            icon: Icon(
-                                              Icons.visibility,
-                                              size: 20,
-                                              color: cs.secondary,
-                                            ),
-                                            onPressed: () {
-                                              print(o.idOrdine);
-                                              context.push(
-                                                '/dashboard/orders/${o.idOrdine}',
-                                              );
-                                            },
-                                            /*
-                                            onPressed: () =>  {
-                                              context.push(
-                                              '/dashboard/orders/${o.idOrdine}',
-                                            )
-                                            }
-                                            ,
-                                            */
-                                            visualDensity:
-                                                VisualDensity.compact,
+                                          Row(
+                                            mainAxisSize: MainAxisSize.min,
+                                            children: [
+                                              if (o.stato == AppConstants.kStatusNew) ...[
+                                                IconButton(
+                                                  icon: const Icon(Icons.edit, size: 20),
+                                                  onPressed: () => onEdit(o),
+                                                  visualDensity: VisualDensity.compact,
+                                                ),
+                                                IconButton(
+                                                  icon: Icon(
+                                                    Icons.delete_outline,
+                                                    size: 20,
+                                                    color: cs.error,
+                                                  ),
+                                                  onPressed: () => onDelete(o),
+                                                  visualDensity: VisualDensity.compact,
+                                                ),
+                                              ] else
+                                                IconButton(
+                                                  icon: Icon(
+                                                    Icons.visibility,
+                                                    size: 20,
+                                                    color: cs.secondary,
+                                                  ),
+                                                  onPressed: () => onEdit(o),
+                                                  visualDensity: VisualDensity.compact,
+                                                ),
+                                            ],
                                           ),
                                           flex: 1,
                                         ),
@@ -513,17 +609,35 @@ class _OrderTable extends StatelessWidget {
                                           flex: 1,
                                         ),
                                         _cell(
-                                          IconButton(
-                                            icon: Icon(
-                                              Icons.visibility,
-                                              size: 20,
-                                              color: cs.secondary,
-                                            ),
-                                            onPressed: () => context.push(
-                                              '/dashboard/orders/${o.idOrdine}',
-                                            ),
-                                            visualDensity:
-                                                VisualDensity.compact,
+                                          Row(
+                                            mainAxisSize: MainAxisSize.min,
+                                            children: [
+                                              if (o.stato == AppConstants.kStatusNew) ...[
+                                                IconButton(
+                                                  icon: const Icon(Icons.edit, size: 20),
+                                                  onPressed: () => onEdit(o),
+                                                  visualDensity: VisualDensity.compact,
+                                                ),
+                                                IconButton(
+                                                  icon: Icon(
+                                                    Icons.delete_outline,
+                                                    size: 20,
+                                                    color: cs.error,
+                                                  ),
+                                                  onPressed: () => onDelete(o),
+                                                  visualDensity: VisualDensity.compact,
+                                                ),
+                                              ] else
+                                                IconButton(
+                                                  icon: Icon(
+                                                    Icons.visibility,
+                                                    size: 20,
+                                                    color: cs.secondary,
+                                                  ),
+                                                  onPressed: () => onEdit(o),
+                                                  visualDensity: VisualDensity.compact,
+                                                ),
+                                            ],
                                           ),
                                           flex: 1,
                                         ),