Refactor Store management: implement save and sync functionality for providers and staff; create StoreCard and StoreForm components

This commit is contained in:
2026-04-17 14:58:29 +02:00
parent 08a521c21c
commit f4d59a2f4f
7 changed files with 537 additions and 346 deletions

View File

@@ -1,6 +1,7 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:flux/core/blocs/session/session_bloc.dart';
import 'package:flux/features/master_data/providers/models/provider_model.dart';
import 'package:flux/features/master_data/staff/data/staff_repository.dart';
import 'package:flux/features/master_data/staff/models/staff_member_model.dart';
import 'package:flux/features/master_data/store/data/store_repository.dart';
@@ -54,21 +55,56 @@ class StoreCubit extends Cubit<StoreState> {
}
}
Future<void> assignProviderToStore(String storeId, String providerId) async {
Future<void> saveProvidersForStore(
StoreModel store,
List<ProviderModel> providers,
) async {
emit(state.copyWith(status: StoreStatus.loading));
try {
await _repository.associateProviderToStore(
final savedStore = await _repository.saveStore(store);
await _repository.syncStoreProviders(savedStore.id!, providers);
await loadStores();
} catch (e) {
emit(
state.copyWith(
status: StoreStatus.failure,
errorMessage: "Errore nel salvataggio dei provider: $e",
),
);
}
}
Future<void> saveStaffForStore(
StoreModel store,
List<StaffMemberModel> staffMembers,
) async {
emit(state.copyWith(status: StoreStatus.loading));
try {
final savedStore = await _repository.saveStore(store);
await _repository.syncStoreStaff(savedStore.id!, staffMembers);
await loadStores();
} catch (e) {
emit(
state.copyWith(
status: StoreStatus.failure,
errorMessage: "Errore nel salvataggio dello staff: $e",
),
);
}
}
Future<void> associateStoreToProvider(
String storeId,
String providerId,
) async {
try {
await _repository.associateStoreToProvider(
providerId: providerId,
storeId: storeId,
);
// Dopo l'associazione, potresti voler ricaricare i provider per quel negozio
final updatedProviders = await _repository.fetchProvidersForStore(
storeId,
);
final newMap = Map<String, List<ProviderModel>>.from(
state.providersByStore,
);
newMap[storeId] = updatedProviders;
emit(state.copyWith(providersByStore: newMap));
loadStores();
} catch (e) {
emit(
state.copyWith(
@@ -84,18 +120,11 @@ class StoreCubit extends Cubit<StoreState> {
String providerId,
) async {
try {
await _repository.removeProviderFromStore(
await _repository.removeStoreFromProvider(
providerId: providerId,
storeId: storeId,
);
final updatedProviders = await _repository.fetchProvidersForStore(
storeId,
);
final newMap = Map<String, List<ProviderModel>>.from(
state.providersByStore,
);
newMap[storeId] = updatedProviders;
emit(state.copyWith(providersByStore: newMap));
loadStores();
} catch (e) {
emit(
state.copyWith(
@@ -110,14 +139,7 @@ class StoreCubit extends Cubit<StoreState> {
try {
await _staffRepository.assignToStore(staffId, storeId);
// Dopo l'assegnazione, potresti voler ricaricare lo staff per quel negozio
final updatedStaff = await _staffRepository.getStaffMembersInStore(
storeId,
);
final newMap = Map<String, List<StaffMemberModel>>.from(
state.staffByStore,
);
newMap[storeId] = updatedStaff;
emit(state.copyWith(status: StoreStatus.success, staffByStore: newMap));
loadStores();
} catch (e) {
emit(
state.copyWith(status: StoreStatus.failure, errorMessage: e.toString()),
@@ -129,14 +151,7 @@ class StoreCubit extends Cubit<StoreState> {
Future<void> removeStaffFromStore(String staffId, String storeId) async {
try {
await _staffRepository.removeFromStore(staffId, storeId);
final updatedStaff = await _staffRepository.getStaffMembersInStore(
storeId,
);
final newMap = Map<String, List<StaffMemberModel>>.from(
state.staffByStore,
);
newMap[storeId] = updatedStaff;
emit(state.copyWith(staffByStore: newMap));
loadStores();
} catch (e) {
emit(
state.copyWith(