
Moves `StockPickingCompanyModel`, `StockPickingPartnerModel`, `StockPickingLocationModel`, and `StockPickingTypeModel` to `stock_picking_record_model.dart`. This consolidates related schema definitions for improved organization and clarity. Enables the floating action button on the reception details page to navigate to the scanner route, streamlining the workflow.
149 lines
6.2 KiB
Dart
149 lines
6.2 KiB
Dart
import 'package:e_scan/backend/schema/stock_picking/stock_picking_record_model.dart';
|
|
import 'package:e_scan/components/components.dart';
|
|
import 'package:e_scan/pages/operation/reception/reception_details_page_model.dart';
|
|
import 'package:e_scan/router/go_secure_router_builder.dart';
|
|
import 'package:e_scan/themes/app_theme.dart';
|
|
import 'package:flutter/scheduler.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
import 'package:flutter/material.dart';
|
|
|
|
class ReceptionDetailsPage extends ConsumerStatefulWidget {
|
|
const ReceptionDetailsPage({super.key, required this.receptionId});
|
|
final int receptionId;
|
|
@override
|
|
ConsumerState<ReceptionDetailsPage> createState() =>
|
|
_ReceptionDetailsPageState();
|
|
}
|
|
|
|
class _ReceptionDetailsPageState extends ConsumerState<ReceptionDetailsPage> {
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
SchedulerBinding.instance.addPostFrameCallback((_) {
|
|
ref
|
|
.read(receptionDetailsPageModelProvider.notifier)
|
|
.getReceptionById(id: widget.receptionId);
|
|
});
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final state = ref.watch(receptionDetailsPageModelProvider);
|
|
final reception = state.reception;
|
|
return Scaffold(
|
|
backgroundColor: AppTheme.of(context).primaryBackground,
|
|
appBar: MainAppbarComponent(
|
|
leading: BackButton(color: AppTheme.of(context).white),
|
|
title: "Réceptions",
|
|
subTitle: "Opérations d'Entrepôt",
|
|
),
|
|
body: state.loading
|
|
? Center(child: LoadingProgressComponent())
|
|
: Padding(
|
|
padding: const EdgeInsets.symmetric(horizontal: 16),
|
|
child: ListView(
|
|
children: [
|
|
const SizedBox(height: 16),
|
|
if (reception?.isDone == false) ...[
|
|
QuickActionComponent(
|
|
onTapScan: () {
|
|
ScannerRoute().push(context);
|
|
},
|
|
),
|
|
const SizedBox(height: 16),
|
|
],
|
|
Text(
|
|
'Détails réception',
|
|
style: AppTheme.of(
|
|
context,
|
|
).bodyMedium.copyWith(fontWeight: FontWeight.bold),
|
|
),
|
|
SizedBox(height: 10),
|
|
StockPickingCard(
|
|
isDone: reception?.isDone == true,
|
|
margin: EdgeInsets.symmetric(horizontal: 5),
|
|
reference: reception?.name ?? '',
|
|
from: reception?.locationId?.completeName,
|
|
to: reception?.locationDestId?.completeName,
|
|
contact: reception?.partnerId?.displayName,
|
|
origin: reception?.origin,
|
|
status: reception?.state,
|
|
),
|
|
SizedBox(height: 20),
|
|
ListView(
|
|
physics: NeverScrollableScrollPhysics(),
|
|
shrinkWrap: true,
|
|
primary: true,
|
|
children: [
|
|
Text(
|
|
'Produits',
|
|
style: AppTheme.of(
|
|
context,
|
|
).bodyMedium.copyWith(fontWeight: FontWeight.bold),
|
|
),
|
|
SizedBox(height: 10),
|
|
...reception?.moveIdsWithoutPackage
|
|
?.map(
|
|
(move) => Card(
|
|
color: AppTheme.of(context).primaryBackground,
|
|
child: ListTile(
|
|
title: Text(
|
|
move.productId?.displayName ?? '',
|
|
style: TextStyle(color: Colors.black),
|
|
),
|
|
subtitle: Wrap(
|
|
spacing: 5,
|
|
children: [
|
|
Chip(
|
|
backgroundColor: AppTheme.of(
|
|
context,
|
|
).secondaryBackground,
|
|
label: Text(
|
|
"Qté demandée: ${move.productUomQty}",
|
|
),
|
|
),
|
|
Chip(
|
|
backgroundColor: AppTheme.of(
|
|
context,
|
|
).secondaryBackground,
|
|
label: Text(
|
|
"Qté reçue: ${move.quantity}",
|
|
),
|
|
),
|
|
Chip(
|
|
backgroundColor: AppTheme.of(
|
|
context,
|
|
).secondaryBackground,
|
|
label: Text(
|
|
"Ecart: ${move.ecart}",
|
|
style: TextStyle(
|
|
color: Colors.green,
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
)
|
|
.toList() ??
|
|
[],
|
|
],
|
|
),
|
|
],
|
|
),
|
|
),
|
|
floatingActionButton: reception?.isDone == false
|
|
? FloatingActionButton(
|
|
backgroundColor: AppTheme.of(context).primary,
|
|
onPressed: () {
|
|
ScannerRoute().push(context);
|
|
},
|
|
child: Icon(Icons.qr_code, color: AppTheme.of(context).white),
|
|
)
|
|
: null,
|
|
);
|
|
}
|
|
}
|