FarmerDeck İlk Staging Sürümü

Çiftlik, parsel, ürün döngüsü, görevler, ekipman, stok, finans, hava uyarıları ve çiftlik-bazlı yönetici davetlerini içeren FarmerDeck staging sürümünün ilk yayın notları.

FarmerDeck'in staging ortamındaki ilk kararlı derlemesini yayınlıyoruz. Bu sürüm, çiftlikten tarlaya, ürün döngüsünden finansal takibe kadar günlük operasyonun tüm temel akışlarını uçtan uca içerir.

Genel Bakış

  • Kişisel hesaplar için tek çiftlik modeli (accounts.is_personal_account) üzerine kurulu çok kiracılı veri izolasyonu.
  • Tüm kullanıcı yazma işlemleri RLS + yardımcı fonksiyonlar (has_role_on_account, has_permission) ile korunur.
  • Sunucu tarafı doğrulama next-safe-action ile, veri erişimi ise getSupabaseServerClient üzerinden yapılır.

Çiftlik ve Parseller

  • 2 adımlı onboarding sihirbazı: çiftlik bilgileri + ilk parsel.
  • complete_onboarding RPC'si tek işlemde çiftlik, parsel ve (opsiyonel) ekini kaydeder.
  • Çiftlik alanları: ad, slug, ülke kodu (ISO 3166 alpha-2), il, ilçe, enlem/boylam, saat dilimi (varsayılan Europe/Istanbul), toplam alan.
  • Çiftlik başına parsel listesi ve toplam alan hesabı.
  • TR için 81 il, il seçimine bağlı ilçe kademeli seçim.

Ürün Döngüsü ve Tarla Olayları

  • Durum makinesi: plannedplantedgrowingharvested / failed.
  • Olay tipleri: planting, irrigation, fertilization, pesticide, harvest, note.
  • Ürün döngüsü detayında timeline (olayların yatay çubuk üzerinde gösterimi) ve takvim görünümü.
  • Hasat kaydı (RecordHarvestSchema): tarih, miktar, birim.

Görevler

  • Manuel görev oluşturma: başlık, açıklama, teslim tarihi.
  • Görev kaynakları: manual, auto_weather, auto_low_stock, auto_maintenance, auto_harvest.
  • Durumlar: pending, completed, cancelled.
  • Dashboard'daki "Yaklaşan görevler" kartı, v_upcoming_tasks görünümü üzerinden 7 gün içindeki bekleyen görevleri listeler.

Ekipman ve Bakım

  • Ekipman tipleri: tractor, trailer, plow, pump, harvester, other.
  • Durumlar: active, maintenance, broken, sold.
  • Bakım olay tipleri: oil_change, tire, general, repair, inspection.
  • Bakım maliyeti girildiğinde create_maintenance_expense trigger'ı maintenance kategorili bir finans kaydı oluşturur ve transaction_id alanını bağlar.
  • 7 gün içinde bakım zamanı gelen aktif ekipmanlar için "Bakım hatırlatması" özet görevi (günde en fazla bir kez).

Stok ve Envanter

  • Kategoriler: seed, fertilizer, pesticide, feed, product, other.
  • Birimler: kg, liter, bag, piece, ton.
  • current_quantity alanı kit.update_inventory_current_quantity trigger'ı tarafından yönetilir; istemci tarafından doğrudan güncellenemez.
  • create_inventory_item_with_balance: Stok kartı + açılış bakiyesi tek işlemde.
  • record_inventory_in: Stok girişi + opsiyonel gider finans kaydı (kategoriye göre seed/fertilizer/pesticide/feed/other).
  • record_inventory_out: Stok çıkışı + parsel/ürün bağlıysa otomatik farm_events olayı (kategoriye göre planting/fertilization/pesticide/note).
  • record_inventory_sale: Envanter çıkışı + sale gelir kaydı atomik.
  • Saatlik pg_cron (farmerdeck-low-stock-tasks) current_quantity <= min_threshold olan kalemler için açık auto_low_stock görevi yoksa yeni görev oluşturur.
  • v_low_stock görünümü dashboard'daki "Düşük stok" kartında listelenir.

Finans

  • Manuel gelir/gider kaydı: tür, kategori, tutar, TRY varsayılan para birimi, tarih, parsel/ürün/ekipman/envanter bağlantıları.
  • Kategoriler: seed, fertilizer, pesticide, labor, fuel, feed, maintenance, sale, other.
  • Dönem görünümleri: bu ay, geçen ay, bu yıl. get_monthly_profit_loss ve istemci tarafı yıllık toplam.
  • get_parcel_profitability(parcel_id, from_date, to_date) parsel bazlı gelir/gider/net + kategori dökümü.
  • Otomatik finans kayıtları bakım maliyeti, stok girişi ve stok satışından üretilir; source = 'auto_*' ile işaretlenir.

Hava Uyarıları

  • Open-Meteo /v1/forecast entegrasyonu (API anahtarı gerektirmez). revalidate: 900 (15 dakika) önbellek.
  • 7 günlük tahmin; temperature_2m_max, temperature_2m_min, precipitation_sum, wind_speed_10m_max, weather_code.
  • Uyarı kuralları: don (temp_min <= 0), aşırı yağış (precipitation >= 30), dolu (WMO 96/99), fırtına (WMO ≥ 95), sıcak hava dalgası (temp_max >= 38).
  • app/api/cron/weather-sync 6 saatlik Vercel Cron; CRON_SECRET ile korunan GET çağrısı çiftlikleri 5'li gruplar halinde paralel işler.
  • weather_alerts_farm_risk_forecast_uidx unique index'i ile tekil uyarı garantisi.
  • Orta ve yüksek riskli uyarılar için create_weather_alert_task trigger'ı auto_weather görevi oluşturur ve weather_alerts.task_id alanını bağlar.
  • weather_alerts tablosu authenticated için salt okunur; supabase_realtime publication'ına dahildir.

Çiftlik Davetleri ve Çiftlik-Bazlı Finans İzni

  • Çiftlik sahibi (account_id sahibi) çiftliğine manager veya viewer rolünde yönetici davet eder.
  • Davet farm_invitations tablosunda 7 gün geçerli UUID token ile saklanır; farm_id, email çifti benzersizdir.
  • EMAIL_SENDER ve NEXT_PUBLIC_SITE_URL tanımlıysa assignFarmMemberAction üzerinden davet e-postası gönderilir; gönderim başarısız olursa davet kaydı otomatik silinir.
  • farm-invitations/join sayfasında davet kabul edilir; accept_farm_invitation RPC'si token süresini ve davet edilen e-posta ile oturum e-postasının birebir eşleşmesini doğrular.
  • Kabul sonrası kullanıcı farm_members tablosuna eklenir (veya mevcut üyenin rolü güncellenir) ve davet kaydı silinir.
  • Üyeler için çiftlik-bazlı finans erişim seviyesi: none, view (finance.view), manage (finance.view + finance.manage). İzinler farm_member_permissions tablosunda tutulur.
  • Çiftlik sahibi bekleyen davetleri iptal edebilir; üyeleri çiftlikten çıkarabilir.

Veri Bütünlüğü ve Güvenlik

  • kit.assert_same_account_references trigger'ı; parcels, crop_cycles, farm_events, equipment, equipment_maintenance_events, inventory_items, inventory_transactions ve weather_alerts tablolarında yabancı anahtar alanlarının aynı hesaba ait olmasını yazma anında doğrular.
  • kit.protect_account_fields tetikleyicisi, accounts tablosunda id, is_personal_account, primary_owner_user_id ve email alanlarının istemci tarafından değiştirilmesini engeller.
  • Tüm tablolarda RLS etkin; service_role sistem yazma işlemleri için ayrılmıştır.
  • kit.update_inventory_current_quantity trigger'ı service_role ile çalışır; kullanıcılar current_quantity alanını doğrudan güncelleyemez.
  • record_inventory_sale, record_inventory_in, record_inventory_out ve create_inventory_item_with_balance RPC'leri atomik işlemlerdir: bir adım başarısız olursa tümü geri alınır.

Bilinen Kapsam Dışı Öğeler

Bu sürüm aşağıdaki öğeleri içermez:

  • Ekip üyelerinin (team accounts) FarmerDeck'e taşınması; yalnızca kişisel hesaplar için hazırdır.
  • Mobil uygulama; yalnızca web uygulaması.
  • Çoklu dil gövdesinin çevirisi; altyapı hazır, çeviri dosyaları ileride eklenecek.
  • E-posta/SMS bildirim kanalları; e-posta yalnızca çiftlik davetlerinde kullanılır.

Doğrulama

Sürüm; 345 pgTAP veritabanı testi, Supabase DB lint ve ilgili TypeScript typecheck kontrolleriyle doğrulandı.