users
users, sistemdeki gerçek kullanıcı kimliğinin ana tablosudur.
Bu tablo sistemin temel kimlik katmanıdır. Uygulamaya giriş yapan her kişi burada tanımlanır. Notlar, inbox mesajları, finansal işlemler ve cihaz yetkileri hepsi kullanıcı kimliği etrafında döner. Mobil uygulama oturumları da bu tablo ile ilişkilendirilir; mobile_devices tablosu bu kullanıcı grubunun hangi fiziksel telefon/cihazdan giriş yaptığını ve her cihazın push token'ını tutar. Kısaca: sistem içinde bir kişi kim, nasıl giriş yapar, genel rolü nedir sorusunun cevabı bu tabloda yer alır.
Yeni kayıtta role_id değeri tek bir sabit default ile verilmez; onboarding kaynağına göre atanır. Kural: Maraba uygulamasından gelen kullanıcı için 21 (farmer_employee), Qapu uygulamasından gelen kullanıcı için 31 (corporate_operator), bayi panelinden gelen kullanıcı için 10 (dealer_admin) başlangıç rolü atanır. Bu atama uygulama servis katmanında yapılır.
AI servis kullanıcıları bu onboarding kuralının dışındadır. Agent kullanıcıları role_id: 6 (ai_agent) ile açılır, insan kullanıcı gibi mobil login/push akışına girmez ve cihaz bazlı authority kaydı oluşturulmaz.
Bu tablo yalnız kimlik ve giriş bilgisini taşır. Belirli bir cihaz üzerindeki yetki burada tanımlanmaz (o authorities tablosundadır). Cihaz başlat/durdur, nota ekleme, rapor görüntüleme gibi aksiyon izinleri bu tabloda değildir (authority_permissions tablosundadır). Mobil cihazın hangi push token'a sahip olduğu, OS bilgisi, model gibi teknik detaylar da bu tabloda tutulmaz (mobile_devices tablosundadır). Kısaca: bir kullanıcı hangi cihazda ne yapabilir sorusunun cevabı burada değildir.
Yapilacaklar (Soft Delete ve Audit)
-
is_deleted boolean not null default falsevedelete_time timestamp nullalanlari eklendi. -
created_byveupdated_byalanlari eklendi. -
create_timeveupdate_timezorunlu yasam dongusu alanlari olarak korundu. -
updated_byFK sertlestirmesi ve audit trigger migrationi uygulama asamasinda.
FK Davranis Notlari
| FK | ON DELETE | ON UPDATE | Not |
|---|---|---|---|
users.role_id -> user_roles.id | RESTRICT | RESTRICT | Rol sozlugunde sessiz bozulma engellenir. |
users.status_id -> statuses.id | RESTRICT | RESTRICT | Durum sozlugu tutarliligi korunur. |
users.address_id -> addresses.id | SET NULL | CASCADE | Adres silinse de kullanici kaydi korunur. |
Kolonlar
| Kolon | Tip | Null | Kısıtlar | Anlamı |
|---|---|---|---|---|
id | int | hayır | PK, AUTO INCREMENT | Kullanıcı anahtarı |
email | varchar(100) | evet | UNIQUE | E-posta ile giriş/iletişim |
phone_number | varchar(20) | hayır | UNIQUE | Telefon numarası (kayıtta zorunlu) |
password_hash | varchar(255) | evet | - | Parola hash'i |
pin_code | char(4) | hayır | DEFAULT: phone_number son 4 hane | 4 haneli işlem PIN'i |
first_name | varchar(100) | hayır | - | Ad |
last_name | varchar(100) | hayır | - | Soyad |
role_id | int | hayır | FK → user_roles.id, uygulama kaynağına göre default (Maraba: 21, Qapu: 31, Bayi: 10) | Genel rol |
status_id | int | hayır | FK → statuses.id, DEFAULT: 201 | Kullanıcı statüsü |
address_id | int | evet | FK → address.addresses.id | Adres ilişkisi |
last_login_time | timestamp | evet | - | Son giriş zamanı |
marketing_consent | boolean | hayır | DEFAULT: false | Pazarlama izni |
is_deleted | boolean | hayır | DEFAULT: false | Soft delete bayrağı |
delete_time | timestamp | evet | - | Soft delete zamanı |
created_by | int | hayır | FK → users.id | Kaydı oluşturan actor |
updated_by | int | hayır | FK → users.id | Kaydı güncelleyen actor |
create_time | timestamp | hayır | - | Oluşturma |
update_time | timestamp | hayır | - | Güncelleme |
Security Notes
pin_codealanı kullanım amacı gereği 4 haneli işlem doğrulama kodu olarak tutulur.- Bu alan parola yerine geçmez; yalnız işlem onayında kullanılır.
pin_codeasla log, telemetry veya analitik çıktılarında düz metin olarak taşınmamalıdır.- İletim ve saklama güvenliği için uygulama katmanında maskeleme ve erişim sınırlaması zorunludur.
Doğrulama ve Guard Kuralları (Öneri)
users tablosunda uygulama/DB seviyesinde aşağıdaki doğrulamalar önerilir:
pin_codeher zaman 4 haneli numerik formatta olmalı.- Kullanıcı kaydında en az bir giriş yöntemi bulunmalı (email veya parola veya PIN).
- Sistem kullanıcısı (
id: 0) yalnızca200 (System)statüsünde tutulmalı. is_deleted = trueisedelete_timedolu olmalı; aktif kayıttadelete_timenull olmalı.created_byveupdated_byalanları her insert/update işleminde set edilmelidir.- Operasyonel performans için
role_id + status_idvelast_login_timealanlarında indeksleme uygulanmalı.
Örnek Kayıtlar
- ID 0: Sistem Otomasyonu
- Kullanıcı 1: Mehmet Günce
- Kullanıcı 2: Naz Akkoyun
- Kullanıcı 3: Furkan Ekinci (PIN-only)
{
"id": 0,
"email": null,
"phone_number": "900000000000",
"password_hash": null,
"pin_code": "0000",
"first_name": "Sistem",
"last_name": "Otomasyonu",
"role_id": 1,
"status_id": 200,
"address_id": null,
"last_login_time": null,
"marketing_consent": false,
"is_deleted": false,
"delete_time": null,
"created_by": 0,
"updated_by": 0,
"create_time": "2026-01-01T00:00:00Z",
"update_time": "2026-01-01T00:00:00Z"
}
Özet: Sistem tarafından oluşturulan sabit kayıt (ID: 0). Mobil app kurulumları, otomatik authority oluşturma gibi sistem olaylarında granted_by: 0 olarak yazılır. İnsan değildir, login yapamaz.
{
"id": 1,
"email": "gunce@example.com",
"phone_number": "905321112233",
"password_hash": "$2b$12$examplepasswordhash001",
"pin_code": "2233",
"first_name": "Mehmet",
"last_name": "Günce",
"role_id": 1,
"status_id": 202,
"address_id": 2,
"last_login_time": "2026-04-03T09:30:00Z",
"marketing_consent": true,
"is_deleted": false,
"delete_time": null,
"created_by": 0,
"updated_by": 1,
"create_time": "2026-03-01T08:00:00Z",
"update_time": "2026-04-03T09:30:00Z"
}
Özet: Email + PIN ile giriş yapan admin kullanıcı. Son girişi 3 Nisan 09:30.
{
"id": 2,
"email": "naz@example.com",
"phone_number": "905421112244",
"password_hash": "$2b$12$examplepasswordhash002",
"pin_code": "2244",
"first_name": "Naz",
"last_name": "Akkoyun",
"role_id": 20,
"status_id": 202,
"address_id": 1,
"last_login_time": "2026-04-02T21:15:00Z",
"marketing_consent": false,
"is_deleted": false,
"delete_time": null,
"created_by": 1,
"updated_by": 2,
"create_time": "2026-03-05T10:00:00Z",
"update_time": "2026-04-02T21:15:00Z"
}
Özet: Email + şifre ile giriş yapan farmer kullanıcı. İşlem PIN'i girilmediği için telefonun son 4 hanesi (2244) default yazıldı. Son girişi 2 Nisan 21:15.
{
"id": 3,
"email": null,
"phone_number": "905551112255",
"password_hash": null,
"pin_code": "2255",
"first_name": "Furkan",
"last_name": "Ekinci",
"role_id": 21,
"status_id": 201,
"address_id": null,
"last_login_time": null,
"marketing_consent": false,
"is_deleted": false,
"delete_time": null,
"created_by": 1,
"updated_by": 1,
"create_time": "2026-03-10T12:00:00Z",
"update_time": "2026-03-10T12:00:00Z"
}
Özet: PIN-only erişim kullanan farmer_employee profilli kullanıcı. Email ve şifre yok. PIN değeri telefon son 4 hanesi (2255) olarak tutulmuş. Henüz SMS doğrulaması tamamlanmadığı için statüsü 201 (Unverified).