Birleşik Kişi Dizini Mimarisi
TotalApp'ın müşterileri, tedarikçileri, adayları ve şirketleri tek bir kayıt olarak nasıl modellediği — ve CRM, Satış, Satın Alma ve Çağrı Merkezi'nin bunu nasıl okuyup yazdığı.
Genel Bakış
Çoğu CRM/ERP ürünü, birbirini örten üç dört "bu kim?" kavramıyla sonuçlanır — bir CRM Hesabı, bir Satış Müşterisi, bir Satın Alma Tedarikçisi, bir Kişi — her biri ayrı saklanır, her biri diğerlerinden bağımsız olarak senkron dışı kalır. TotalApp bunu, her kişi ve şirketi tek bir birleşik Contact kaydında saklayarak önler. Bir kişinin ne olduğu — müşteri, tedarikçi, aday, şirket, üretici — hangi tabloda yaşadığı değil, o tek kayıt üzerindeki bir dizi boolean rol bayrağıdır. Bu sayfa o modelin mimari referansıdır: veri şekli, yaşam döngüsü ve her modülün — Hesaplar, Satış Hunisi, Tedarikçi Yönetimi ve Çağrı Merkezi — onu tam olarak nasıl okuyup yazdığı.
"Hesaplar" Nereye Gitti
TotalApp'ın önceki sürümlerinde "Hesaplar" adında bir CRM ekranı vardı; bu, Finans modülündeki Hesap Planı ile çakışıyordu (aynı kelime hangi modülde olduğunuza bağlı olarak iki farklı şey anlamına geliyordu — Odoo/Salesforce/HubSpot tarzı ürünlerde iyi bilinen bir belirsizlik). O ekran artık Hesaplar olarak adlandırılıyor ve "Hesaplar" yalnızca Finans'ın defter hesapları için ayrılmış durumda.
Kişi Kaydı
Hangi modülde bulduğunuza bakılmaksızın, her kişi veya şirket şu şekle sahip tek bir satırdır:
| Alan | Tür | Amaç |
|---|---|---|
| id, name | string | Kimlik. |
| parentId | string | null | Bir bireyi çalıştığı şirkete bağlar. |
| company, email, phone | string | Standart iletişim bilgileri. |
| roles | boolean nesnesi | Bu kişinin sizinle hangi ilişkilere sahip olduğu — aşağıdaki Rol Bayrakları tablosuna bakın. Birkaçı aynı anda true olabilir. |
| lifecycleStage | enum | suspect → lead → opportunity → customer. Kişinin kendi CRM huni konumu — herhangi bir Fırsatın huni aşamasından ayrıdır. |
| status | enum | active / inactive / pending. |
| tags | string[] | Serbest metin kategori etiketleri (sektör, tedarikçi kategorisi, "call-center" gibi kaynak). |
| vendorProfile | nesne (isteğe bağlı) | Yalnızca roles.isVendor true olduğunda mevcuttur — vergi kimlik no, VAT numarası, adres/şehir/ülke, ödeme koşulları, para birimi, kategoriler ve performans metrikleri. Aşağıdaki "Tedarikçi Profili Alanları"na bakın. |
Rol Bayrakları
Bir kişinin rol bayrakları serbestçe birleşebilir. Sizden de yazılım alan bir tedarikçi, tam olarak aynı kayıtta hem isVendor: true HEM DE isCustomer: true'dur — senkronda tutulacak iki ayrı satır asla değil.
| Bayrak | Anlamı | Kimler Okur |
|---|---|---|
| isCompany | Bireysel bir kişi yerine tüzel bir kuruluş. | Müşteriler → Şirketler sekmesi |
| isCustomer | Sizden mal/hizmet satın alır. | Müşteriler → Müşteriler filtresi |
| isVendor | Size mal/hizmet satar (tedarikçi). | Tedarikçi Yönetimi, Müşteriler → Tedarikçiler filtresi |
| isManufacturer | Parça veya ürün üretir (Üretim / MOM bağlamı). | Üretim tarafı ekranları için ayrılmıştır. |
| isTransporter | Nakliye / lojistik sağlayıcısı. | Depo/Lojistik ekranları için ayrılmıştır. |
| isLead | Henüz ödeme yapan bir müşteriye dönüşmemiş satış adayı. | Müşteriler → Adaylar filtresi, Satış Hunisi |
| isEmployee | Şirket içi personel üyesi. | Dahili görev/gider bağlamları için ayrılmıştır. |
Tabloya Göre Değil, Role Göre Filtreleme
Yalnızca bir tablo olduğu için, "müşteriler" veya "tedarikçiler" gösteren her ekran aslında farklı bir filtre uygulanmış aynı dizindir. Hesaplar ekranının rol filtre çubuğu (Tümü / Müşteriler / Tedarikçiler / Şirketler / Adaylar) bunun en görünür örneğidir — filtre değiştirmek asla farklı bir veri kümesini yeniden sorgulamaz, yalnızca hangi bayrağın kontrol edildiğini değiştirir.
Yaşam Döngüsü Aşaması ve Fırsat Aşaması — Karıştırmayın
Bu, birleşik kişi dizinine karşı yeni bir modül entegre ederken en sık karşılaşılan kafa karışıklığıdır, bu yüzden kendi bölümünü hak ediyor:
- Contact.lifecycleStage, kişinin kendisine aittir — kişinin genel ilişki hunisinde nerede olduğunu tanımlayan, her zaman güncel, tek bir değerdir.
- Deal.stage (Nitelikli / Teklif / Pazarlık / Kazanıldı / Kaybedildi, Satış Hunisi'nde), o kişiye bağlı belirli bir fırsata aittir. Tek bir kişinin, kendi lifecycleStage'i şu an nerede olursa olsun, aynı anda farklı aşamalarda birden çok açık Fırsatı olabilir.
- İkisi tam olarak bir otomasyonla bağlanır: bağlı bir Fırsatı Kazanıldı'ya sürüklemek, kişinin yaşam döngüsü aşamasını
customer'a ilerletir (aşağıdaki "Kazanıldı Otomasyonu"na bakın). Başka hiçbir Fırsat aşaması değişikliği lifecycleStage'e dokunmaz.
Modül Entegrasyon Haritası
Şu anda dört modül birleşik dizinden okuyup ona yazıyor. Her biri, o modülün günlük olarak nasıl çalıştığına uygun farklı bir giriş noktası kullanır:
Hesaplar
Dizinin birincil arayüzü. Kişileri doğrudan listeler, role göre filtreler, oluşturur (isCustomer) ve düzenler. Şirketler sekmesi, isCompany'ye filtrelenmiş aynı veridir.
Satış Hunisi
Fırsatları bir Kişi seçici aracılığıyla kişilere bağlar. Fırsatı Kazanıldı'ya ulaştığında bir kişiyi otomatik olarak Müşteri'ye yükseltir.
Tedarikçi Yönetimi
isCompany + isVendor ile kişiler oluşturur ve düzenler; paylaşılan kayda bir vendorProfile (vergi, ödeme koşulları, performans metrikleri) ekler.
Çağrı Merkezi
Her giden çağrı, çevrilen numarayı dizine karşı çözer — mevcut bir kişiyle eşleştirir veya yeni bir Aday otomatik oluşturur (isLead, lifecycleStage: suspect), böylece hiçbir arayan hiçbir zaman kaybolmaz.
Otomasyon Olayları
İki otomasyon, dizini elle tekrar giriş yapmadan güncel tutar. İkisi de tek yönlüdür ve idempotenttir — zaten dönüştürülmüş bir kişide iki kez çalıştırmak hiçbir işlem yapmaz.
| Tetikleyici | Nerede | Kişi Üzerindeki Etkisi |
|---|---|---|
| Kazanıldı dönüşümü | Bir kişiye bağlı bir Fırsat, Satış Hunisi'nde bir Kazanıldı sütununa sürüklenir. | roles.isCustomer → true, roles.isLead → false, lifecycleStage → customer. Bağlı kişisi olmayan veya kazanılmamış bir aşamaya bırakılan fırsatlar hiçbir şey yapmaz. |
| Çağrı Merkezi otomatik-adayı | Sanal Santral → Çağrı Başlat'ta, dizinde henüz bulunmayan bir telefon numarasına giden bir çağrı başlatılır. | Yeni bir kişi oluşturulur: roles.isLead → true, lifecycleStage → suspect, tags içinde "call-center" bulunur. Aynı numarayı tekrar aramak, çoğaltmak yerine mevcut kişiyi yeniden kullanır. |
Otomasyonlar Bir Kişiyi Asla Düşürmez
Hiçbir otomasyon isCustomer'ı temizlemez veya lifecycleStage'i geriye almaz. Bir kişi otomatik olarak yalnızca hunide ileri (Müşteri'ye doğru) hareket eder; bir kişiyi düşürmek (örn. eski bir müşteriyi pasif olarak işaretlemek) her zaman elle yapılan bir düzenlemedir.
Tedarikçi Profili Alanları
roles.isVendor: true olan kişiler için ayrılmıştır — ayrı bir tedarikçi tablosu yerine aynı kayda eklenir, böylece hem müşteri hem tedarikçi olan bir kişi tek bir satır olarak kalır:
| Alan | Açıklama |
|---|---|
| taxId, vatNumber | Vergi ve KDV kayıt numaraları. |
| address, city, country | Kayıtlı işletme konumu. |
| paymentTermsDays, currency | Satın alma belgelerinde kullanılan ödeme koşulları ve faturalama para birimi. |
| categories | Tedarikçinin sağladığı şeyleri tanımlayan serbest metin etiketleri. |
| metrics | totalOrders, onTimeDeliveries, lateDeliveries, averageLeadTimeDays, qualityScore, reliabilityScore, totalSpent, lastOrderDate — satın alma siparişi geçmişinden hesaplanır ve tedarikçinin profil panelinde gösterilir. |