providers (#3)

Reviewed-on: http://catelliub.zapto.org:3000/brontomark/flux/pulls/3
Co-authored-by: Mark M2 Macbook <marco@catelli.it>
Co-committed-by: Mark M2 Macbook <marco@catelli.it>
This commit is contained in:
2026-04-17 10:34:23 +02:00
committed by brontomark
parent 5229571fa1
commit c1b6c9e7ac
7 changed files with 585 additions and 59 deletions

View File

@@ -1,6 +1,8 @@
import 'package:equatable/equatable.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flux/core/blocs/session/session_bloc.dart';
import 'package:flux/features/master_data/providers/data/provider_repository.dart';
import 'package:flux/features/master_data/store/models/store_model.dart';
import 'package:get_it/get_it.dart';
import '../models/provider_model.dart';
@@ -43,18 +45,21 @@ class ProvidersState extends Equatable {
class ProvidersCubit extends Cubit<ProvidersState> {
final ProviderRepository _repository = GetIt.I<ProviderRepository>();
final SessionBloc _sessionBloc;
ProvidersCubit() : super(const ProvidersState());
ProvidersCubit(this._sessionBloc) : super(const ProvidersState());
// Carica i provider della company e quelli associati a uno store specifico
Future<void> loadProviders(String companyId, String? storeId) async {
Future<void> loadProviders(StoreModel? store) async {
emit(state.copyWith(isLoading: true));
try {
final all = await _repository.fetchAllCompanyProviders(companyId);
final all = await _repository.fetchAllCompanyProviders(
_sessionBloc.state.company!.id,
);
List<String> associated = [];
if (storeId != null) {
associated = await _repository.fetchAssociatedProviderIds(storeId);
if (store != null) {
associated = await _repository.fetchAssociatedProviderIds(store.id!);
}
emit(
@@ -100,12 +105,46 @@ class ProvidersCubit extends Cubit<ProvidersState> {
}
// Salvataggio/Update anagrafica (nuovo o modifica)
Future<void> saveProvider(ProviderModel provider) async {
Future<void> saveProvider(
ProviderModel provider,
List<String> selectedStoreIds,
) async {
emit(state.copyWith(isLoading: true));
// Assicuriamoci di settare la companyId prima di salvare
provider = provider.copyWith(companyId: _sessionBloc.state.company!.id);
try {
// 1. Salviamo l'anagrafica (upsert)
// Se è un nuovo provider, l'ID potrebbe essere generato qui dal DB
// Quindi carichiamo il risultato del salvataggio per avere l'ID
final response = await _repository.saveProvider(provider);
// Assumiamo che il saveProvider restituisca l'oggetto salvato con l'ID
final pId = provider.id ?? response.id;
// 2. Sincronizziamo i negozi
await _repository.syncProviderStores(pId!, selectedStoreIds);
// 3. Ricarichiamo tutto
await loadProviders(null);
} catch (e) {
emit(state.copyWith(isLoading: false, errorMessage: e.toString()));
}
}
Future<void> saveProviderWithStores(
ProviderModel provider,
List<String> storeIds,
) async {
emit(state.copyWith(isLoading: true));
try {
// 1. Salva l'anagrafica provider
await _repository.saveProvider(provider);
// Ricarichiamo la lista per vedere le modifiche
await loadProviders(provider.companyId, null);
// 2. Sincronizza i negozi (la via più semplice è cancellare e reinserire
// o fare un confronto tra i presenti e i nuovi)
await _repository.syncProviderStores(provider.id!, storeIds);
await loadProviders(null);
} catch (e) {
emit(state.copyWith(isLoading: false, errorMessage: e.toString()));
}