Files
MobilApp/lib/services/field_property_service.dart
T
2026-08-31 20:38:18 +02:00

99 lines
3.2 KiB
Dart

import 'package:get/get.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
import '../models/field_party.dart';
import '../models/field_property.dart';
/// Ingatlan-nyilvántartás lekérdezései — SZÁNDÉKOSAN tisztán online,
/// nincs helyi outbox/tükör-tábla (a kapcsolatokkal/mérésekkel
/// ellentétben). Ez az adat nem kerülhet a készülék adatbázisába.
class FieldPropertyService extends GetxService {
static FieldPropertyService get to => Get.find();
SupabaseClient get _client => Supabase.instance.client;
/// Ingatlanok listája, kereséssel/szűréssel.
Future<List<FieldProperty>> listProperties({
required String projectId,
String? search,
String? settlement,
String? mailingStatus,
}) async {
var query = _client
.from('terepi_seged_field_properties_view')
.select()
.eq('project_id', projectId);
if (settlement != null && settlement.isNotEmpty) {
query = query.eq('settlement', settlement);
}
if (mailingStatus != null && mailingStatus.isNotEmpty) {
query = query.eq('mailing_status', mailingStatus);
}
if (search != null && search.trim().isNotEmpty) {
final s = search.trim().replaceAll(',', ' ');
query = query.or(
'parcel_number.ilike.%$s%,owner_names.ilike.%$s%,settlement.ilike.%$s%',
);
}
final rows = await query
.order('settlement', ascending: true)
.order('parcel_number', ascending: true)
.limit(1000);
return rows.map((r) => FieldProperty.fromMap(r)).toList();
}
/// Tulajdonosok keresése név szerint.
Future<List<FieldParty>> searchParties({
required String projectId,
String? search,
}) async {
var query = _client
.from('terepi_seged_field_parties_view')
.select()
.eq('project_id', projectId);
if (search != null && search.trim().isNotEmpty) {
query = query.ilike('name', '%${search.trim()}%');
}
final rows = await query.order('name', ascending: true).limit(1000);
return rows.map((r) => FieldParty.fromMap(r)).toList();
}
/// Egy adott tulajdonos ÖSSZES ingatlana.
Future<List<FieldProperty>> listPropertiesForParty(String partyId) async {
final links = await _client
.from('terepi_seged_field_property_parties')
.select('property_id')
.eq('party_id', partyId)
.eq('is_current', true);
final propertyIds =
links.map((r) => r['property_id'] as String).toSet().toList();
if (propertyIds.isEmpty) return [];
final rows = await _client
.from('terepi_seged_field_properties_view')
.select()
.inFilter('id', propertyIds)
.order('settlement')
.order('parcel_number');
return rows.map((r) => FieldProperty.fromMap(r)).toList();
}
/// Egy ingatlan tulajdonosi/kezelői bontása, tulajdoni hányaddal — a
/// részletnézethez.
Future<List<Map<String, dynamic>>> propertyOwnershipDetail(
String propertyId) async {
final rows = await _client
.from('terepi_seged_field_property_parties')
.select('*, terepi_seged_field_parties(name, party_type)')
.eq('property_id', propertyId)
.eq('is_current', true);
return List<Map<String, dynamic>>.from(rows);
}
}