From a30a1f3a14d0558ee13817a9bc6727bbbf9597ab Mon Sep 17 00:00:00 2001 From: Mark M2 Macbook Date: Mon, 13 Apr 2026 12:40:26 +0200 Subject: [PATCH] started staff --- lib/features/staff/data/staff_repository.dart | 58 +++++++++++++++++++ .../staff/models/staff_member_model.dart | 47 +++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 lib/features/staff/data/staff_repository.dart create mode 100644 lib/features/staff/models/staff_member_model.dart diff --git a/lib/features/staff/data/staff_repository.dart b/lib/features/staff/data/staff_repository.dart new file mode 100644 index 0000000..c03c820 --- /dev/null +++ b/lib/features/staff/data/staff_repository.dart @@ -0,0 +1,58 @@ +import 'package:flux/features/staff/models/staff_member_model.dart'; +import 'package:get_it/get_it.dart'; +import 'package:supabase_flutter/supabase_flutter.dart'; + +class StaffRepository { + final SupabaseClient _supabase = GetIt.I.get(); + + // --- ANAGRAFICA PURA --- + + // Prende tutto lo staff della Company (per l'Hub Anagrafiche) + Future> getStaffMembers(String companyId) async { + final response = await _supabase + .from('staff_member') + .select() + .eq('company_id', companyId) + .order('name', ascending: true); + + return (response as List).map((s) => StaffMemberModel.fromJson(s)).toList(); + } + + Future saveStaffMember(StaffMemberModel member) async { + await _supabase.from('staff_member').upsert(member.toJson()); + } + + // --- LOGICA DI GIUNZIONE (Staff <-> Store) --- + + // Recupera i membri assegnati a uno specifico negozio + // Qui facciamo una JOIN per avere i dati del membro partendo dalla tabella di giunzione + Future> getStaffMembersInStore(String storeId) async { + final response = await _supabase + .from('staff_in_stores') + .select( + 'staff_member (*)', + ) // Prende tutti i campi della tabella staff_member collegata + .eq('store_id', storeId); + + return (response as List) + .map((item) => StaffMemberModel.fromJson(item['staff_member'])) + .toList(); + } + + // Assegna un membro a un negozio + Future assignToStore(String staffId, String storeId) async { + await _supabase.from('staff_in_stores').insert({ + 'staff_member_id': staffId, + 'store_id': storeId, + }); + } + + // Rimuove l'assegnazione + Future removeFromStore(String staffId, String storeId) async { + await _supabase + .from('staff_in_stores') + .delete() + .eq('staff_member_id', staffId) + .eq('store_id', storeId); + } +} diff --git a/lib/features/staff/models/staff_member_model.dart b/lib/features/staff/models/staff_member_model.dart new file mode 100644 index 0000000..425d901 --- /dev/null +++ b/lib/features/staff/models/staff_member_model.dart @@ -0,0 +1,47 @@ +import 'package:equatable/equatable.dart'; +import 'package:flux/core/utils/string_extensions.dart'; // Assicurati che il percorso sia corretto + +class StaffMemberModel extends Equatable { + final String? id; + final String name; + final String email; + final String phone; + final bool isActive; + final String companyId; + + const StaffMemberModel({ + this.id, + required this.name, + this.email = '', + this.phone = '', + this.isActive = true, + required this.companyId, + }); + + factory StaffMemberModel.fromJson(Map json) { + return StaffMemberModel( + id: json['id'], + // Applichiamo il tuo myFormat per visualizzare i nomi correttamente + name: (json['name'] as String).myFormat(), + // L'email la teniamo lowercase per standard tecnico + email: (json['email'] as String? ?? '').toLowerCase().trim(), + phone: (json['phone'] as String? ?? '').trim(), + isActive: json['is_active'] ?? true, + companyId: json['company_id'], + ); + } + + Map toJson() { + return { + if (id != null) 'id': id, + 'name': name.toLowerCase().trim(), // Salviamo pulito per le query + 'email': email.toLowerCase().trim(), + 'phone': phone.trim(), + 'is_active': isActive, + 'company_id': companyId, + }; + } + + @override + List get props => [id, name, email, phone, isActive, companyId]; +}