/// Kapcsolat (névjegy) — a Supabase `contacts` táblát tükrözi. /// /// Ez a menü CSAK online, bejelentkezett és jogosult felhasználóknak /// érhető el, ezért nincs lokális tükrözés/offline-sync: közvetlenül a /// Supabase-ből olvassuk/írjuk, a hozzáférést az RLS + a jogosultság- /// tábla dönti el. Az uuid szerveroldali (gen_random_uuid()). class Contact { final String? id; // uuid — új rekordnál null, a szerver adja final String projectId; // az AKTUÁLIS projekt uuid-ja (terepi_seged_projects.id) final String name; final String address; final String phone; final String email; final String note; final String? createdBy; final DateTime? updatedAt; /// Opcionális helyszín — WGS84 (lat/lon) és EOV (eovY/eovX) is tárolva, /// akárcsak a többi geometria-típusnál. Csak akkor van kitöltve, ha a /// térképi "Kapcsolat" eszközzel vették fel, vagy utólag hozzárendelték. final double? lat; final double? lon; final double? eovY; final double? eovX; const Contact({ this.id, required this.projectId, required this.name, this.address = '', this.phone = '', this.email = '', this.note = '', this.createdBy, this.updatedAt, this.lat, this.lon, this.eovY, this.eovX, }); bool get hasLocation => lat != null && lon != null; Contact copyWith( {String? name, String? address, String? phone, String? email, String? note, double? lat, double? lon, double? eovY, double? eovX, bool clearLocation = false}) => Contact( id: id, projectId: projectId, name: name ?? this.name, address: address ?? this.address, phone: phone ?? this.phone, email: email ?? this.email, note: note ?? this.note, createdBy: createdBy, updatedAt: updatedAt, lat: clearLocation ? null : (lat ?? this.lat), lon: clearLocation ? null : (lon ?? this.lon), eovX: clearLocation ? null : (eovX ?? this.eovX), eovY: clearLocation ? null : (eovY ?? this.eovY), ); /// Beszúráshoz/frissítéshez — az id-t csak akkor küldjük, ha van /// (frissítésnél), a szerveroldali mezőket (created_by, updated_at) /// sosem a kliens állítja. Map toWriteMap() => { if (id != null) 'id': id, 'project_id': projectId, 'name': name.trim(), 'address': address.trim(), 'phone': phone.trim(), 'email': email.trim(), 'note': note.trim(), 'lat': lat, 'lon': lon, 'eov_y': eovY, 'eov_x': eovX, }; factory Contact.fromMap(Map m) => Contact( id: m['id'] as String?, projectId: m['project_id'] as String, name: (m['name'] as String?) ?? '', address: (m['address'] as String?) ?? '', phone: (m['phone'] as String?) ?? '', email: (m['email'] as String?) ?? '', note: (m['note'] as String?) ?? '', createdBy: m['created_by'] as String?, updatedAt: m['updated_at'] != null ? DateTime.tryParse(m['updated_at'] as String) : null, lat: (m['lat'] as num?)?.toDouble(), lon: (m['lon'] as num?)?.toDouble(), eovY: (m['eov_y'] as num?)?.toDouble(), eovX: (m['eov_x'] as num?)?.toDouble(), ); }