refactor providers e basi per spedizioni

This commit is contained in:
2026-05-15 10:12:05 +02:00
parent ad35f641b3
commit f19f19a279
21 changed files with 1542 additions and 830 deletions

View File

@@ -1,18 +1,20 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flux/core/widgets/shared_forms/model_section.dart';
import 'package:flux/features/master_data/providers/blocs/provider_cubit.dart';
import 'package:flux/features/master_data/providers/blocs/provider_list_cubit.dart';
import 'package:flux/features/master_data/providers/models/provider_model.dart';
import 'package:flux/features/master_data/providers/models/provider_role.dart';
import 'package:flux/features/operations/blocs/operation_form_cubit.dart';
import 'package:flux/features/operations/models/operation_model.dart';
class DetailsSection extends StatelessWidget {
class OperationDetailsSection extends StatelessWidget {
final OperationModel? currentOp;
final String currentType;
final TextEditingController freeTextSubtypeController;
final TextEditingController freeTextDescriptionController;
final Widget durationQuickPicks;
const DetailsSection({
const OperationDetailsSection({
super.key,
required this.currentOp,
required this.currentType,
@@ -21,24 +23,29 @@ class DetailsSection extends StatelessWidget {
required this.durationQuickPicks,
});
bool _doesProviderMatchOperationType(dynamic provider, String operationType) {
bool _doesProviderMatchOperationType(
ProviderModel provider,
String operationType,
) {
if (operationType == 'Custom') return true;
// Controlliamo che il fornitore abbia il ruolo specifico nel suo array
switch (operationType) {
case 'AL':
case 'MNP':
return provider.mobile == true;
case 'AL' || 'MNP':
return provider.roles.contains(ProviderRole.mobile);
case 'NIP':
return provider.landline == true;
return provider.roles.contains(ProviderRole.landline);
case 'UNICA':
return provider.landline == true || provider.mobile == true;
return provider.roles.contains(ProviderRole.landline) ||
provider.roles.contains(ProviderRole.mobile);
case 'Energy':
return provider.energy == true;
return provider.roles.contains(ProviderRole.energy);
case 'Fin':
return provider.financing == true;
return provider.roles.contains(ProviderRole.financing);
case 'Entertainment':
return provider.entertainment == true;
return provider.roles.contains(ProviderRole.entertainment);
case 'TELEPASS':
return provider.telepass == true;
return provider.roles.contains(ProviderRole.telepass);
default:
return true;
}
@@ -79,21 +86,21 @@ class DetailsSection extends StatelessWidget {
),
const Divider(),
Expanded(
child: BlocBuilder<ProvidersCubit, ProvidersState>(
child: BlocBuilder<ProviderListCubit, ProviderListState>(
builder: (context, state) {
if (state.isLoading) {
if (state.status == ProviderListStatus.loading) {
return const Center(child: CircularProgressIndicator());
}
final allProviders = state.activeProviders;
final filteredProviders = allProviders
.where(
(p) => _doesProviderMatchOperationType(
p,
operationType,
),
)
.toList();
// Prendiamo i provider e li filtriamo per ruolo e per stato attivo
final filteredProviders = state.providers.where((p) {
final isMatch = _doesProviderMatchOperationType(
p,
operationType,
);
return isMatch &&
p.isActive; // Mostriamo solo quelli attivi!
}).toList();
if (filteredProviders.isEmpty) {
return const Center(
@@ -119,6 +126,15 @@ class DetailsSection extends StatelessWidget {
fontWeight: FontWeight.bold,
),
),
// Facoltativo: mostra i ruoli sotto al nome
subtitle: Text(
provider.roles
.map((r) => r.displayValue)
.join(', '),
style: const TextStyle(fontSize: 12),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
onTap: () {
context.read<OperationFormCubit>().updateFields(
providerId: provider.id,