agent-enderun 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.enderun/PROJECT_MEMORY.md +1 -0
- package/.enderun/agents/manager.md +3 -1
- package/.enderun/logs/manager.json +11 -1
- package/.enderun/skills/agent_handshake.md +37 -0
- package/.enderun/skills/multi_agent_coordination.md +64 -0
- package/.enderun/skills/subagent_lifecycle.md +48 -0
- package/README.md +53 -93
- package/docs/api-referans.md +1137 -0
- package/docs/is_akislari.md +902 -0
- package/docs/mimari.md +926 -0
- package/docs/moduller.md +294 -0
- package/docs/proje.md +521 -0
- package/docs/yap/304/261.md +2150 -0
- package/gemini.md +1 -1
- package/package.json +2 -2
- package/src/cli/adapters.ts +44 -10
- package/src/cli/commands/init.ts +24 -6
- package/src/cli/utils/fs.ts +1 -0
- package/src/cli/utils/memory.ts +17 -0
|
@@ -0,0 +1,2150 @@
|
|
|
1
|
+
# KENTİM — Sayfa Yapısı ve İşlemler Belgesi (MVP Sürümü)
|
|
2
|
+
|
|
3
|
+
> Bu belge, proje çekirdeği belgesi (proje.md) ile birlikte okunmalıdır.
|
|
4
|
+
> Her panelin hangi sayfalardan oluştuğunu, sayfa bazında URL yapısını, erişim kurallarını, içerikleri, form alanlarını ve işlemleri tanımlar.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Genel Kurallar (Tüm Paneller İçin Geçerli)
|
|
9
|
+
|
|
10
|
+
### URL Yapısı
|
|
11
|
+
|
|
12
|
+
| Panel | Temel URL |
|
|
13
|
+
| :--- | :--- |
|
|
14
|
+
| Vatandaş Web | `kentim.com.tr/` |
|
|
15
|
+
| Belediye Paneli | `panel.kentim.com.tr/` |
|
|
16
|
+
| Central Panel | `central.kentim.com.tr/` |
|
|
17
|
+
|
|
18
|
+
### Ortak Sayfalama Kuralları
|
|
19
|
+
|
|
20
|
+
- Tüm listeleme sayfalarında varsayılan sayfa başına kayıt: **20**
|
|
21
|
+
- Seçenekler: 20 / 50 / 100
|
|
22
|
+
- URL'de `?page=2&limit=50` parametreleriyle yönetilir
|
|
23
|
+
- Toplam kayıt sayısı listenin üstünde gösterilir
|
|
24
|
+
|
|
25
|
+
### Ortak Form Validasyon Kuralları
|
|
26
|
+
|
|
27
|
+
| Alan Tipi | Kural |
|
|
28
|
+
| :--- | :--- |
|
|
29
|
+
| Kısa metin (başlık, ad) | Min 3 — Max 150 karakter |
|
|
30
|
+
| Uzun metin (açıklama, not) | Max 2000 karakter |
|
|
31
|
+
| E-posta | RFC 5321 formatı, max 254 karakter |
|
|
32
|
+
| TC Kimlik | 11 hane, T.C. kimlik no algoritması (tek hane kontrolü) uyarınca geçerli |
|
|
33
|
+
| Telefon | `05XXXXXXXXX` formatı (11 hane, Türkiye) |
|
|
34
|
+
| Şifre | Min 8 karakter, en az 1 büyük harf + 1 rakam |
|
|
35
|
+
| Fotoğraf dosyası | JPG / PNG / WEBP, max **5 MB / dosya**, max **5 dosya** |
|
|
36
|
+
| Zorunlu alan | Boş bırakılamaz; kaydet/gönder düğmesi tıklanana kadar hata gösterilmez |
|
|
37
|
+
| Karakter sayacı | 2000 karakterli alanlarda kalan sayaç gösterilir |
|
|
38
|
+
| **Spam Koruması** | Anonim raporlarda Google reCAPTCHA v3 doğrulaması zorunludur. |
|
|
39
|
+
|
|
40
|
+
### Ortak API ve Güvenlik Kuralları
|
|
41
|
+
|
|
42
|
+
- **ID Mimarisi:** Tüm kamuya açık ve API bazlı kimlikleyiciler (iş emri, rapor, kullanıcı vb.) için **UUIDv4** kullanımı zorunludur. Sıralı tamsayı (autoincrement ID) kullanımı güvenlik (IDOR) ve veri sayma saldırılarını önlemek amacıyla yasaktır.
|
|
43
|
+
- **Tekilleştirme (Idempotency):** `POST` ve `PATCH` isteklerinde `x-idempotency-key` (UUID) kullanımı zorunludur. Aynı anahtar 24 saat boyunca saklanır.
|
|
44
|
+
- **Eşzamanlılık (Concurrency):** Kayıt güncellemelerinde `ETag` veya `x-version` header'ı ile iyimser kilitleme uygulanır. Sürüm uyuşmazlığında `409 Conflict` dönülür. **Mobil Çevrimdışı / Çakışma Yönetimi:** Çevrimdışı çalışan bir saha personeli internete bağlandığında elindeki eski sürümlü (`x-version` uyuşmazlığı) görev güncellemesini gönderirse ve `409 Conflict` hatası alırsa, mobil uygulama personelin yerel verilerini (taslağı) kesinlikle silmez. Personel arayüzde bir uyarı penceresiyle bilgilendirilir; yerel veri taslak olarak korunur ve iş otomatik olarak "Senkronizasyon Uyuşmazlık Havuzuna" (`dispute_logs`) gönderilerek şefin veya müdürün onayına sunulur.
|
|
45
|
+
- **Veri İzolasyonu ve Güvenlik Uygulaması:**
|
|
46
|
+
- **Sorgu Kapsamı (Query Scoping):** API seviyesinde (ORM/SQL), kullanıcının JWT token'ından çözülen rol ve ID bilgilerine göre otomatik `WHERE` filtreleri eklenir. (Örn: Müdür için `department_id`, Şef için `team_id`, Personel için `assigned_worker_id` filtreleri).
|
|
47
|
+
- **Yetki Kontrol Katmanı (RBAC Middleware):** Her kaynak erişiminde (`/work-orders/:id`) kullanıcının ilgili kaydı görme/değiştirme hakkı kontrol edilir; eşleşme sağlanmazsa `403 Forbidden` hatası dönülür.
|
|
48
|
+
- **Satır Bazlı Güvenlik (Row-Level Security):** Veritabanı seviyesinde (PostgreSQL RLS), rollere göre okuma/yazma politikaları tanımlanarak uygulama katmanından bağımsız bir güvenlik katmanı sağlanır.
|
|
49
|
+
- **Central Reverse Proxy Entegrasyonu:** Tüm panel, mobil ve dış entegrasyon istekleri `api.kentim.com.tr` (Central Gateway / Proxy) üzerinden ilgili belediyenin izole backend sunucusuna (`http://muni-x-backend.internal`) güvenli tünellerle yönlendirilir. Proxy katmanı, `Authorization` başlığındaki JWT token'ından `tenant_id`'yi çözerek isteği ilgili belediyeye iletir ve HTTP isteklerine otomatik `x-tenant-id` başlığını ekler.
|
|
50
|
+
- **Dahili Not Düzenleme / Silme Politikası:** Moderatör, müdür veya şef tarafından rapor veya iş emirlerine eklenen dahili notlar, ekleyen kişi tarafından **yalnızca ilk 15 dakika içerisinde** düzenlenebilir veya silinebilir. 15 dakika dolduktan sonra denetim loglarının bütünlüğü ve geçmiş izlenebilirlik (audit trail) açısından notlar kalıcı olarak kilitlenir; düzenleme veya silme eylemleri tamamen engellenir.
|
|
51
|
+
- **İş Emri ve Rapor Fiziksel Silme Politikası (Hard Delete Forbidden):** İş emirleri ve vatandaş raporları veritabanından hiçbir koşulda fiziksel olarak silinemez (Hard delete yasaktır). `rejected` veya `resolved` durumlarında arşivlenmiş olarak saklanır. KVKK silme/unutup silinme taleplerinde dahi veritabanı satırı korunur; yalnızca kişisel veriler maskelenir/anonimleştirilir (`citizen_id = null`, `description` maskelenir, fotoğraflar fiziksel olarak silinir ve CDN üzerinde bulunan fotoğraf URL'leri invalidate edilir) ancak iş emri bütünlüğü ve istatistiksel raporlama satırı korunmaya devam eder.
|
|
52
|
+
- **Hız Sınırlama (Rate Limiting):**
|
|
53
|
+
- Vatandaş API: IP başına 100 istek / 15 dakika.
|
|
54
|
+
- Anonim Rapor: IP başına 2 rapor / 1 dakika, 10 rapor / gün.
|
|
55
|
+
- Public API: IP başına 60 istek / 1 dakika.
|
|
56
|
+
- Belediye Paneli: Kullanıcı başına 1000 istek / 15 dakika.
|
|
57
|
+
- **Panik Butonu / Acil Sinyal:** Rate limiting kurallarından muaftır; düşük bant genişliği için sadece GPS koordinat paketi (lightweight) iletilir. **DDoS ve İstismar Koruması:** Sahte acil durum sinyali botlarını ve spam girişimlerini engellemek amacıyla, IP-tabanlı olmasa dahi cihaz bazlı (Device ID) hafif bir rate limit katmanı sunucu tarafında doğrulanır. Aynı Device ID'den dakikada **maksimum 5 panik sinyali** kabul edilir; bu limiti aşan istekler HTTP 429 Too Many Requests ile istemci seviyesinde sessizce reddedilir.
|
|
58
|
+
- **Coğrafi Doğrulama (Geofencing) & Sınır Sürüm Kilidi:** Raporlama API'si, koordinatların belediye sınırları (`boundaries`) içerisinde olup olmadığını sunucu tarafında kontrol eder. Depolama alanı şişmesini (bloating) engellemek amacıyla sınır geometrisi her satıra kopyalanmaz. İş emri oluşturulurken, o anki belediye sınır poligonunun sürüm referansı **"Boundary Version"** (`boundary_version_id` UUID'si) olarak iş emri satırına atanır ve kilitlenir. Saha çalışanının işi tamamladığı andaki geofence doğrulaması (`ST_Contains`), `municipal_boundary_versions` tablosu JOIN edilerek, işin oluşturulduğu andaki bu kilitli sürüm poligonu üzerinden gerçekleştirilir. Böylece personel sınır daralmalarından dolayı lockout hatası almaz.
|
|
59
|
+
|
|
60
|
+
### Tasarım ve Görsel Standartlar
|
|
61
|
+
|
|
62
|
+
| Element | Renk Kodu | Kullanım Amacı |
|
|
63
|
+
| :--- | :--- | :--- |
|
|
64
|
+
| **Danger Red** | `#a44a3f` | SLA aşımı, kritik hatalar, silme butonları, devre kesici uyarıları |
|
|
65
|
+
| **Forest Green** | `#2C5F2D` | Başarılı işlemler, `resolved` durumları, onay butonları |
|
|
66
|
+
| **Lime** | `#97BC62` | İkincil başarılar, aktif durumdaki olumlu rozetler |
|
|
67
|
+
| **Sage** | `#e8f0e1` | Arka plan zeminleri, ikincil bilgi kartları (göz yormayan) |
|
|
68
|
+
| **Cream** | `#f9fbf7` | Genel sayfa zemini, ana listeleme alanları |
|
|
69
|
+
|
|
70
|
+
- **İkonografi:** Karmaşıklığı azaltmak için minimalist, yuvarlatılmış köşeli düz (flat) vektör ikonlar tercih edilmelidir.
|
|
71
|
+
- **Bilişsel Yük:** Ekranlardaki metin yoğunluğu ikonlar ve renk kodlarıyla dengelenerek operasyonel okuma hızı maksimize edilmelidir.
|
|
72
|
+
|
|
73
|
+
### Bildirim Merkezi (Belediye ve Central Paneli)
|
|
74
|
+
|
|
75
|
+
Panelin üst çubuğunda zil simgesi yer alır:
|
|
76
|
+
- Okunmamış bildirim varsa kırmızı rozet sayısıyla gösterilir
|
|
77
|
+
- Zile tıklanınca sağ üstten açılan liste (dropdown) görünür; son 20 bildirim listelenir
|
|
78
|
+
- Her bildirim: başlık + kısa açıklama + zaman damgası + ilgili iş emrine bağlantı
|
|
79
|
+
- "Tümünü okundu işaretle" butonu
|
|
80
|
+
- "Tüm bildirimler" bağlantısı tam bildirim sayfasına yönlendirir
|
|
81
|
+
- **Gerçek zamanlı:** Belediye paneli WebSocket (veya SSE) bağlantısıyla anlık güncelleme alır; Central Panel 60 saniyede bir polling yapar
|
|
82
|
+
|
|
83
|
+
### Hata Sayfaları (Tüm Paneller)
|
|
84
|
+
|
|
85
|
+
| Hata | Sayfa İçeriği |
|
|
86
|
+
| :--- | :--- |
|
|
87
|
+
| **404 Sayfa Bulunamadı** | Logo, hata mesajı, ana sayfaya / panele dön butonu |
|
|
88
|
+
| **403 Yetkisiz Erişim** | Logo, "Bu sayfaya erişim yetkiniz yok" mesajı, panele dön butonu |
|
|
89
|
+
| **402 Abonelik Süresi Doldu** | Belediye logosu, bitiş tarihi, "Yenileme için lütfen merkezi yönetimle iletişime geçin" mesajı; vatandaş ve panel erişimi **kısıtlı salt-okunur moda geçer**. Yeni rapor, iş emri ve **sıfırdan (yeni) atama** yapılamaz. Ancak hali hazırda devam eden ve personel tarafından yarıda bırakılan veya devredilen mevcut aktif işlerin başka bir personele yeniden atanmasına (re-assign) 7 günlük süre boyunca izin verilir. **Saha Uygulaması:** Mevcut işlerin tamamlanması ve şef onayı için 7 gün boyunca "salt-tamamlama" modunda çalışmaya devam eder (yeni iş ataması kabul edilmez). **Grace Period'da Kaynak Tipine Göre Davranış:** Yeni vatandaş raporu (`citizen_report`) kabul edilmez. IoT telemetri (`integration`) kabul edilir ama eşik aşılsa bile yeni iş emri tetiklenmez. Periyodik scheduler (`scheduled`) askıya alınır. |
|
|
90
|
+
| **Public Harita Pasif** | "Bu belediye için halka açık harita henüz etkin değildir. Rapor oluşturmak için [buraya](/?modal=report) tıklayabilir veya belediye ile iletişime geçebilirsiniz." uyarılı graceful fallback sayfası; sitemap ve SEO için robots meta noindex uygulanır. |
|
|
91
|
+
| **500 Sunucu Hatası** | Logo, teknik hata mesajı, sayfayı yenile butonu |
|
|
92
|
+
| **Ağ / Bağlantı Hatası** | Offline banner; mevcut veriler önbellekten gösterilir, yeni veri çekilemez uyarısı |
|
|
93
|
+
|
|
94
|
+
### Oturum Yönetimi
|
|
95
|
+
|
|
96
|
+
- JWT tabanlı token; Access token süresi: **15 dakika** (Saha personeli mobil uygulaması için **2 saat**, şef (`muni_team_chief`) mobil: **2 saat**, web paneli: **1 saat**), Refresh token süresi: **7 gün**
|
|
97
|
+
- "Beni hatırla" seçeneği: refresh token süresi **30 güne** uzar
|
|
98
|
+
- Oturum süresi dolduğunda sayfa yenilenmeden toast mesajıyla uyarılır; kullanıcı bir sonraki API isteğinde giriş sayfasına yönlendirilir
|
|
99
|
+
- Aynı hesap birden fazla cihazda aktif olabilir
|
|
100
|
+
- Çıkış yapıldığında yalnızca ilgili cihazın token'ı geçersiz kılınır; "Tüm cihazlardan çıkış" seçeneği profil sayfasında mevcuttur
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## BÖLÜM 1: Vatandaş Web — `kentim.com.tr`
|
|
105
|
+
|
|
106
|
+
### 1.0 Kimlik Doğrulama Akışları
|
|
107
|
+
|
|
108
|
+
#### 1.0.1 Kayıt Akışı
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
Kullanıcı → "Hesap Oluştur" butonuna tıklar
|
|
112
|
+
↓
|
|
113
|
+
[Adım 1 — İletişim Bilgisi]
|
|
114
|
+
E-posta adresi girişi (zorunlu - SMS maliyet ve bot riskini sıfırlamak için telefon numarası kullanılmaz)
|
|
115
|
+
KVKK Açık Rıza metni onay kutusu (Zorunlu; "Raporunuz anonim olarak halka açık haritada görünebilir" uyarısını içerir)
|
|
116
|
+
İsteğe bağlı e-posta bildirim izni kutusu (Tüm OTP kodları strictly asenkron e-posta ile iletilir)
|
|
117
|
+
↓
|
|
118
|
+
[Adım 2 — E-posta OTP Doğrulama]
|
|
119
|
+
6 haneli OTP kodu (E-posta ile gönderilir); 5 dakika geçerli
|
|
120
|
+
"Kodu tekrar gönder" butonu: 60 saniye bekleme süresi ile aktif olur
|
|
121
|
+
3 yanlış denemede 15 dakika bekleme kilidi
|
|
122
|
+
↓
|
|
123
|
+
[Adım 3 — Şifre Oluşturma]
|
|
124
|
+
Şifre (min 8 karakter, 1 büyük harf, 1 rakam)
|
|
125
|
+
Şifre tekrar — eşleşme anlık kontrol edilir
|
|
126
|
+
↓
|
|
127
|
+
[Adım 4 — İsteğe Bağlı Profil & MERNIS]
|
|
128
|
+
Ad, soyad (displays adı / nickname) (opsiyonel)
|
|
129
|
+
Mahalle seçimi — bölge → şehir → ilçe → mahalle hiyerarşisi (opsiyonel)
|
|
130
|
+
TC Kimlik Doğrulama Formu (opsiyonel, fikir oylama/fikir oluşturma için gereklidir)
|
|
131
|
+
Resmi T.C. Kimlik Doğrulama Modal'ı — displays adı (takma ad) korunarak MERNIS doğrulaması resmi bilgilerle (TCKN, resmi Ad, resmi Soyad, Doğum Yılı) asenkron tamamlanır. Profil `is_identity_verified = true` olur.
|
|
132
|
+
↓
|
|
133
|
+
Kayıt tamamlandı → Dashboard'a yönlendir
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
#### 1.0.2 Giriş Akışı
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
E-posta + şifre girişi (telefon girişi kesinlikle bulunmaz)
|
|
140
|
+
→ Hatalı giriş: 5 denemede 15 dakika kilidi
|
|
141
|
+
→ Başarılı: Dashboard'a yönlendir
|
|
142
|
+
→ "Şifremi unuttum" bağlantısı
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
#### 1.0.3 Şifre Sıfırlama Akışı
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
[Adım 1] E-posta adresini gir
|
|
149
|
+
↓
|
|
150
|
+
[Adım 2] E-posta OTP kodu gönderilir (5 dakika geçerli)
|
|
151
|
+
↓
|
|
152
|
+
[Adım 3] Yeni şifre belirle (validasyon kuralları aynı)
|
|
153
|
+
↓
|
|
154
|
+
Giriş sayfasına yönlendir + "Şifreniz başarıyla güncellendi" bildirimi
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
### 1.1 Ana Sayfa (Home) — Map-First Deneyim
|
|
160
|
+
|
|
161
|
+
**URL:** `/`
|
|
162
|
+
**Erişim:** Herkese açık (anonim + hesaplı)
|
|
163
|
+
**Amaç:** Vatandaşın ilk açtığı sayfa **doğrudan tam teşekküllü Halka Açık Sorun Haritası**'dır. Harita sayfanın ana ve baskın öğesidir. Diğer tüm vatandaş akışları (rapor oluşturma, takip, duyurular, fikirler vb.) bu harita üzerinde **modal / slide-over** olarak açılır.
|
|
164
|
+
|
|
165
|
+
#### Sayfa Yapısı ve Davranış
|
|
166
|
+
|
|
167
|
+
**A. Üst Çubuk (Header)**
|
|
168
|
+
- Sol: KENTİM logosu + aktif belediye adı (otomatik veya manuel seçim)
|
|
169
|
+
- Sağ: Giriş / Kayıt veya Profil dropdown
|
|
170
|
+
- Hızlı aksiyon butonları (header veya floating):
|
|
171
|
+
- **Yeni Rapor Oluştur** → Harita üzerinde konum seçili olarak **modal** açılır
|
|
172
|
+
- **Raporumu Takip Et** → Takip kodu girişi **modal** olarak açılır
|
|
173
|
+
- **Halka Açık İstatistikler** → Harita üzerinde sol alt köşede yüzen, anlık dinamik verileri sunan şeffaf bilgi paneli (Widget)
|
|
174
|
+
- Panik / Acil Butonu (her zaman görünür)
|
|
175
|
+
|
|
176
|
+
**B. Baskın Halka Açık Harita (Ana Alan)**
|
|
177
|
+
- Tam ekran veya çok büyük Leaflet haritası (CartoDB Positron)
|
|
178
|
+
- **Başlangıç Görünümü:** Harita ilk açıldığında **Türkiye geneli** (ülke seviyesi, yaklaşık Zoom 6-8) gösterilir. Bu seviyede büyük bölgesel cluster’lar veya il bazlı özet sayıları görünür.
|
|
179
|
+
- Kullanıcı zoom yaptıkça ve haritayı kaydırdıkça sistem otomatik olarak detay seviyesini artırır:
|
|
180
|
+
- Düşük zoom (Zoom 5-10): Türkiye geneli / İl bazlı özet cluster’lar
|
|
181
|
+
- Orta zoom (Zoom 11-14): İlçe ve mahalle seviyesinde cluster + pin karışımı
|
|
182
|
+
- Yüksek zoom (Zoom 15-17+): Mahalle ve sokak bazlı tekil pinler (fuzzing uygulanmış)
|
|
183
|
+
- Serbest pan + zoom ile dinamik veri yükleme (BBOX + zoom seviyesine göre cluster/pin)
|
|
184
|
+
- Viewport bazlı pin yükleme, `Leaflet.markercluster`, ısı haritası toggle
|
|
185
|
+
- Konum bazlı başlangıç zoom (GPS / profil / belediye) ancak ilk açılış her zaman Türkiye geneli ile başlar
|
|
186
|
+
- Çok belediyeli geçiş: Harita kaydırıldığında diğer belediye sınırına girince banner ile yönlendirme
|
|
187
|
+
- Pin tıklanınca hafif popup → "Detayları Gör" ile **drawer/modal** açılır (fotoğraflar, zaman çizelgesi, +1 desteği)
|
|
188
|
+
|
|
189
|
+
**C. Harita Üzerinden Açılan Modal / Drawer Akışları**
|
|
190
|
+
Tüm diğer vatandaş özellikleri harita üzerinde modal olarak yönetilir:
|
|
191
|
+
|
|
192
|
+
- **Rapor Oluşturma** (`/report/new` artık bağımsız sayfa değil): Haritadan konum seç → "Rapor Oluştur" butonu → Adım adım form **modal** içinde
|
|
193
|
+
- **Rapor Takip**: Takip kodu modalı → Sonuç **drawer/modal** içinde gösterilir
|
|
194
|
+
- **Duyurular**: "Duyurular" butonu → Liste + detay **modal** olarak açılır
|
|
195
|
+
- **Fikir Önerileri**: Liste + oy + yeni fikir **modal** olarak yönetilir
|
|
196
|
+
- **Geri Dönüşüm Haritası**: Katman toggle veya ayrı **modal** ile gösterilir
|
|
197
|
+
- **Profil / Dashboard**: Giriş yapmış vatandaş için profil ve kişisel raporlar **modal** içinde
|
|
198
|
+
|
|
199
|
+
**D. Panik / Acil Durum**
|
|
200
|
+
- Her zaman erişilebilir buton → Konum izni sonrası onay modalı → Acil sinyal doğrudan haritaya yansır (kriz katmanı aktifleşir)
|
|
201
|
+
|
|
202
|
+
**E. Footer**
|
|
203
|
+
- Sadece temel bağlantılar (KVKK, Gizlilik, İletişim). Ana navigasyon harita ve modal'lar üzerinden yapılır.
|
|
204
|
+
|
|
205
|
+
**Not:** Afet modu aktif olduğunda harita otomatik olarak afet katmanlarını (toplanma alanları, tahliye rotaları) gösterir ve panik butonu öne çıkar.
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
### 1.1.1 Halka Açık Sorun Haritası (Artık Ayrı Sayfa Değil)
|
|
210
|
+
|
|
211
|
+
**Not (MVP UX):**
|
|
212
|
+
Vatandaş web’inde **ayrı bir `/map` sayfası yoktur**. Halka açık sorun haritası artık **Ana Sayfa (`/`)** ’ın baskın ve ana öğesidir.
|
|
213
|
+
|
|
214
|
+
Tüm vatandaş etkileşimleri (rapor oluşturma, takip, duyurular, fikirler, geri dönüşüm haritası vb.) bu harita üzerinde **modal / slide-over drawer** olarak açılır.
|
|
215
|
+
|
|
216
|
+
Ayrıntılı harita davranışı (viewport bazlı yükleme, zoom seviyelerine göre granülarite, serbest pan/zoom, çok belediyeli geçiş, pin etkileşimi) yukarıdaki **1.1 Ana Sayfa (Home) — Map-First Deneyim** bölümünde tanımlanmıştır.
|
|
217
|
+
|
|
218
|
+
Eski `/map` rotası kaldırılmış veya `/` adresine yönlendirilmektedir.
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
### 1.1.2 Halka Açık İstatistik Widget'ı (Public Statistics Widget)
|
|
223
|
+
|
|
224
|
+
Ana sayfa (`/`) üzerinde yüzen veya sol alt köşede konumlandırılmış olan bu widget, vatandaşlara ve ziyaretçilere KENTİM platformunun şeffaflık vizyonunu anlık verilerle sunar. `GET /v1/public/statistics` API ucundan beslenen widget aşağıdaki dinamik özet metrikleri içerir:
|
|
225
|
+
|
|
226
|
+
1. **Aktif Çözülen Sorun Sayısı (Resolved Counts):** Platform genelinde (veya seçili belediye sınırlarında) başarıyla çözüme kavuşturulmuş ve `resolved` durumuna getirilmiş toplam sorun sayısı.
|
|
227
|
+
2. **Saha Çalışması Sürenler (In-progress):** Ekipler tarafından onaylanmış, iş emri atanmış ve sahada aktif müdahale aşamasında (`in_progress`, `on_the_way`) olan güncel iş adedi.
|
|
228
|
+
3. **Vatandaş Desteği (+1):** Vatandaşlar tarafından "+1 Beni de Etkiliyor" butonu kullanılarak desteklenen ve topluluk duyarlılığını gösteren toplam destek oyu sayısı.
|
|
229
|
+
4. **Ortalama Çözüm Süresi (Avg SLA / SLA Compliance):** İlgili belediyenin son 30 gün içinde tamamlanan iş emirlerinde hedef SLA sürelerine uyum yüzdesi veya ortalama sorun kapatma süresi (gün/saat bazında).
|
|
230
|
+
|
|
231
|
+
*Görsel ve UX Kuralları:*
|
|
232
|
+
- Widget, koyu modda yarı saydam (glassmorphic) yapıda, `backdrop-filter: blur(8px)` ve sage/forest green tonlarında ince bir çerçeve ile tasarlanmıştır.
|
|
233
|
+
- Her metrik kartı, üzerine gelindiğinde (hover) hafifçe yukarı doğru hareket eden (micro-animation) ve açıklayıcı bir ikon barındıran mikro kartlardan oluşur.
|
|
234
|
+
- Mobil cihazlarda ekran alanını kaplamaması için otomatik olarak katlanabilir (collapsible) mini modül yapısına bürünür.
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
### 1.2 Rapor Oluşturma
|
|
239
|
+
|
|
240
|
+
**Tetiklenme:** Home haritası üzerinde "Yeni Rapor Oluştur" butonu ile açılır
|
|
241
|
+
**Amaç:** Vatandaşın harita üzerinden konum seçerek sorun bildirmesi.
|
|
242
|
+
**Not:** Artık ayrı tam sayfa değildir. Harita üzerinde konum seçildikten sonra **adım adım modal** içinde tamamlanır.
|
|
243
|
+
|
|
244
|
+
#### Adımlı Form Yapısı (3 Adım)
|
|
245
|
+
|
|
246
|
+
**Adım 1 — Konum Seçimi**
|
|
247
|
+
|
|
248
|
+
> **Harita Davranışı:** Rapor oluşturma modal'ı açıldığında, modal içinde modal-özgü (ayrı Leaflet nesnesi) tam genişlikte bir harita görünür. Ana sayfa haritası arka planda donuk kalır. Modal haritası başlangıç olarak kullanıcının GPS konumuna (varsa) veya belediye merkezine odaklanır.
|
|
249
|
+
|
|
250
|
+
| Alan | Tür | Kural |
|
|
251
|
+
| :--- | :--- | :--- |
|
|
252
|
+
| Harita | Leaflet interaktif harita | Tıklama ile pin bırakma; "Konumumu Kullan" butonu ile GPS |
|
|
253
|
+
| İl | Otomatik dolu (haritadan) | Değiştirilebilir dropdown |
|
|
254
|
+
| İlçe | Otomatik dolu (haritadan) | Değiştirilebilir dropdown |
|
|
255
|
+
| Mahalle | Otomatik dolu (haritadan) | Değiştirilebilir dropdown |
|
|
256
|
+
| Sokak / Adres Notu | Metin | Opsiyonel, max 200 karakter |
|
|
257
|
+
|
|
258
|
+
- **Önleyici Mükerrer Kontrolü:** Harita üzerinde konum seçildiği (pin bırakıldığı) anda sunucu 50–100m yarıçapındaki aktif public raporları tarar. Eşleşme bulunursa sarı uyarı pinleri ve bilgi kutusu açılır. Vatandaş "+1 Beni de Etkiliyor" seçeneğini tıklarsa form kapatılır ve teşekkür modalı gösterilir. "Hayır, farklı sorun" derse normal forma devam edilmesine izin verilir.
|
|
259
|
+
|
|
260
|
+
**Adım 2 — Rapor Detayı**
|
|
261
|
+
|
|
262
|
+
| Alan | Tür | Kural |
|
|
263
|
+
| :--- | :--- | :--- |
|
|
264
|
+
| Kategori | Dropdown | Zorunlu; global + belediye kategorileri listelenir |
|
|
265
|
+
| Başlık | Metin | Zorunlu; min 3, max 150 karakter |
|
|
266
|
+
| Açıklama | Textarea | Zorunlu; min 10, max 2000 karakter; karakter sayacı gösterilir |
|
|
267
|
+
| Fotoğraf | Dosya yükleme (çoklu) | Opsiyonel; JPG/PNG/WEBP; max 5 dosya, max 5 MB/dosya; önizleme gösterilir; kategoriye göre zorunlu olabilir (muni_admin tarafından belirlenir) |
|
|
268
|
+
|
|
269
|
+
**Adım 3 — Onay ve Gönderim**
|
|
270
|
+
|
|
271
|
+
| Alan | Tür | Kural |
|
|
272
|
+
| :--- | :--- | :--- |
|
|
273
|
+
| KVKK Açık Rıza metni | Onay kutusu | Zorunlu; metin scrollable modal içinde gösterilir ("Raporunuz anonim olarak halka açık haritada görünebilir ve girdiğiniz opsiyonel iletişim bilgileri asenkron bildirimler amacıyla işlenebilir" uyarısını içerir) |
|
|
274
|
+
| SMS bildirimi (anonim) | Telefon + onay kutusu | Opsiyonel; anonim kullanıcı "SMS ile Çözüm Bildirimi Al" checkbox'ını seçerse telefon giriş alanı aktifleşir ve doğrulanır |
|
|
275
|
+
| E-posta bildirimi (anonim) | E-posta + onay kutusu | Opsiyonel; anonim kullanıcı "E-posta ile Çözüm Bildirimi Al" checkbox'ını seçerse e-posta giriş alanı aktifleşir ve doğrulanır |
|
|
276
|
+
| **Güvenlik Doğrulaması** | CAPTCHA | Anonim raporlarda Google reCAPTCHA v3 (arka plan doğrulaması) |
|
|
277
|
+
|
|
278
|
+
- **Spam Koruması:** IP bazlı hız sınırlaması (2 rapor/dakika) aşıldığında "Çok fazla istek, lütfen bekleyin" uyarısı gösterilir.
|
|
279
|
+
- **Anonim Kullanıcı Bildirim Tercihi:** Anonim kullanıcılar isteğe bağlı olarak SMS veya E-posta kanallarını işaretleyerek iletişim bilgilerini girer. Bu bilgiler KVKK Açık Rıza Onayı kapsamında strictly asenkron bilet bilgilendirmeleri için saklanır.
|
|
280
|
+
- Hesaplı kullanıcı: bildirim tercihleri profilden otomatik alınır, 3. adımda yalnızca onay kutusu gösterilir
|
|
281
|
+
- Gönder butonu → Başarı sayfasına yönlendir
|
|
282
|
+
|
|
283
|
+
**Başarı Durumu**
|
|
284
|
+
- Takip kodu büyük ve belirgin gösterilir: `KENT-[plaka]-XXXXXXXX`
|
|
285
|
+
- "Kodu Cihazıma PDF/Resim Olarak İndir" butonu
|
|
286
|
+
- "Kopyala" butonu
|
|
287
|
+
- "Rapora git" butonu → `/?modal=track&code=:trackingCode` modal/drawer'ını açar
|
|
288
|
+
- "Yeni Rapor Oluştur" butonu → `/?modal=report` modal'ını açar konum seçilmiş olarak
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
### 1.3 Rapor Takip
|
|
293
|
+
|
|
294
|
+
**Tetiklenme:** Home haritası header veya floating aksiyonlardan "Raporumu Takip Et" ile açılır
|
|
295
|
+
**Amaç:** Anonim veya hesaplı kullanıcının raporunun anlık durumunu sorgulaması.
|
|
296
|
+
**Not:** Artık ayrı sayfa değildir. Takip kodu girişi ve sonuçlar **modal / drawer** içinde gösterilir.
|
|
297
|
+
|
|
298
|
+
#### Sayfa İçeriği
|
|
299
|
+
|
|
300
|
+
**Üst Bölüm — Durum Özeti**
|
|
301
|
+
- Takip kodu
|
|
302
|
+
- Mevcut durum: büyük renkli rozet (Beklemede / İncelemede / Yönlendirildi / Devam Ediyor / Çözüldü / Reddedildi / **Yeniden Açıldı** / **Mükerrer Kayıt**)
|
|
303
|
+
- İlgili müdürlük adı (dispatched_to_department'dan itibaren gösterilir)
|
|
304
|
+
- Son güncelleme tarihi ve saati
|
|
305
|
+
|
|
306
|
+
**Mükerrer Kayıt Uyarısı:** Rapor "Mükerrer" olarak kapatıldıysa: "Bu bölgede aynı konuda aktif bir iş emrimiz zaten bulunmaktadır. Takibiniz bu ana iş emri [Kayıt No] üzerinden birleştirilmiştir." mesajı ve ana iş emrine yönlendiren bir buton gösterilir.
|
|
307
|
+
|
|
308
|
+
**Zaman Çizelgesi**
|
|
309
|
+
Durumların geçiş sırası, tarih-saat damgasıyla dikey zaman çizelgesi olarak gösterilir.
|
|
310
|
+
Gösterilen bilgi: durum adı + tarih (personel adı veya müdürlük içi detay gösterilmez — vatandaşa yalnızca hangi aşamada olduğu bilgisi verilir).
|
|
311
|
+
|
|
312
|
+
**Rapor Detayları**
|
|
313
|
+
- Kategori, başlık, açıklama
|
|
314
|
+
- Konum (Statik harita yerine küçük interaktif Leaflet haritası; aynı 100m içindeki diğer aktif public raporları da sarı pinlerle gösterir)
|
|
315
|
+
- Vatandaşın yüklediği fotoğraflar (lightbox ile görüntülenebilir)
|
|
316
|
+
- **"Bu sorunu bende de gördüm"** butonu: Giriş yapmış vatandaşların çözülmemiş rapora "+1 Beni de Etkiliyor" desteği vermesini (veya geri almasını) sağlayan buton entegrasyonu.
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
**Tamamlanma Fotoğrafları**
|
|
320
|
+
`resolved` durumundaysa saha personelinin yüklediği fotoğraflar gösterilir.
|
|
321
|
+
|
|
322
|
+
**Geri Bildirim Bölümü** (yalnızca `resolved` durumunda)
|
|
323
|
+
|
|
324
|
+
- **Yıldız Puanlama:** 1–5 yıldız arası görsel seçim (tıklanınca highlight). Giriş yapmış kullanıcı JWT ile, anonim kullanıcı `x-tracking-code` header'ı ile yetkilendirilir.
|
|
325
|
+
- **Yorum Alanı:** Opsiyonel metin (max 500 karakter); puan seçildikten sonra gösterilir.
|
|
326
|
+
- **[Gönder] butonu:** Yorum + puan gönderi. 1–2 yıldız verilirse arka planda iş otomatik olarak şefin **Kalite Denetim (QA)** kuyruğuna düşer (vatandaşa bilgi verilmez). 3–5 yıldız verilirse iş `resolved` olarak kalır.
|
|
327
|
+
- Puan bir kez gönderildikten sonra değiştirilemez.
|
|
328
|
+
|
|
329
|
+
**"Sorun Devam Ediyor" — Yeniden Açma (Reopen)**
|
|
330
|
+
- Yalnızca `resolved` veya `rejected` durumundaki `citizen_report` kaynaklı işlerde görünür.
|
|
331
|
+
- Maksimum **2 kez** kullanılabilir; limit dolduğunda buton gizlenir ve `"Bu rapor için maksimum yeniden açma sayısına ulaşıldı. Yeni bir sorun bildirmek için Rapor Oluştur'a tıklayın."` mesajı gösterilir.
|
|
332
|
+
- **Kronik/Tarihsel Bağlantı Flag'i:** 2. reopen limitinin dolmasının ardından vatandaş `"Rapor Oluştur"` bağlantısına tıkladığında, sistem otomatik olarak yeni oluşturulacak vatandaş raporuna `parent_reopened_work_order_id` parametresini (eski raporun UUID'sini) geçirir. Bu sayede yeni oluşturulan rapor veritabanında eski rapora bağlanarak bir **kronik sorun zinciri** oluşturur. Admin panelindeki analitik ekranlarında bu durumlar "Kronik Arızalar" başlığı altında gruplanır.
|
|
333
|
+
- **Akış:**
|
|
334
|
+
```
|
|
335
|
+
[Kullanıcı] → "Sorun Devam Ediyor" butonuna tıklar
|
|
336
|
+
↓
|
|
337
|
+
[Neden Yeniden Açıyorsunuz?] — dropdown + serbest metin alanı
|
|
338
|
+
Seçenekler: Sorun tekrar oluştu / Hiç çözülmedi / Eksik çözüm / Diğer
|
|
339
|
+
Açıklama: Zorunlu, max 500 karakter
|
|
340
|
+
↓
|
|
341
|
+
[Onay]
|
|
342
|
+
Giriş yapmış kullanıcı: JWT ile doğrulanır
|
|
343
|
+
Anonim kullanıcı: `x-tracking-code` header'ı ile doğrulanır
|
|
344
|
+
↓
|
|
345
|
+
[Sistem]
|
|
346
|
+
İş durumu `reopened` olarak güncellenir
|
|
347
|
+
Moderatörün "Karar Bekleyenler" kuyruğuna geri döner
|
|
348
|
+
Kullanıcıya başarı mesajı: "Raporunuz yeniden incelemeye alındı."
|
|
349
|
+
Re-open sayacı 1 artırılır
|
|
350
|
+
SLA Sayacı Sıfırlama: Rapor reopened durumuna geçtiğinde, eski SLA geçmişi denetim amacıyla saklanır; moderatör sevk ettiği andan itibaren ilgili kategori için tanımlanmış standart SLA süresinin %50'si kadar yeni bir "Reopen SLA" süresi başlatılır.
|
|
351
|
+
2. Reopen dolduğunda: Buton pasifleştirilir, "Yeni Rapor Oluştur" yönlendirmesine `parent_reopened_work_order_id` UUID parametresi bağlanır.
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
### 1.4 Duyurular
|
|
359
|
+
|
|
360
|
+
**Tetiklenme:** Home haritası üzerinden "Duyurular" aksiyonu ile açılır
|
|
361
|
+
**Amaç:** Belediyenin yayınladığı bilgi, uyarı ve acil duyuruları listelemek.
|
|
362
|
+
**Not:** Artık ayrı tam sayfa değildir. Liste ve detay **modal / drawer** olarak harita üzerinde gösterilir.
|
|
363
|
+
|
|
364
|
+
#### Sayfa İçeriği
|
|
365
|
+
|
|
366
|
+
**Filtreler (sol panel veya üst bant)**
|
|
367
|
+
|
|
368
|
+
| Filtre | Seçenekler |
|
|
369
|
+
| :--- | :--- |
|
|
370
|
+
| Tür | Tümü / Bilgi / Uyarı / Acil |
|
|
371
|
+
| Mahalle | Dropdown — il → ilçe → mahalle |
|
|
372
|
+
| Tarih Aralığı | Başlangıç ve bitiş tarihi |
|
|
373
|
+
|
|
374
|
+
**Liste**
|
|
375
|
+
- Her kart: tür rozeti, başlık, özet (max 200 karakter), tarih, yayımlayan müdürlük
|
|
376
|
+
- Karta tıklanınca `/?modal=announcement&id=:id` detay drawer/modal'ını açar
|
|
377
|
+
|
|
378
|
+
**Detay Modalı / Drawer** — `/?modal=announcement&id=:id`
|
|
379
|
+
- Tam içerik, tarih aralığı, etkilenen mahalleler listesi
|
|
380
|
+
- Varsa ek dosya / bağlantı
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
### 1.5 Fikir Önerileri
|
|
385
|
+
|
|
386
|
+
**Tetiklenme:** Home haritası üzerinden "Fikirler" aksiyonu ile açılır
|
|
387
|
+
**Erişim:** Oy vermek ve öneri oluşturmak için **E-posta Onaylı** hesap gerekir.
|
|
388
|
+
**Amaç:** Vatandaşların şehir iyileştirme önerileri sunması ve oylaması.
|
|
389
|
+
**Not:** Liste, detay, oy ve yeni fikir oluşturma **modal** içinde yönetilir.
|
|
390
|
+
|
|
391
|
+
#### Liste Sayfası
|
|
392
|
+
|
|
393
|
+
**Sıralama**
|
|
394
|
+
|
|
395
|
+
| Seçenek | Açıklama |
|
|
396
|
+
| :--- | :--- |
|
|
397
|
+
| En Çok Oy | Varsayılan |
|
|
398
|
+
| En Yeni | Oluşturulma tarihine göre azalan |
|
|
399
|
+
| Yanıtlananlar | Belediyenin resmi yanıt verdiği fikirler |
|
|
400
|
+
|
|
401
|
+
**Filtreler**
|
|
402
|
+
- Durum: Tümü / Beklemede / Onaylandı / Yanıtlandı / Reddedildi
|
|
403
|
+
- Kategori: Ulaşım, Park, Çevre vb.
|
|
404
|
+
|
|
405
|
+
**Fikir Kartı**
|
|
406
|
+
- Başlık, kısa açıklama, oy sayısı (+1/-1 net), durum rozeti, oluşturulma tarihi
|
|
407
|
+
- +1 / -1 oylama butonları (giriş yapılmamışsa tıklandığında giriş sayfasına yönlendirir)
|
|
408
|
+
|
|
409
|
+
- **Fikir Detay Modalı** — `/?modal=idea&id=:id`
|
|
410
|
+
- Tam açıklama
|
|
411
|
+
- Oy butonları (+1 / -1; kullanıcı başına bir oy; **oy değiştirme:** Kullanıcı +1 oy vermişse "-1" butonuna tıkladığında oyu "-1"e dönüştürülür; aynı butona tekrar tıklarsa oyu tamamen geri çekilir (toggle mantığı). Her değişiklikte buton görseli anlık güncellenir.) **Oy için yalnızca E-posta onaylı hesap gereklidir; TC Kimlik doğrulaması gerekmez.**
|
|
412
|
+
- Belediyenin resmi yanıtı (varsa, zaman damgasıyla)
|
|
413
|
+
- Durum rozeti
|
|
414
|
+
|
|
415
|
+
#### Fikir Oluşturma Modalı — `/?modal=idea-new`
|
|
416
|
+
|
|
417
|
+
**Erişim:** E-posta Onaylı hesaplı kullanıcı; anonim → giriş sayfasına yönlendir. **TC Kimlik doğrulaması (`is_identity_verified = true`) zorunludur** (yalnızca fikir oluşturma için; oy vermek için TC Kimlik gerekmez).
|
|
418
|
+
- **Kimlik Doğrulama UX Akışı (Nick-Name Lockout Koruması):** Fikir oluşturma modalı açıldığında, eğer kullanıcının hesabı kimlik doğrulamalı değilse (`is_identity_verified = false`), fikir giriş alanları (başlık, açıklama, kategori) pasifleştirilmiş/kilitli olarak gösterilir. Formun üzerinde net ve anlaşılır bir HSL Danger Red çerçeveli **"Fikir oluşturabilmek için T.C. Kimlik doğrulaması yapmanız gerekmektedir. [Şimdi Doğrula]"** uyarı şeridi (alert banner) yer alır. Vatandaş "Şimdi Doğrula" butonuna tıkladığında modal kapatılmadan doğrudan T.C. Kimlik Doğrulama modal formu (TCKN, resmi Ad, resmi Soyad, Doğum Yılı alanları) açılır. Doğrulama başarıyla tamamlandığında, profil `is_identity_verified = true` durumuna çekilir, displays adı (takma ad) korunur, uyarı şeridi kalkar ve form alanları aktifleşerek veri girişine izin verilir.
|
|
419
|
+
|
|
420
|
+
| Alan | Tür | Kural |
|
|
421
|
+
| :--- | :--- | :--- |
|
|
422
|
+
| Başlık | Metin | Zorunlu; min 5, max 150 karakter |
|
|
423
|
+
| Açıklama | Textarea | Zorunlu; min 20, max 2000 karakter |
|
|
424
|
+
| Kategori | Dropdown | Zorunlu |
|
|
425
|
+
| İlgili Mahalle | Dropdown — il → ilçe → mahalle | Opsiyonel |
|
|
426
|
+
| TC Kimlik No | Metin | E-posta onaylı hesapta zorunlu; NVI doğrulaması (tek seferlik, otomatik) |
|
|
427
|
+
|
|
428
|
+
- Gönderimden sonra moderasyon onayı beklenir (`muni_admin` onaylar)
|
|
429
|
+
- Kullanıcıya "Öneriniz incelemeye alındı" bildirimi
|
|
430
|
+
|
|
431
|
+
---
|
|
432
|
+
|
|
433
|
+
### 1.6 Geri Dönüşüm Haritası
|
|
434
|
+
|
|
435
|
+
**Tetiklenme:** Home ana haritası üzerinden katman toggle veya "Geri Dönüşüm" aksiyonu ile açılır
|
|
436
|
+
**Erişim:** Herkese açık
|
|
437
|
+
**Amaç:** Cam, kâğıt, pil, tekstil vb. atık türlerine göre en yakın toplama noktalarını haritada göstermek.
|
|
438
|
+
**Not:** Artık ayrı sayfa değildir. Ana harita üzerine katman olarak veya **modal** içinde gösterilir.
|
|
439
|
+
|
|
440
|
+
#### Sayfa İçeriği
|
|
441
|
+
|
|
442
|
+
- Leaflet haritası tam ekran (header hariç)
|
|
443
|
+
- Sol panel: Atık türü filtresi (çoklu seçim: Cam / Kâğıt / Plastik / Pil / Tekstil / Elektronik / Organik)
|
|
444
|
+
- "Konumumu Kullan" butonu: GPS ile merkezi konuma taşır
|
|
445
|
+
- Haritada her nokta için pin; tıklanınca popup: nokta adı, adres, kabul edilen atık türleri, açılış saatleri (varsa)
|
|
446
|
+
- Popup'ta "Navigasyonu Başlat" butonu: Google Maps / Apple Maps / Yandex Maps seçim modal'ı açar; seçilen uygulama koordinatlarla dış uygulamada açılır
|
|
447
|
+
|
|
448
|
+
---
|
|
449
|
+
|
|
450
|
+
### 1.7 Hesaplı Kullanıcı Dashboard'u
|
|
451
|
+
|
|
452
|
+
**Tetiklenme:** Giriş yapmış vatandaş profil menüsünden veya home haritası üzerinden açılır
|
|
453
|
+
**Erişim:** Yalnızca giriş yapmış vatandaşlar (citizen)
|
|
454
|
+
**Amaç:** Kullanıcının tüm raporlarını, oy geçmişini ve bildirim tercihlerini yönetmesi.
|
|
455
|
+
**Not:** Artık ayrı tam sayfa değildir. **Modal / drawer** olarak harita üzerinde açılır.
|
|
456
|
+
|
|
457
|
+
#### Sayfa Sekmeleri
|
|
458
|
+
|
|
459
|
+
**Sekmem: Raporlarım** (`/?modal=dashboard&tab=reports`)
|
|
460
|
+
- Tablo / Kart görünümü (kullanıcı tercihi, LocalStorage'da saklanır)
|
|
461
|
+
- Her satır: takip kodu, başlık, kategori, durum rozeti, oluşturulma tarihi, son güncelleme
|
|
462
|
+
- Filtreler: Durum (Tümü / Aktif / Çözüldü / Reddedildi), Tarih Aralığı
|
|
463
|
+
- "Yeni Rapor Oluştur" butonu
|
|
464
|
+
- Rapor satırına tıklanınca `/?modal=track&code=:trackingCode` modal/drawer'ını açar
|
|
465
|
+
|
|
466
|
+
**Sekmem: Oy Geçmişim** (`/?modal=dashboard&tab=votes`)
|
|
467
|
+
- Oy verilen fikir önerileri listesi (başlık, oy tipi, tarih)
|
|
468
|
+
- Her satıra tıklanınca `/?modal=idea&id=:id` detay modal'ını açar
|
|
469
|
+
|
|
470
|
+
**Sekmem: Desteklediklerim** (`/?modal=dashboard&tab=supported`)
|
|
471
|
+
- Kullanıcının "+1 Beni de Etkiliyor" desteği verdiği public raporların listesi (takip kodu, kategori, başlık, mevcut durum, destek tarihi).
|
|
472
|
+
- Destek oylarına tıklanınca `/?modal=track&code=:trackingCode` modal/drawer'ını açar.
|
|
473
|
+
- Her satırın yanında "Desteği Geri Al" butonu mevcuttur.
|
|
474
|
+
- **Davranış:** `DELETE /public/reports/:public_id/support` çağrılır. İşlem idempotenttir. `resolved` durumuna geçmiş raporlarda destek geri alınamaz. Geri alma işlemi sonrası `support_count` asenkron debounced worker ile güncellenir ve ilgili public cache satırları invalidate edilir.
|
|
475
|
+
|
|
476
|
+
**Sekmem: Bildirim Tercihleri**
|
|
477
|
+
|
|
478
|
+
| Tercih | Seçenek |
|
|
479
|
+
| :--- | :--- |
|
|
480
|
+
| E-posta Bildirimleri | Açık / Kapalı |
|
|
481
|
+
| SMS Bildirimleri | Açık / Kapalı |
|
|
482
|
+
| Mobil Push Bildirimleri | Açık / Kapalı |
|
|
483
|
+
| Hangi durum değişikliklerinde bildirim | Tümü / Yalnızca Çözüldü / Yalnızca Yönlendirildi (dispatched) / Yalnızca Re-open |
|
|
484
|
+
|
|
485
|
+
---
|
|
486
|
+
|
|
487
|
+
### 1.8 Profil ve Hesap Ayarları
|
|
488
|
+
|
|
489
|
+
**Tetiklenme:** Giriş yapmış vatandaşın profil avatarından açılır
|
|
490
|
+
**Erişim:** Yalnızca giriş yapmış vatandaşlar
|
|
491
|
+
**Amaç:** Kişisel bilgilerin düzenlenmesi, şifre değiştirme, hesap silme.
|
|
492
|
+
**Not:** Artık ayrı sayfa değildir. **Modal** içinde yönetilir.
|
|
493
|
+
|
|
494
|
+
#### Sayfa Bölümleri
|
|
495
|
+
|
|
496
|
+
> **Modal Sekme Yapısı:** Profil modal'ı (`/?modal=profile`) iki sekme içerir: **"Bilgilerim"** (kişisel bilgiler + şifre) ve **"Güvenlik"** (cihazdan çıkış + hesap sil). Sekmeler modal üstünde tab bar ile yapılandırılır.
|
|
497
|
+
|
|
498
|
+
**Kişisel Bilgiler**
|
|
499
|
+
|
|
500
|
+
| Alan | Tür | Kural |
|
|
501
|
+
| :--- | :--- | :--- |
|
|
502
|
+
| Ad | Metin | Opsiyonel, max 100 karakter |
|
|
503
|
+
| Soyad | Metin | Opsiyonel, max 100 karakter |
|
|
504
|
+
| E-posta | Metin | Değiştirilebilir; yeni e-postaya OTP doğrulaması yapılır |
|
|
505
|
+
| Telefon | Metin | Değiştirilebilir; yeni telefona OTP doğrulaması yapılır |
|
|
506
|
+
| Mahalle | Dropdown | Opsiyonel |
|
|
507
|
+
|
|
508
|
+
**Şifre Değiştirme**
|
|
509
|
+
- Mevcut şifre + yeni şifre + yeni şifre tekrar
|
|
510
|
+
|
|
511
|
+
**Tüm Cihazlardan Çıkış**
|
|
512
|
+
- Tıklanınca onay modal'ı açılır; tüm refresh token'lar geçersiz kılınır
|
|
513
|
+
|
|
514
|
+
**Hesabımı Sil (KVKK)**
|
|
515
|
+
- Kırmızı, dikkat çekici buton
|
|
516
|
+
- Tıklanınca onay modal'ı açılır: "Hesabınız silinecek. Raporlarınız anonim olarak sistemde saklanmaya devam edecektir. Ayrıca, verdiğiniz tüm +1 destek oyları silinecek ve ilgili işlerin support_count alanları güncellenecektir. Bu işlem geri alınamaz. (Vatandaş hesabı Central SaaS DB düzeyinde silinir; belediye şemalarındaki ilişkisel veriler asenkron olarak maskelenir. `audit_logs` tablosundaki old_value/new_value alanlarındaki kişisel veriler, indeksli `citizen_id` filtresiyle full table scan yapmadan asenkron regex job'ı ile temizlenir.)"
|
|
517
|
+
- Onay için kullanıcıdan mevcut şifresi veya OTP istenir
|
|
518
|
+
- Silme işlemi başlatılır; kullanıcı oturumu kapatılır ve ana sayfaya yönlendirilir
|
|
519
|
+
|
|
520
|
+
### 1.9 Panik / Acil Durum Bildirimi
|
|
521
|
+
|
|
522
|
+
**URL:** Ayrı sayfa yoktur; Ana Sayfa'daki (/) butonla tetiklenir
|
|
523
|
+
**Hizmet Taahhüdü ve Sorumluluk Reddi:** Bu buton bir "Hayati Tehlike Müdahale Hattı" (112) değildir. Belediye koordinasyonu ve afet toplanma süreçleri için tasarlanmıştır. Belediye, sinyalin 7/24 canlı bir operatör tarafından izlendiğini taahhüt etmez; müdahale süresi o anki belediye kaynaklarına ve afet durumuna bağlıdır.
|
|
524
|
+
|
|
525
|
+
**Akış:**
|
|
526
|
+
|
|
527
|
+
```
|
|
528
|
+
[Kullanıcı] → "Acil Durum Bildir" butonuna tıklar
|
|
529
|
+
↓
|
|
530
|
+
[Yasal Uyarı Modal'ı]
|
|
531
|
+
"DİKKAT: Bu hat 112 Acil Çağrı Merkezi'nin alternatifi değildir.
|
|
532
|
+
Hayati tehlike durumunda ÖNCE 112'Yİ ARAYIN.
|
|
533
|
+
Bu buton yalnızca belediye koordinasyon ekiplerine konum bildirir."
|
|
534
|
+
[İptal] [Anladım, Devam Et]
|
|
535
|
+
↓
|
|
536
|
+
[Konum İzni]
|
|
537
|
+
Tarayıcı konum izni istenir
|
|
538
|
+
İzin verilmezse: Manuel adres girişi formu açılır (il/ilçe/mahalle/adres notu)
|
|
539
|
+
↓
|
|
540
|
+
[Onay Modal'ı]
|
|
541
|
+
Konum haritada gösterilir
|
|
542
|
+
"Bu konumu paylaş" butonu
|
|
543
|
+
↓
|
|
544
|
+
[Sistem] → Sinyal asenkron olarak PostgreSQL unlogged panik kuyruğuna yazılır (Moderatör kuyruğu bypass edilir)
|
|
545
|
+
Kuyruk worker'ları gelen sinyalleri debounced bulk update ile DB'ye yansıtır
|
|
546
|
+
Kullanıcıya anında 202 HTTP koduyla takip kodu verilir
|
|
547
|
+
↓
|
|
548
|
+
[Kriz Masası Aktivasyonu]
|
|
549
|
+
Sinyal kuyruktan tüketilerek anlık olarak "Kriz Masası Canlı Haritası"na yansıtılır.
|
|
550
|
+
Haritada "Resmi Toplanma Alanları" katmanı otomatik aktifleşir.
|
|
551
|
+
Kullanıcıya en yakın 3 toplanma alanı yeşil ikonlarla gösterilir.
|
|
552
|
+
En yakın noktaya yönelik tahliye rotası çizilir.
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
---
|
|
556
|
+
|
|
557
|
+
### 1.10 Statik ve Bilgilendirici İçerikler (Modal Üzerinden)
|
|
558
|
+
|
|
559
|
+
Yeni Map-First + Modal mimarisine uygun olarak, yasal ve bilgilendirici içerikler (Hakkımızda, SSS, Gizlilik, KVKK, Kullanım Koşulları, İletişim) ayrı tam sayfa olarak değil, ana sayfadaki public harita üzerinden **modal / slide-over** şeklinde açılır.
|
|
560
|
+
|
|
561
|
+
**Public Web Yol Haritası Gösterimi (Geliştirme Rehberi Seviyesi)**
|
|
562
|
+
|
|
563
|
+
**Tetiklenme:**
|
|
564
|
+
- Footer’da “Sistem Yol Haritası” linki
|
|
565
|
+
- URL: `/?modal=roadmap`
|
|
566
|
+
|
|
567
|
+
**Modal Davranış Kuralları:**
|
|
568
|
+
|
|
569
|
+
- Modal açıldığında sistem önce `public_web_roadmap_mvp` ve `public_web_roadmap_v1` içeriklerini çeker.
|
|
570
|
+
- Sadece `is_active = true` olan sürümler sekmelerde görünür.
|
|
571
|
+
- Eğer her iki sürüm de aktifse → default olarak **MVP** sekmesi seçili gelir.
|
|
572
|
+
- Eğer sadece biri aktifse → o sürüm doğrudan açılır (sekme görünmez).
|
|
573
|
+
- Eğer hiçbir sürüm aktif değilse → “Yol haritası şu anda yayınlanmamıştır” mesajı gösterilir.
|
|
574
|
+
|
|
575
|
+
**Modal İçeriği (Bileşen Yapısı):**
|
|
576
|
+
- Başlık: “KENTİM Yol Haritası”
|
|
577
|
+
- Sekmeler: MVP Sürümü / V1 Sürümü (sadece aktif olanlar)
|
|
578
|
+
- İçerik: Markdown → HTML olarak render edilir (XSS korumalı)
|
|
579
|
+
- Alt bilgi: “Son güncelleme: [tarih]”
|
|
580
|
+
- Kapat butonu (Esc tuşu ile de kapanır)
|
|
581
|
+
|
|
582
|
+
**Edge Cases:**
|
|
583
|
+
- İçerik çok uzunsa → modal içinde scroll aktif olur.
|
|
584
|
+
- Markdown içinde link varsa → yeni sekmede açılır.
|
|
585
|
+
- Mobil cihazda → modal tam ekran bottom sheet olarak açılır (snap point %95).
|
|
586
|
+
|
|
587
|
+
**Responsive Kurallar:**
|
|
588
|
+
- Desktop: Normal modal (max-width 720px)
|
|
589
|
+
- Tablet/Mobil: Bottom sheet, %95 yüksekliğe kadar açılır
|
|
590
|
+
- İçerik 800px’den uzunsa scroll bar görünür
|
|
591
|
+
|
|
592
|
+
**Performans:**
|
|
593
|
+
- İçerik ilk açılışta cache’lenir (30 dakika).
|
|
594
|
+
- Her 30 dakikada bir arka planda güncellenir.
|
|
595
|
+
|
|
596
|
+
#### URL Yapısı (Modal Stratejisi)
|
|
597
|
+
- `/?modal=about` → Hakkımızda modal'ı açılır
|
|
598
|
+
- `/?modal=faq` → SSS modal'ı açılır
|
|
599
|
+
- `/?modal=privacy` → Gizlilik Politikası modal'ı açılır
|
|
600
|
+
- `/?modal=kvkk` → KVKK Aydınlatma Metni modal'ı açılır
|
|
601
|
+
- `/?modal=terms` → Kullanım Koşulları modal'ı açılır
|
|
602
|
+
- `/?modal=contact` → İletişim / Destek modal'ı açılır
|
|
603
|
+
|
|
604
|
+
**Not:** Bu modalların başlık ve içerikleri, merkezi olarak yönetilen `GET /public/static-contents/:key` API endpoint'inden dinamik olarak çekilir.
|
|
605
|
+
|
|
606
|
+
#### 1.10.1 Hakkımızda
|
|
607
|
+
|
|
608
|
+
**Tetiklenme:** Footer veya header menüsünden "Hakkımızda" linkine tıklanır.
|
|
609
|
+
**URL:** `/?modal=about`
|
|
610
|
+
**Erişim:** Herkese açık
|
|
611
|
+
**Amaç:** Platformun amacı, vizyonu ve çalışma şeklini tanıtmak.
|
|
612
|
+
|
|
613
|
+
**Modal İçeriği (Önerilen):**
|
|
614
|
+
- KENTİM nedir?
|
|
615
|
+
- Hangi sorunları çözüyor?
|
|
616
|
+
- Vizyon ve değerler
|
|
617
|
+
- Hangi belediyelerde hizmet veriyor?
|
|
618
|
+
|
|
619
|
+
**Not:** Ayrı sayfa yerine modal olarak tasarlanır. SEO için ana sayfa indexlenir.
|
|
620
|
+
|
|
621
|
+
#### 1.10.2 SSS (Sıkça Sorulan Sorular)
|
|
622
|
+
|
|
623
|
+
**Tetiklenme:** Footer'dan "SSS" veya "Yardım" linkine tıklanır.
|
|
624
|
+
**URL:** `/?modal=faq`
|
|
625
|
+
**Erişim:** Herkese açık
|
|
626
|
+
**Amaç:** Vatandaşların en sık sorduğu soruları cevaplamak.
|
|
627
|
+
|
|
628
|
+
**Modal İçeriği:**
|
|
629
|
+
- Kategorili soru-cevap listesi (Raporlama, Harita, Gizlilik, Teknik vb.)
|
|
630
|
+
- Arama kutusu (opsiyonel)
|
|
631
|
+
|
|
632
|
+
**Not:** Modal içinde accordion veya sekme ile gösterilir.
|
|
633
|
+
|
|
634
|
+
#### 1.10.3 Gizlilik Politikası
|
|
635
|
+
|
|
636
|
+
**Tetiklenme:** Footer'dan "Gizlilik Politikası" linkine tıklanır.
|
|
637
|
+
**URL:** `/?modal=privacy`
|
|
638
|
+
**Erişim:** Herkese açık
|
|
639
|
+
**Amaç:** Kişisel verilerin nasıl işlendiğini açıklamak.
|
|
640
|
+
|
|
641
|
+
**Not:** Uzun metin modal içinde scrollable olarak gösterilir.
|
|
642
|
+
|
|
643
|
+
#### 1.10.4 KVKK Aydınlatma Metni
|
|
644
|
+
|
|
645
|
+
**Tetiklenme:** Footer'dan "KVKK" linkine tıklanır.
|
|
646
|
+
**URL:** `/?modal=kvkk`
|
|
647
|
+
**Erişim:** Herkese açık
|
|
648
|
+
**Amaç:** Kişisel verilerin işlenmesine ilişkin aydınlatma yükümlülüğünü yerine getirmek.
|
|
649
|
+
|
|
650
|
+
**Not:** Rapor oluşturma sırasında da kısa versiyonu modal içinde gösterilebilir.
|
|
651
|
+
|
|
652
|
+
#### 1.10.5 Kullanım Koşulları
|
|
653
|
+
|
|
654
|
+
**Tetiklenme:** Footer'dan "Kullanım Koşulları" linkine tıklanır.
|
|
655
|
+
**URL:** `/?modal=terms`
|
|
656
|
+
**Erişim:** Herkese açık
|
|
657
|
+
**Amaç:** Platformun kullanım şartlarını tanımlamak.
|
|
658
|
+
|
|
659
|
+
#### 1.10.6 İletişim / Destek
|
|
660
|
+
|
|
661
|
+
**Tetiklenme:** Footer'dan "İletişim" veya "Destek" linkine tıklanır.
|
|
662
|
+
**URL:** `/?modal=contact`
|
|
663
|
+
**Erişim:** Herkese açık
|
|
664
|
+
**Amaç:** Vatandaşların soru, öneri veya şikayetlerini iletmesini sağlamak.
|
|
665
|
+
|
|
666
|
+
**Modal İçeriği:**
|
|
667
|
+
- İletişim formu (isim, e-posta, konu, mesaj)
|
|
668
|
+
- Belediye iletişim bilgileri (opsiyonel)
|
|
669
|
+
|
|
670
|
+
**Not:** Bu modal diğerlerine göre daha etkileşimli olabilir.
|
|
671
|
+
|
|
672
|
+
---
|
|
673
|
+
|
|
674
|
+
**Genel Kurallar (Bu İçerikler İçin):**
|
|
675
|
+
- Tüm içerikler **modal** içinde açılır. Ayrı tam sayfa kullanılmaz.
|
|
676
|
+
- Footer üzerinden kolay erişim sağlanır.
|
|
677
|
+
- Mobil cihazlarda alt taraftan yukarı doğru kayan drawer olarak açılabilir.
|
|
678
|
+
- İçerikler belediye bazında özelleştirilebilir.
|
|
679
|
+
- SEO açısından ana sayfa (`/`) indexlenir; modal içerikler indexlenmez.
|
|
680
|
+
|
|
681
|
+
## BÖLÜM 2: Belediye Paneli — `panel.kentim.com.tr`
|
|
682
|
+
|
|
683
|
+
### 2.0 Kimlik Doğrulama
|
|
684
|
+
|
|
685
|
+
**URL:** `/login`
|
|
686
|
+
|
|
687
|
+
```
|
|
688
|
+
E-posta + şifre girişi
|
|
689
|
+
→ 1. Giriş Bilgileri Doğrulama: Hatalı girişlerde 5 denemede 15 dakika kilidi ve hata mesajı gösterilir.
|
|
690
|
+
→ 2. Merkezi SaaS Onay Kontrolü (SaaS Lockout Pipeline):
|
|
691
|
+
- Belediye "active" (aktif/onaylı) ise: Token alınarak rol bazlı yönlendirme yapılır:
|
|
692
|
+
- muni_moderator → /moderator/queue
|
|
693
|
+
- muni_department_manager → /manager/work-orders
|
|
694
|
+
- muni_team_chief → /chief/work-orders
|
|
695
|
+
- muni_worker → /worker/tasks
|
|
696
|
+
- muni_admin → /admin/dashboard
|
|
697
|
+
- Belediye "active" değilse (Askıda/Onay Bekliyor/Pasif): Giriş engellenir ve ekranda HSL Orman Yeşili/Kırmızı tonlarında "Hata: Belediyeniz henüz merkez (Central SaaS) tarafından onaylanmamıştır veya aboneliği askıdadır. Lütfen merkez yönetici ile irtibata geçiniz." uyarısı yansıtılır.
|
|
698
|
+
```
|
|
699
|
+
|
|
700
|
+
Giriş sayfasında "Şifremi Unuttum" bağlantısı: e-posta gir → OTP → yeni şifre akışı (vatandaş ile aynı mekanizma).
|
|
701
|
+
|
|
702
|
+
#### 2.0.2 Yetkisiz Erişim
|
|
703
|
+
|
|
704
|
+
Bir kullanıcı kendi rolüne ait olmayan URL'e gitmeye çalışırsa → `403` sayfasına yönlendirilir.
|
|
705
|
+
|
|
706
|
+
---
|
|
707
|
+
|
|
708
|
+
### 2.1 Moderatör Paneli
|
|
709
|
+
|
|
710
|
+
#### 2.1.1 Bekleyen Raporlar Kuyruğu
|
|
711
|
+
|
|
712
|
+
**URL:** `/moderator/queue`
|
|
713
|
+
**Erişim:** `muni_moderator`, `muni_admin`
|
|
714
|
+
**Amaç:** `pending`, `moderation`, `reopened` ve re-dispatch geri dönen (`dispatched_to_department` → moderatör) durumlarındaki raporları listeleyip incelemek.
|
|
715
|
+
|
|
716
|
+
> **Not:** Müdür veya admin tarafından re-dispatch edilen işler, ping-pong korumasına kadar moderasyona döner ve bu kuyrukta **"Karar Bekleyen (moderation)"** olarak görünür; ancak işin kökeni re-dispatch olduğundan liste satırında `RE-DISPATCH` rozeti gösterilir.
|
|
717
|
+
|
|
718
|
+
**Filtreler**
|
|
719
|
+
|
|
720
|
+
| Filtre | Seçenekler |
|
|
721
|
+
| :--- | :--- |
|
|
722
|
+
| Durum | Tümü / Yeni (pending) / Yeniden Açılan (reopened) / Karar Bekleyen (moderation) / **Re-dispatch Dönüşü** |
|
|
723
|
+
| Kategori | Tüm kategoriler; dropdown |
|
|
724
|
+
| İlçe / Mahalle | Dropdown |
|
|
725
|
+
| Öncelik | Tümü / Düşük / Normal / Yüksek / Acil / **Kriz** |
|
|
726
|
+
| Kaynak | Tümü / Vatandaş Raporu / Re-dispatch Dönüşü |
|
|
727
|
+
| Destekçi Sayısı | Tümü / En Çok Desteklenen (sıralı listeleme) |
|
|
728
|
+
| Tarih | Bugün / Bu Hafta / Bu Ay / Özel Aralık |
|
|
729
|
+
| Arama | Takip kodu veya başlık ile metin araması |
|
|
730
|
+
|
|
731
|
+
**Liste Sütunları**
|
|
732
|
+
- Takip kodu · Başlık · Kategori · Mahalle · Oluşturulma tarihi · Durum rozeti · Atanan müdürlük (re-dispatch durumunda gösterilir) · **Destekçi Sayısı (+X)** · **Re-dispatch sayacı** (re-dispatch gönderme varsa)
|
|
733
|
+
- Satır tıklanınca `/moderator/reports/:id` sayfasına gider
|
|
734
|
+
|
|
735
|
+
**Toplu İşlem**
|
|
736
|
+
- Birden fazla rapor seçilerek toplu müdürlük atama yapılabilir (tüm seçili raporlar aynı müdürlüğe yönlendirilir)
|
|
737
|
+
- Toplu işlem yalnızca `pending` durumdaki raporlara uygulanabilir
|
|
738
|
+
|
|
739
|
+
#### 2.1.2 Rapor Detay
|
|
740
|
+
|
|
741
|
+
**URL:** `/moderator/reports/:id`
|
|
742
|
+
**Erişim:** `muni_moderator`, `muni_admin`
|
|
743
|
+
**Amaç:** Tekil raporun tüm detaylarıyla incelenip yönlendirilmesi.
|
|
744
|
+
|
|
745
|
+
**Sayfa Düzeni (iki sütun)**
|
|
746
|
+
|
|
747
|
+
Sol sütun — Rapor Bilgisi:
|
|
748
|
+
- Takip kodu, kategori, başlık, açıklama
|
|
749
|
+
- Vatandaşın yüklediği fotoğraflar (lightbox ile büyütülebilir; her fotoğraf için bağımsız "Public Haritada Göster/Gizle" toggle kontrolü bulunur)
|
|
750
|
+
- Leaflet haritası — rapor pinlenmiş konumu gösterir
|
|
751
|
+
Sağ sütun — Moderasyon Paneli:
|
|
752
|
+
- **Mükerrer Kayıt Kontrolü:** Sistem, aynı koordinat ve kategorideki aktif işleri otomatik listeler.
|
|
753
|
+
- [Mükerrer Olarak İşaretle] butonu → Ana İş Emri seçim modal'ı açılır. Seçildiğinde rapor "Mükerrer" olarak kapanır ve ana iş emrine bağlanır.
|
|
754
|
+
- **Halka Açık Harita Görünürlük Kontrolü:** "Public Haritada Göster" toggle (`is_public_visible` boolean). Gizleme durumunda gerekçe dropdown'u (KVKK, uygunsuz içerik vb.) zorunludur. Görünürlük değişiklikleri denetim loguna kaydedilir.
|
|
755
|
+
**Not:** `public_map_cache` invalidation mekanizması entegre edilmiştir. Görünürlük değiştiğinde ilgili önbellek otomatik olarak temizlenir.
|
|
756
|
+
- Sistem tarafından önerilen birincil müdürlük (kategori eşleşmesine göre); değiştirilebilir dropdown
|
|
757
|
+
...
|
|
758
|
+
|
|
759
|
+
- Çok müdürlüklü durumlarda ikincil bildirim müdürlüklerini seçme (çoklu checkbox)
|
|
760
|
+
- Öncelik seçimi: Normal / Yüksek / Acil / **Kriz** (SLA çarpanı: **Yüksek = x0.5**, **Acil = x0.25**, **Kriz = x0.1 (7/24 kesintisiz)**). **Kritik SLA Kuralı:** `Acil` veya `Kriz` durumlarındaki iş emirlerinde müdürlüğün mesai takvimi (Business Hours) bypass edilir; SLA sayacı hafta sonu ve resmi tatil ayrımı olmaksızın **7/24 kesintisiz** çalıştırılır.
|
|
761
|
+
- Dahili Not alanı (max 500 karakter; vatandaşa gösterilmez)
|
|
762
|
+
- [Müdürlüğe Yönlendir] butonu → durum `dispatched_to_department` olur; moderatöre başarı toast'ı
|
|
763
|
+
- [Reddet] butonu → gerekçe modalı açılır (gerekçe zorunlu; max 500 karakter)
|
|
764
|
+
|
|
765
|
+
**Öncelik Değiştirme Yetki Sınırı:**
|
|
766
|
+
- Moderatör, rapor inceleme aşamasında (**moderation**) öncelik atayabilir.
|
|
767
|
+
- İş **dispatched_to_department** veya sonraki aşamalara geçtikten sonra öncelik yalnızca **müdür (`muni_department_manager`)** veya **admin (`muni_admin`)** tarafından değiştirilebilir. Moderatörün öncelik değiştirme yetkisi bu aşamada sona erer.
|
|
768
|
+
- Değişiklikler denetim loguna `STATUS_CHANGED` olarak kaydedilir.
|
|
769
|
+
|
|
770
|
+
**Re-dispatch (yeniden yönlendirme)**
|
|
771
|
+
Raporun mevcut durumu `dispatched_to_department` veya üzerindeyse:
|
|
772
|
+
- Moderatör: yalnızca `dispatched_to_department` aşamasında re-dispatch yapabilir
|
|
773
|
+
- Müdür ve muni_admin: herhangi bir aşamada re-dispatch yapabilir
|
|
774
|
+
- Re-dispatch butonu → müdürlük seçim modal'ı → onay → `REPORT_REDISPATCHED` olayı denetim loguna kaydedilir
|
|
775
|
+
|
|
776
|
+
**Manuel İş Emri Oluştur** (moderatör için) — **Sınırlı Yetki**
|
|
777
|
+
- Sağ üst köşede buton: "Manuel İş Emri Oluştur" → `/moderator/work-orders/new` formuna yönlendirir
|
|
778
|
+
- **Kısıtlar:** Sadece "vatandaş raporu olarak açılamayan" durumlar için kullanılabilir. Formda zorunlu "Gerekçe" alanı vardır (min 20 karakter). İş oluşturulduğunda kaynak tipi otomatik `manual_internal` olur ve `MANUAL_WORK_ORDER_BY_MODERATOR` audit event'i yazılır. Moderatör, kendi oluşturduğu işi moderasyon kuyruğuna alamaz; doğrudan ilgili müdürlüğe sevk edilir.
|
|
779
|
+
|
|
780
|
+
---
|
|
781
|
+
|
|
782
|
+
### 2.2 Müdür Paneli (muni_department_manager)
|
|
783
|
+
|
|
784
|
+
#### 2.2.1 İş Emirleri Listesi
|
|
785
|
+
|
|
786
|
+
**URL:** `/manager/work-orders`
|
|
787
|
+
**Erişim:** `muni_department_manager`, `muni_admin`
|
|
788
|
+
**Amaç:** Müdürlüğe havale edilen tüm kaynak tiplerindeki iş emirlerini yönetmek.
|
|
789
|
+
|
|
790
|
+
**Sekmeler**
|
|
791
|
+
- **Birincil İş Emirleri** (işlem yapılabilir): Varsayılan sekme
|
|
792
|
+
- **İkincil Bildirimler** (yalnızca bilgi amaçlı): Başka müdürlük tarafından yönetilir; atama yapılamaz; okundu / okunmadı durumu gösterilir
|
|
793
|
+
|
|
794
|
+
**Filtreler (Birincil sekme için)**
|
|
795
|
+
|
|
796
|
+
| Filtre | Seçenekler |
|
|
797
|
+
| :--- | :--- |
|
|
798
|
+
| Durum | Tümü / Atama Bekliyor / Devam Ediyor / Şef Onayı Bekliyor / Müdür İncelemesi / Çözüldü / Reddedildi |
|
|
799
|
+
| Havuz | Tümü / Atanmamış Havuzu (Sadece müdürlük veya ekibe atanmış, personel bekleyenler) |
|
|
800
|
+
| Kaynak Tipi | Tümü / Vatandaş Raporu / Dahili / Entegrasyon / Periyodik |
|
|
801
|
+
| Öncelik | Tümü / Düşük / Normal / Yüksek / Acil / **Kriz** |
|
|
802
|
+
| SLA Durumu | Tümü / SLA Aşıldı / SLA Kritik (son 24 saat) / Normal |
|
|
803
|
+
| Ekip / Şef | Dropdown |
|
|
804
|
+
| Tarih Aralığı | Bugün / Bu Hafta / Bu Ay / Özel |
|
|
805
|
+
| Arama | İş emri numarası veya başlık ile metin araması |
|
|
806
|
+
|
|
807
|
+
**Liste Sütunları**
|
|
808
|
+
- No · Başlık · Kaynak (ikon) · Kategori · Durum · Öncelik · Atanan Şef · SLA Durumu (renk kodlu) · Tarih
|
|
809
|
+
|
|
810
|
+
**İşlemler**
|
|
811
|
+
- Satır tıklanınca `/manager/work-orders/:id` detay sayfasına gider
|
|
812
|
+
- Satır üzerinde hızlı işlem ikonu: Şefe Ata
|
|
813
|
+
|
|
814
|
+
#### 2.2.2 İş Emri Detay
|
|
815
|
+
|
|
816
|
+
**URL:** `/manager/work-orders/:id`
|
|
817
|
+
**Erişim:** `muni_department_manager`, `muni_admin`
|
|
818
|
+
**Amaç:** Tekil iş emrini atamak, izlemek ve gerektiğinde re-dispatch yapmak.
|
|
819
|
+
|
|
820
|
+
**Sayfa Düzeni (iki sütun)**
|
|
821
|
+
|
|
822
|
+
Sol sütun — İş Emri Bilgisi:
|
|
823
|
+
- No, kaynak tipi rozeti, kategori, başlık, açıklama
|
|
824
|
+
- Konum (harita)
|
|
825
|
+
- Vatandaşın fotoğrafları
|
|
826
|
+
- Moderatörün dahili notu (varsa)
|
|
827
|
+
|
|
828
|
+
Sağ sütun — Yönetim Paneli:
|
|
829
|
+
- Mevcut durum rozeti
|
|
830
|
+
- SLA bilgisi: kalan süre veya aşım miktarı (kırmızı / sarı / yeşil)
|
|
831
|
+
- **Şefe Ata** dropdown: kendi müdürlüğündeki şeflerin listesi → [Ata] butonu (durum `assigned_to_team`)
|
|
832
|
+
- **Doğrudan Personele Ata** dropdown: şefi atlayarak müdürlük altındaki personeller → [Ata] butonu (durum `assigned_to_worker`); atanan şef bilgi bildirimi alır. **Kritik Kural:** Müdür doğrudan atama yaptığında, iş tamamlandığında onay bekleyen kişi olarak şef yerine doğrudan **Müdür** belirlenir.
|
|
833
|
+
- **Üst Yetkiyle Onayla (Force Approve):** Müdürler, şeflerin onay bekleyen tüm işlerini (`pending_chief_approval`) doğrudan onaylama (`resolved`) yetkisine sahiptir; şefin sahada veya izinli olduğu durumlarda kilitlenmeyi önler.
|
|
834
|
+
- **Müdür İnceleme Aksiyonları:** İş emri `pending_manager_review` durumundaysa, detay sayfasında şu butonlar belirir:
|
|
835
|
+
- [Zorla Çözüldü Yap] (`force_resolve`)
|
|
836
|
+
- [Personel Değiştir] (`reassign_worker`) → Personel seçim dropdown'ı açılır. **Dropdown, işin şu an atanmış olduğu şefin ekibindeki aktif personelleri listeler** (ret sayacı sıfırlanır; iş şefin atanmamış havuzuna düşer ve şef yeni atamayı yapar).
|
|
837
|
+
- [İşi İptal Et] (`reject`)
|
|
838
|
+
- [Manuel Onayla] (`manual_approval`) → `pending_manager_review` durumundaki işin mevcut fotoğraflarını yeterli kabul ederek şef onay aşamasını bypass eder ve iş emrini doğrudan `resolved` durumuna çeker.
|
|
839
|
+
- **Re-dispatch (Yeniden Yönlendirme)** butonu: Gerekçe modal'ı açılır → onay → İş emri **Moderatörün Karar Bekleyenler (`moderation`)** kuyruğuna geri gönderilir. (Ping-pong koruması: müdür/admin seviyesinde 3. re-dispatch gerçekleştiğinde (sayıç `> 2`) iş otomatik olarak `muni_admin`'in Anlaşmazlık Çözüm kuyruğuna taşınır).
|
|
840
|
+
- Dahili Not Ekle (max 500 karakter; yalnızca belediye personeli görebilir)
|
|
841
|
+
- Manuel iş emri oluştur butonu
|
|
842
|
+
|
|
843
|
+
**Durum Geçmişi Sekmesi**
|
|
844
|
+
- Tüm durum değişikliklerinin kronolojik listesi: tarih-saat, kim değiştirdi, eski durum → yeni durum
|
|
845
|
+
|
|
846
|
+
**Denetim Logu Sekmesi**
|
|
847
|
+
- Re-dispatch, atama değişikliği, not ekleme gibi kritik olayların listesi
|
|
848
|
+
|
|
849
|
+
**Fotoğraflar Sekmesi**
|
|
850
|
+
- Saha personelinin yüklediği tamamlama fotoğrafları (lightbox); GPS konum ve zaman damgası etiketi
|
|
851
|
+
|
|
852
|
+
#### 2.2.3 Manuel İş Emri Oluşturma
|
|
853
|
+
|
|
854
|
+
**URL:** `/manager/work-orders/new`
|
|
855
|
+
**Erişim:** `muni_department_manager`, `muni_admin`
|
|
856
|
+
|
|
857
|
+
| Alan | Tür | Kural |
|
|
858
|
+
| :--- | :--- | :--- |
|
|
859
|
+
| Başlık | Metin | Zorunlu, max 150 karakter |
|
|
860
|
+
| Açıklama | Textarea | Zorunlu, max 2000 karakter |
|
|
861
|
+
| Kategori | Dropdown | Zorunlu |
|
|
862
|
+
| Öncelik | Radio | Zorunlu; Normal (varsayılan) / Yüksek / Acil / **Kriz** |
|
|
863
|
+
| Konum | Harita + adres alanları | Zorunlu |
|
|
864
|
+
| Şef / Personel Ata | Dropdown | Opsiyonel; atanırsa `assigned_to_team`, atanmazsa `dispatched_to_department` |
|
|
865
|
+
|
|
866
|
+
- Kaydet → `dispatched_to_department` durumunda açılır; kaynak `manual_internal` olarak işaretlenir; moderatör onayına gitmez
|
|
867
|
+
|
|
868
|
+
---
|
|
869
|
+
|
|
870
|
+
### 2.3 Ekip Şefi Paneli (muni_team_chief)
|
|
871
|
+
|
|
872
|
+
#### 2.3.1 İş Emirleri Listesi
|
|
873
|
+
|
|
874
|
+
**URL:** `/chief/work-orders`
|
|
875
|
+
**Erişim:** `muni_team_chief`
|
|
876
|
+
**Amaç:** Şefin ekibine atanan tüm iş emirlerini görmek ve personele dağıtmak.
|
|
877
|
+
|
|
878
|
+
**Sekmeler**
|
|
879
|
+
- **Aktif İşler:** Personele atanmış veya atanmayı bekleyen işler.
|
|
880
|
+
- **Onay Bekleyenler:** Personelin tamamladığı (`pending_chief_approval`) işler.
|
|
881
|
+
- **Kalite Denetim (QA):** Vatandaşın 1-2 yıldız verdiği, şefin tekrar incelemesi gereken çözülmüş işler.
|
|
882
|
+
|
|
883
|
+
**Filtreler**
|
|
884
|
+
|
|
885
|
+
| Filtre | Seçenekler |
|
|
886
|
+
| :--- | :--- |
|
|
887
|
+
| Durum | Tümü / Atanmamış (Bekliyor) / Devam Ediyor / Şef Onayı Bekliyor / Kalite Denetim (QA) / Çözüldü |
|
|
888
|
+
| Personel | Dropdown — kendi ekibi |
|
|
889
|
+
| Öncelik | Tümü / Normal / Yüksek / Acil / **Kriz** |
|
|
890
|
+
| Tarih | Bugün / Bu Hafta / Özel |
|
|
891
|
+
|
|
892
|
+
**Atanmamış Havuzu:** Şefe atanmış ancak henüz bir personele yönlendirilmemiş (`assigned_to_team`) veya personel tarafından yarıda bırakılmış tüm işler bu listede "Atanmamış" durumuyla en üstte listelenir.
|
|
893
|
+
|
|
894
|
+
**Hızlı İşlem**
|
|
895
|
+
- Satır üzerinde: Personele Ata ikonu; dropdown açılır
|
|
896
|
+
|
|
897
|
+
#### 2.3.2 İş Emri Detay ve Fotoğraf Onayı
|
|
898
|
+
|
|
899
|
+
**URL:** `/chief/work-orders/:id`
|
|
900
|
+
**Erişim:** `muni_team_chief`
|
|
901
|
+
**Amaç:** İş emrini incelemek, personele atamak ve tamamlama fotoğraflarını onaylamak.
|
|
902
|
+
|
|
903
|
+
**Yönetim Paneli:**
|
|
904
|
+
- **Personele Ata** dropdown → [Ata] butonu (durum `assigned_to_worker` olur).
|
|
905
|
+
- **Geofence Bypass Talepleri:** Personelden gelen geofence bypass talebi (EXIF konum ve gerekçe) detayda gösterilir. Şef [Geofence Bypass Onayla] butonuna basarak koordinatı personelin fiili EXIF konumuyla güncelleyebilir ve geofence'i bypass edebilir.
|
|
906
|
+
|
|
907
|
+
**Fotoğraf Onay Bölümü** (durum `pending_chief_approval` ise aktif)
|
|
908
|
+
- Tüm fotoğraflar ızgara görünümünde listelenir; her fotoğrafın altında:
|
|
909
|
+
- GPS koordinatı (harita linki ile)
|
|
910
|
+
- Çekim tarihi ve saati
|
|
911
|
+
- [Onayla] butonu → durum `resolved`; vatandaş raporu ise bildirim gönderilir
|
|
912
|
+
- [Reddet] butonu → gerekçe alanı (zorunlu, max 500 karakter) → durum `in_progress`; personele bildirim gönderilir
|
|
913
|
+
|
|
914
|
+
**Kalite Denetim (QA) Bölümü** (Vatandaş düşük puan verdiyse aktif)
|
|
915
|
+
- Vatandaşın verdiği puan ve yorumu en üstte kırmızı bir uyarı kutusuyla gösterilir.
|
|
916
|
+
- [Çözümü Kesinleştir] butonu → Şef işin çözüldüğüne ikna olursa; kayıt QA kuyruğundan kalkar.
|
|
917
|
+
- [Yetersiz - İşe Döndür] butonu → Gerekçe alanı (zorunlu) → İş emri tekrar `in_progress` olur ve ilgili personele bildirim gider.
|
|
918
|
+
|
|
919
|
+
**Devre Kesici:** 3. kez üst üste ret verilirse, sistem işi otomatik olarak `pending_manager_review` durumuna çeker ve müdüre "Sürekli Fotoğraf Reddi - İnceleme Gerekiyor" bildirimi gönderir. Şefin ekranında "Eskalasyona Gönderildi" uyarısı çıkar. Müdür bu aşamada; zorla kapatma (`force_resolve`), yeniden atama (`reassign_worker`), manuel onay (`manual_approval`) veya iptal (`reject`) aksiyonlarından birini alarak döngüyü kırar.
|
|
920
|
+
|
|
921
|
+
**Dahili Not Ekleme**
|
|
922
|
+
- Metin alanı (max 500 karakter; yalnızca belediye personeli görebilir, vatandaşa gösterilmez)
|
|
923
|
+
- [Not Ekle] butonu
|
|
924
|
+
- Eklenen notlar kronolojik olarak listelenir (tüm dahili notlar)
|
|
925
|
+
- Kendi eklediği notu ilk 15 dakika içinde düzenleyebilir veya silebilir (genel kural)
|
|
926
|
+
- Not ekleme işlemi denetim loguna kaydedilir
|
|
927
|
+
|
|
928
|
+
#### 2.3.3 Günlük İş Planı
|
|
929
|
+
|
|
930
|
+
**URL:** `/chief/daily-plan`
|
|
931
|
+
**Erişim:** `muni_team_chief`
|
|
932
|
+
**Amaç:** Ekipteki her personelin günlük iş listesini planlamak ve optimize etmek.
|
|
933
|
+
|
|
934
|
+
**Sayfa Düzeni**
|
|
935
|
+
|
|
936
|
+
- Tarih seçici (varsayılan: bugün; 7 güne kadar ileri planlama)
|
|
937
|
+
- Her personel için sütun: personel adı, o güne atanan iş emirleri listesi (sürükle-bırak ile sıralama ve atama yeniden düzenleme)
|
|
938
|
+
- Harita görünümü sekmesi: tüm açık iş emirlerini haritada pinler olarak gösterir; personele atamak için pin üzerine sağ tıkla → personel seçimi
|
|
939
|
+
- [Personele Ata] butonu: listedeki atanmamış iş emirleri için personel seçme dropdown'u
|
|
940
|
+
- Rota Optimizasyonu Hesapla butonu: seçili personelin iş emirlerini OSRM algoritmasıyla en kısa rota sırasına dizer; sıralama güncelleme onayı istenir
|
|
941
|
+
|
|
942
|
+
#### 2.3.4 Ekip Performansı
|
|
943
|
+
|
|
944
|
+
**URL:** `/chief/team-stats`
|
|
945
|
+
**Erişim:** `muni_team_chief`
|
|
946
|
+
|
|
947
|
+
- Günlük / Haftalık / Aylık sekmeleri
|
|
948
|
+
- Her personel için: tamamlanan iş sayısı, ortalama tamamlanma süresi (saat), reddedilen fotoğraf sayısı
|
|
949
|
+
- Grafik: son 7/30 günün tamamlanma trendi
|
|
950
|
+
|
|
951
|
+
#### 2.3.5 Manuel İş Emri Oluşturma
|
|
952
|
+
|
|
953
|
+
**URL:** `/chief/work-orders/new`
|
|
954
|
+
**Erişim:** `muni_team_chief`
|
|
955
|
+
|
|
956
|
+
- Müdür formuna özdeş; ek olarak: oluşturma anında kendi ekibinden personel atayabilir.
|
|
957
|
+
- Personel atanırsa `assigned_to_worker`; atanmazsa müdürlüğün havuzuna `dispatched_to_department` olarak düşer.
|
|
958
|
+
- **Şef Kendi İşinde Onay Kuralı:** Şef, kendi oluşturduğu işe doğrudan personel atadığında (şef bypass yok — şef zaten işin sahibidir) ve personel işi tamamlayıp fotoğraf yüklediğinde onay yetkisi **şefin kendisine** düşer (`pending_chief_approval`). Müdür bypass kuralı (onayın müdüre düşmesi) yalnızca müdürün şefi atlayıp doğrudan atama yaptığı durum içindir.
|
|
959
|
+
|
|
960
|
+
#### 2.3.6 Çevrimdışı Senkronizasyon Uyuşmazlık Havuzu
|
|
961
|
+
|
|
962
|
+
**URL:** `/chief/disputes`
|
|
963
|
+
**Erişim:** `muni_team_chief`
|
|
964
|
+
**Amaç:** Çevrimdışı çalışan saha personelinin internete bağlandığında gönderdiği çakışan veya sürüm uyuşmazlığı olan görev güncelleme taleplerini (`dispute_logs`) incelemek, hak edişlerini (performans puanlarını) yönetmek ve onay/ret kararı vermek.
|
|
965
|
+
|
|
966
|
+
**Sayfa Düzeni ve Görsel Elemanlar:**
|
|
967
|
+
- **Uyuşmazlık Özeti Kartı:** Çakışan iş emrinin detayları, çevrimdışı personelin adı, yerel tamamlama saati (`local_completed_at`), conflict türü (`AUTO_HANDOVER`, `REASSIGNED`, `DOUBLE_COMPLETE`) ve çevrimdışı çekilen kanıt fotoğrafları listelenir.
|
|
968
|
+
- **Çift Hak Ediş Uyarısı (Double Payout Alert) Şeridi:**
|
|
969
|
+
- **Tetiklenme Koşulu:** İş emri canlı sistemde başka bir personel tarafından zaten çözülmüş (`resolved`) ve puanı yazılmışsa, sayfa üstünde belirir.
|
|
970
|
+
- **Görsel Tasarım:** HSL Danger Red (`#a44a3f`) arka planlı, kontrastı yüksek beyaz yazılı, sol tarafında yanıp sönen bir ünlem ikonu (`⚠️`) bulunan dikkat çekici bir üst uyarı şeridi.
|
|
971
|
+
- **Uyarı Metni:** `"DİKKAT: Bu iş emri daha önce canlı sistemde başka bir personel tarafından başarıyla tamamlanmış ve hak ediş puanı yazılmıştır. Bu uyuşmazlığı onaylamanız durumunda mükerrer (çift) hak ediş/ödeme tetiklenecektir!"`
|
|
972
|
+
- **İşlem Butonları:**
|
|
973
|
+
- **[Emeği Onayla] (Forest Green - `#2C5F2D`):** Çevrimdışı emeğin hak edişini onaylar.
|
|
974
|
+
- *UX Akışı / Modal:* Eğer Çift Hak Ediş Uyarısı aktifse, butona basıldığında şefe onay öncesi bir teyit modalı gösterilir: `"Çift Hak Ediş Uyarısına rağmen bu emeği onaylamak istediğinizden emin misiniz? Onayınız 'approved_override' olarak denetim geçmişine kaydedilecek ve personelin hanesine performans puanı asenkron olarak yazılacaktır."` Şef onay verirse durum `approved_override` olarak güncellenir. Çift hak ediş yoksa durum doğrudan `approved` olur.
|
|
975
|
+
- **[Emeği Reddet] (Danger Red - `#a44a3f`):** Çevrimdışı emeği gerekçe göstererek reddeder. Şefin zorunlu ret notu (`notes`) girmesi istenir. Durum `rejected` olur.
|
|
976
|
+
|
|
977
|
+
---
|
|
978
|
+
|
|
979
|
+
### 2.4 Saha Personeli Görünümü (muni_worker)
|
|
980
|
+
|
|
981
|
+
> **Not:** Personel ağırlıklı olarak mobil uygulamayı kullanır. Belediye panelinin web sürümünde de aynı sayfalar mevcuttur; tasarım mobil öncelikli (responsive) olarak yapılır.
|
|
982
|
+
|
|
983
|
+
#### 2.4.1 Görev Listesi
|
|
984
|
+
|
|
985
|
+
**URL:** `/worker/tasks`
|
|
986
|
+
**Erişim:** `muni_worker`
|
|
987
|
+
**Amaç:** Personele atanmış iş emirlerini görüntülemek ve yönetmek.
|
|
988
|
+
|
|
989
|
+
**Sıralama (varsayılan):** Öncelik (azalan) → Konum (en yakın)
|
|
990
|
+
|
|
991
|
+
**Filtreler**
|
|
992
|
+
|
|
993
|
+
| Filtre | Seçenekler |
|
|
994
|
+
| :--- | :--- |
|
|
995
|
+
| Durum | Tümü / Bekliyor / Devam Ediyor / Şef Onayı Bekliyor |
|
|
996
|
+
| Tarih | Bugün / Bu Hafta |
|
|
997
|
+
|
|
998
|
+
**Liste Kartı**
|
|
999
|
+
- Başlık, adres, öncelik rozeti, durum rozeti, beklenen tamamlanma saati (günlük plandan geliyorsa)
|
|
1000
|
+
- [İşi Üstlen] butonu: durum `in_progress` olur; onay toast'ı gösterilir
|
|
1001
|
+
|
|
1002
|
+
#### 2.4.2 Görev Detay ve Tamamlama
|
|
1003
|
+
|
|
1004
|
+
**URL:** `/worker/tasks/:id`
|
|
1005
|
+
**Erişim:** `muni_worker`
|
|
1006
|
+
|
|
1007
|
+
**Sayfa İçeriği**
|
|
1008
|
+
- Başlık, açıklama, adres, konum haritası
|
|
1009
|
+
- Moderatörün notu (varsa)
|
|
1010
|
+
- İşi haritada göster → Navigasyon başlat (dış uygulama seçim modal'ı)
|
|
1011
|
+
- Not Ekle alanı (max 500 karakter)
|
|
1012
|
+
|
|
1013
|
+
**İşi Tamamla Akışı**
|
|
1014
|
+
```
|
|
1015
|
+
[Personel] → "İşi Tamamla" butonuna tıklar
|
|
1016
|
+
↓
|
|
1017
|
+
[Geofence Kontrolü]
|
|
1018
|
+
Sistem personelin GPS konumunu iş emri koordinatı ile karşılaştırır.
|
|
1019
|
+
Mesafe > 50 metre ise: "Konumunuz iş emri noktasından uzakta. Tamamlama için noktaya yaklaşmanız gerekmektedir." uyarısı gösterilir. Personelin bu engeli aşması için "Konum Düzeltme / Geofence Bypass Talebi" butonu aktifleşir. Personel gerçek sahadan EXIF konumlu fotoğrafı ve gerekçeyi sisteme yükleyerek şefe gönderir. Şef onaylayana kadar form kilitli kalır.
|
|
1020
|
+
↓
|
|
1021
|
+
|
|
1022
|
+
**[Fotoğraf Yükleme Ekranı]**
|
|
1023
|
+
|
|
1024
|
+
| Alan | Kural |
|
|
1025
|
+
| :--- | :--- |
|
|
1026
|
+
| Fotoğraf ekleme | Min 1, max 5 fotoğraf; JPG / PNG / WEBP; max 5 MB / dosya |
|
|
1027
|
+
| GPS damgası | Sunucu EXIF'ten GPS koordinatını okur; koordinat yoksa yükleme reddedilir (`422`) |
|
|
1028
|
+
| Çekim zamanı | EXIF `DateTimeOriginal` alanı zorunludur; cihaz saatiyle ±15 dakika tolerans |
|
|
1029
|
+
| Önizleme | Yüklenen fotoğraflar küçük önizleme kareli grid olarak gösterilir; üzerine çarpı ikonu ile silinebilir |
|
|
1030
|
+
| Fotoğraf notu | Her fotoğraf için opsiyonel kısa açıklama (max 200 karakter) |
|
|
1031
|
+
| Yükleme ilerleme çubuğu | Her dosya için ayrı ilerleme çubuğu; başarı → yeşil tik, hata → kırmızı uyarı |
|
|
1032
|
+
|
|
1033
|
+
- Geofence başarılı ve en az 1 fotoğraf yüklenmiş ise **[İşi Tamamla]** butonu aktifleşir.
|
|
1034
|
+
- [İşi Tamamla] tıklanınca onay modal'ı: "Bu işi tamamlandı olarak işaretlemek istediğinizden emin misiniz?" → [Evet, Tamamla] / [Hayır, Geri Dön]
|
|
1035
|
+
- Onaylanınca:
|
|
1036
|
+
- Durum `pending_chief_approval` olarak güncellenir
|
|
1037
|
+
- Şefe push bildirimi gönderilir: "Onayınızı bekleyen iş tamamlandı."
|
|
1038
|
+
- Personelin ekranında işin durumu "Şef Onayı Bekliyor" olarak görünür; yeni işlem butonu kalmaz (salt görüntüleme)
|
|
1039
|
+
- Çevrimdışı durumlarda fotoğraflar yerel kuyruğa alınır; internet gelince otomatik gönderilir (idempotency key ile)
|
|
1040
|
+
|
|
1041
|
+
**Yarıda Bırakma**
|
|
1042
|
+
- "Yarıda Bırak" butonu: not alanı (zorunlu, max 500 karakter) → onay.
|
|
1043
|
+
- **Otomatik Re-assign:** İş otomatik olarak personelin üzerinden alınır, durum `assigned_to_team` (personel atanmamış) olarak güncellenir ve şefin atanmamış havuzuna geri düşer (Müdür bypass atamasında iş assigned_to_team yerine dispatched_to_department'a döner, müdür havuzuna gider). Şefe "Görev Yarıda Bırakıldı: [Gerekçe]" bildirimi gider.
|
|
1044
|
+
|
|
1045
|
+
**Vardiyayı Kapat ve Görev Devri (Handover)**
|
|
1046
|
+
- [Vardiyayı Kapat] butonu (Profil veya Görev Listesi ekranında):
|
|
1047
|
+
- Sistem, personelin üzerinde `in_progress` durumda iş olup olmadığını kontrol eder.
|
|
1048
|
+
- Eğer varsa: "Üzerinizde devam eden X adet iş bulunmaktadır (Fotoğrafları yüklenip onay bekleyen `pending_chief_approval` işler bu listeden hariç tutulur ve üzerinizde kalmaya devam eder). Vardiyayı kapatırsanız sadece `in_progress` durumundaki aktif işler şef havuzuna devredilecektir. Devir notu eklemek ister misiniz?" modalı açılır.
|
|
1049
|
+
- Onaylandığında: Tüm aktif (`in_progress`) işler personelden düşer, şef havuzuna `assigned_to_team` olarak döner ve personelin konumuyla birlikte "Handover" logu oluşturulur (Şef onayı bekleyen işler personelden geri alınmaz).
|
|
1050
|
+
- **Otomatik Vardiya Kapatma (Auto-Handover):** Arka plan cron servisi, personelin GPS hareketliliğini ve son işlem zamanını izler. 8 saat boyunca GPS sinyali gönderilmeyen veya 12 saattir açık olan aktif vardiyaları otomatik kapatır; üzerindeki `in_progress` işleri şef havuzuna devrederek Handover logu oluşturur.
|
|
1051
|
+
|
|
1052
|
+
---
|
|
1053
|
+
|
|
1054
|
+
### 2.5 Admin Paneli (muni_admin)
|
|
1055
|
+
|
|
1056
|
+
#### 2.5.1 Admin Dashboard
|
|
1057
|
+
|
|
1058
|
+
**URL:** `/admin/dashboard`
|
|
1059
|
+
**Erişim:** `muni_admin`
|
|
1060
|
+
**Amaç:** Belediyenin genel durumunu tek sayfadan izlemek.
|
|
1061
|
+
|
|
1062
|
+
**Widget'lar (özet kartlar)**
|
|
1063
|
+
- Bekleyen raporlar / Devam eden işler / Bu ay çözülen işler
|
|
1064
|
+
- SLA aşılan aktif iş emirleri (kırmızı uyarı)
|
|
1065
|
+
- Halka Açık Harita Metrikleri (Toplam public görünür rapor adedi, son 24 saatteki +1 oyları, PostgreSQL cache hit/miss oranı)
|
|
1066
|
+
- En Çok Destek Alan 10 Rapor Listesi (Tıklanınca ilgili iş detayına giden interaktif trend listesi)
|
|
1067
|
+
- Müdürlük bazında aktif iş dağılımı (yatay bar grafik)
|
|
1068
|
+
- Kaynak tipine göre iş emri dağılımı (pasta grafik): Vatandaş / Dahili / Entegrasyon / Periyodik
|
|
1069
|
+
- Son 30 günün günlük iş emri tamamlanma grafiği
|
|
1070
|
+
- Sistem uyarıları: Başarısız periyodik işler, entegrasyon hataları
|
|
1071
|
+
|
|
1072
|
+
Tüm widget kartları tıklanabilir; ilgili detay sayfasına yönlendirir.
|
|
1073
|
+
|
|
1074
|
+
#### 2.5.2 Müdürlük Yönetimi
|
|
1075
|
+
|
|
1076
|
+
**URL:** `/admin/departments`
|
|
1077
|
+
**Erişim:** `muni_admin`
|
|
1078
|
+
|
|
1079
|
+
**Liste**
|
|
1080
|
+
- Tüm müdürlükler: ad, müdür sayısı, ekip sayısı, personel sayısı, durum (Aktif / Pasif)
|
|
1081
|
+
- [+ Müdürlük Ekle] butonu
|
|
1082
|
+
|
|
1083
|
+
**Oluşturma / Düzenleme Formu**
|
|
1084
|
+
|
|
1085
|
+
| Alan | Tür | Kural |
|
|
1086
|
+
| :--- | :--- | :--- |
|
|
1087
|
+
| Müdürlük Adı | Metin | Zorunlu, max 150 karakter |
|
|
1088
|
+
| Kısa Kod | Metin | Zorunlu, max 10 karakter, benzersiz, büyük harf |
|
|
1089
|
+
| Açıklama | Textarea | Opsiyonel, max 500 karakter |
|
|
1090
|
+
| Durum | Toggle | Aktif / Pasif |
|
|
1091
|
+
|
|
1092
|
+
**Silme:** Aktif iş emri olan müdürlük silinemez; yalnızca Pasif yapılabilir.
|
|
1093
|
+
|
|
1094
|
+
#### 2.5.3 Ekip ve Personel Yönetimi
|
|
1095
|
+
|
|
1096
|
+
**URL:** `/admin/teams`
|
|
1097
|
+
**Erişim:** `muni_admin`
|
|
1098
|
+
|
|
1099
|
+
**Hiyerarşik Yapı:** Müdürlük seçimi → Ekipler → Ekip altındaki personel
|
|
1100
|
+
|
|
1101
|
+
**Ekip Oluşturma / Düzenleme**
|
|
1102
|
+
|
|
1103
|
+
| Alan | Tür | Kural |
|
|
1104
|
+
| :--- | :--- | :--- |
|
|
1105
|
+
| Ekip Adı | Metin | Zorunlu, max 100 karakter |
|
|
1106
|
+
| Bağlı Müdürlük | Dropdown | Zorunlu |
|
|
1107
|
+
| Ekip Şefi | Kullanıcı arama | Zorunlu; sistemdeki `muni_team_chief` rolündeki kullanıcılar listelenir |
|
|
1108
|
+
|
|
1109
|
+
**Personel Ekleme**
|
|
1110
|
+
- Mevcut kullanıcı ara ve ekle, VEYA
|
|
1111
|
+
- Yeni kullanıcı davet et: e-posta gönderilir; kullanıcı ilk girişte şifre oluşturur
|
|
1112
|
+
- Her personel için rol ata: `muni_worker` / `muni_team_chief` / `muni_department_manager`
|
|
1113
|
+
|
|
1114
|
+
**Ekip Silme ve Pasif Etme Kuralları:**
|
|
1115
|
+
- **Silme:** Ekip üzerinde aktif (açık) bir iş emri veya ekibe bağlı aktif personel bulunuyorsa fiziksel olarak silinemez.
|
|
1116
|
+
- **Pasif Etme (`is_active = false`):** Ekip pasife alınabilir. Pasife alındığında bu ekibe yeni iş emri havale edilemez (routing yapılamaz). Ekibe bağlı açık işler, müdür veya admin tarafından manuel olarak başka bir ekibe yeniden yönlendirilmeli (re-dispatch), ekipteki personeller ise geçici olarak "Boşta/Unassigned" havuzuna çekilmelidir.
|
|
1117
|
+
|
|
1118
|
+
**Personel Silme ve Pasif Etme Kuralları:**
|
|
1119
|
+
- **Silme:** Veritabanındaki ilişkisel bütünlüğü ve geçmiş iş emirlerindeki log kayıtlarını korumak amacıyla personel hesapları fiziksel olarak silinemez.
|
|
1120
|
+
- **Pasif Etme (`is_active = false`):** Personel hesabı pasife alınabilir. Pasife alındığı anda `ROLE_CHANGE_CLEANUP` sistemi devreye girer: üzerindeki `in_progress` ve `assigned_to_worker` durumundaki tüm işler otomatik olarak `assigned_to_team` durumuna çekilir (yani şefin **atanmamış havuzuna** düşer — belirli bir şefe değil). Şefe anlık bildirim gönderilir. `pending_chief_approval` durumundaki işler ise bu devirden muaftır; atanan personel alanı pasifleşmiş olarak işaretlenir ve şefin onay kuyruğunda kalmaya devam eder. İşlem denetim loguna `ROLE_CHANGE_CLEANUP` olarak kaydedilir.
|
|
1121
|
+
|
|
1122
|
+
|
|
1123
|
+
#### 2.5.4 Kategori ve SLA Yönetimi
|
|
1124
|
+
|
|
1125
|
+
**URL:** `/admin/categories`
|
|
1126
|
+
**Erişim:** `muni_admin`
|
|
1127
|
+
|
|
1128
|
+
**İki Sekme**
|
|
1129
|
+
- **Global Kategoriler:** Sadece görüntülenebilir; düzenlenemez veya silinemez; SLA süresi belediyeye özel ayarlanabilir
|
|
1130
|
+
- **Belediye Kategorileri:** Ekleme / düzenleme / silme (aktif iş emri yoksa)
|
|
1131
|
+
|
|
1132
|
+
**Kategori Formu**
|
|
1133
|
+
|
|
1134
|
+
| Alan | Tür | Kural |
|
|
1135
|
+
| :--- | :--- | :--- |
|
|
1136
|
+
| Kategori Adı | Metin | Zorunlu, max 100 karakter |
|
|
1137
|
+
| Üst Kategori | Dropdown | Opsiyonel (alt kategori için) |
|
|
1138
|
+
| Varsayılan Müdürlük | Dropdown | Zorunlu |
|
|
1139
|
+
| SLA Süresi | Sayı + Birim (saat / iş günü) | Zorunlu (Öncelik `Acil` veya `Kriz` ise bu süreler mesai saatlerinden bağımsız olarak 7/24 kesintisiz sayılır) |
|
|
1140
|
+
| Fotoğraf Zorunlu mu? | Radio | Zorunlu / Opsiyonel / Yok |
|
|
1141
|
+
| Public haritada görünür mü? | Toggle | Zorunlu (Varsayılan: Aktif) |
|
|
1142
|
+
| Risk Skoru | Sayı 1–10 | Opsiyonel; öncelik hesaplamasında kullanılır |
|
|
1143
|
+
| Durum | Toggle | Aktif / Pasif |
|
|
1144
|
+
|
|
1145
|
+
#### 2.5.5 Akıllı Yönlendirme Kuralları
|
|
1146
|
+
|
|
1147
|
+
**URL:** `/admin/routing-rules`
|
|
1148
|
+
**Erişim:** `muni_admin`
|
|
1149
|
+
|
|
1150
|
+
- Kategori başına bir satır tablo görünümü
|
|
1151
|
+
- Her satırda: Kategori adı · Birincil Müdürlük (dropdown) · İkincil Bildirim Müdürlükleri (çoklu checkbox)
|
|
1152
|
+
- Değişiklik kaydedildiğinde denetim loguna yazılır
|
|
1153
|
+
- Toplu güncelleme: CSV yükleme ile (kategori kodu + müdürlük kodu eşleşmesi)
|
|
1154
|
+
|
|
1155
|
+
#### 2.5.6 Periyodik İş Takvimi
|
|
1156
|
+
|
|
1157
|
+
**URL:** `/admin/schedule`
|
|
1158
|
+
**Erişim:** `muni_admin` (tüm müdürlüklerin şablonlarını görebilir ve düzenleyebilir), `muni_department_manager` (yalnızca **kendi müdürlüğüne** ait şablonları görüntüleyebilir, oluşturabilir ve düzenleyebilir; diğer müdürlüklerin şablonlarını göremez)
|
|
1159
|
+
|
|
1160
|
+
**Görünümler**
|
|
1161
|
+
- Liste görünümü (varsayılan): tüm şablonlar tablo olarak
|
|
1162
|
+
- Takvim görünümü: aylık/haftalık takvimde planlanan iş emirleri
|
|
1163
|
+
|
|
1164
|
+
**Şablon Formu**
|
|
1165
|
+
|
|
1166
|
+
| Alan | Tür | Kural |
|
|
1167
|
+
| :--- | :--- | :--- |
|
|
1168
|
+
| Şablon Adı | Metin | Zorunlu, max 150 karakter |
|
|
1169
|
+
| Açıklama | Textarea | Opsiyonel, max 1000 karakter |
|
|
1170
|
+
| Kategori | Dropdown | Zorunlu |
|
|
1171
|
+
| Sorumlu Müdürlük | Dropdown | Zorunlu |
|
|
1172
|
+
| **Öncelik** | Radio | Zorunlu; Normal (varsayılan) / Yüksek / Acil / Kriz. **Not:** `Acil` veya `Kriz` seçilirse SLA sayacı 7/24 kesintisiz çalıştırılır. |
|
|
1173
|
+
| Varsayılan Ekip / Şef | Dropdown | Opsiyonel; atanmazsa müdürlük havuzuna düşer |
|
|
1174
|
+
| Tekrar Sıklığı | Radio | Günlük / Haftalık / Aylık / Özel (cron ifadesi) |
|
|
1175
|
+
| Günlük ise saat | Saat seçici | Zorunlu (günlük tekrarda) |
|
|
1176
|
+
| Haftalık ise günler | Çoklu checkbox | Zorunlu (haftalık tekrarda) |
|
|
1177
|
+
| Aylık ise gün | Sayı 1–28 | Zorunlu (aylık tekrarda) |
|
|
1178
|
+
| Başlangıç Tarihi | Tarih | Zorunlu |
|
|
1179
|
+
| Bitiş Tarihi | Tarih | Opsiyonel; boşsa süresiz |
|
|
1180
|
+
| Durum | Toggle | Aktif / Pasif |
|
|
1181
|
+
|
|
1182
|
+
- **Çakışma Kuralı (Concurrency Rule):** Aynı şablondan üretilmiş ve henüz kapatılmamış (`resolved`/`rejected` olmayan) aktif bir iş emri varsa, sistem yeni bir iş emri üretmez (Skip/Atla) ve bu durumu uyarı loglarına yazar.
|
|
1183
|
+
|
|
1184
|
+
**Şablon Silme ve Durum Yönetimi:**
|
|
1185
|
+
- **Silme:** Periyodik iş şablonları fiziksel olarak silinemez.
|
|
1186
|
+
- **Durum:** Yalnızca [Pasif] konuma getirilebilir (`is_active = false`). Pasif yapılan şablonların gelecekteki cron tetiklemeleri durdurulur; geçmişte bu şablondan üretilmiş olan iş emirlerinin geçmişi ve bütünlüğü korunur.
|
|
1187
|
+
|
|
1188
|
+
#### 2.5.7 Entegrasyon Yönetimi
|
|
1189
|
+
|
|
1190
|
+
**URL:** `/admin/integrations`
|
|
1191
|
+
**Erişim:** `muni_admin`
|
|
1192
|
+
|
|
1193
|
+
**Liste**
|
|
1194
|
+
- Entegrasyon kaynakları: kaynak adı, hedef müdürlük, durum, son başarılı istek, son hata
|
|
1195
|
+
|
|
1196
|
+
**Yeni Entegrasyon Formu**
|
|
1197
|
+
|
|
1198
|
+
| Alan | Tür | Kural |
|
|
1199
|
+
| :--- | :--- | :--- |
|
|
1200
|
+
| Kaynak Adı | Metin | Zorunlu, max 100 karakter |
|
|
1201
|
+
| Hedef Müdürlük | Dropdown | Zorunlu |
|
|
1202
|
+
| Entegrasyon Türü | Radio | `generic_webhook` (Standart Webhook) / `custom_iot_sensor` (Özel Donanım/Sensör Entegrasyonu) |
|
|
1203
|
+
| Alan Eşleştirme (Mapping) | JSON / GUI Mapper | Entegrasyon Türü `custom_iot_sensor` ise zorunlu. Cihaz kimliği, doluluk oranı, arıza durumu ve koordinat alanlarının gelen JSON gövdesindeki karşılıklarını belirler (Örn: `fill_level_percentage` = `telemetry.level`) |
|
|
1204
|
+
| Özel Parser Betiği (Sandbox JS) | Kod Editörü (JS) | Opsiyonel. Gelişmiş veri dönüştürme ve kalibre etme işlemleri için JavaScript kodu girişi (Örn: `function parse(payload) { return { fill_level_percentage: payload.raw_val / 10 }; }`) |
|
|
1205
|
+
| **Halka Açık Görünürlük Varsayılanı (`default_public`)** | **Checkbox (Toggle)** | **Zorunlu.** Bu entegrasyondan tetiklenen iş emirlerinin varsayılan olarak public haritada görünüp görünmeyeceğini belirler. Aktif ise yeni iş emirleri `is_public_visible = true` ile oluşturulur; pasif ise `false` ile oluşturulur ve moderatör onayı olmadan gösterilemez. Varsayılan: **Pasif (gizli).** |
|
|
1206
|
+
| API Anahtarı | Otomatik oluşturulur | Kopyalama butonu; yeniden oluşturma (mevcut anahtarı geçersiz kılar) |
|
|
1207
|
+
| Açıklama | Textarea | Opsiyonel |
|
|
1208
|
+
| Durum | Toggle | Aktif / Pasif |
|
|
1209
|
+
|
|
1210
|
+
**IoT Cihaz Envanteri ve İzleme Sekmesi**
|
|
1211
|
+
* **Envanter Listesi:** Eşleştirilmiş aktif IoT cihazlarının listesi: Cihaz Kimliği (`device_id`), Cihaz Türü (Çöp/Geri Dönüşüm), Atık Tipi (Plastik/Kağıt vb.), Doluluk Oranı (%72 vb. - ilerleme çubuğu ile), Batarya Seviyesi (%90), Sağlık Durumu (Aktif/Arızalı/Bakımda), Son Telemetri Sinyali Zamanı.
|
|
1212
|
+
* **Harita Görünümü (Leaflet):** Envanterdeki tüm cihazların harita üzerinde pinler şeklinde gösterilmesi. Pin renkleri doluluk seviyesine göre dinamik olarak renklenir:
|
|
1213
|
+
* **Yeşil (Forest Green):** Doluluk < %50
|
|
1214
|
+
* **Sarı (Lime/Orange):** %50 ≤ Doluluk < %85
|
|
1215
|
+
* **Kırmızı (Danger Red):** Doluluk ≥ %85 (İş emri oluşturulmuş) VEYA Durum = Arızalı
|
|
1216
|
+
* **İşlemler:** Cihaz detayını görüntüleme, geçmiş telemetri log grafiklerini inceleme, cihazı manuel "Bakım" moduna alma (SLA/İş Emri tetiklemelerini geçici olarak durdurur).
|
|
1217
|
+
* **Sensör Spam Koruması ve Otomatik Bakım Modu (Cool-Down):** `resolved` durumuna getirilen bir iş emrinin ardından 1 saat içinde aynı sensörden tekrar doluluk sinyali gelirse, sistem otomatik olarak sensörü "Şüpheli / Bakım Gerekli (suspicious)" moduna alır, yeni iş emri tetiklemez ve admin paneline arıza kontrol uyarısı düşer.
|
|
1218
|
+
|
|
1219
|
+
**Hata Logları Sekmesi**
|
|
1220
|
+
- Hatalı webhook isteklerinin ve parser çökmelerinin listesi: tarih, entegrasyon kaynağı, hata türü (400 Bad Request, 422 Parser Error vb.), hata detayı/log çıktısı, istek gövdesi (ilk 500 karakter), yeniden deneme butonu.
|
|
1221
|
+
|
|
1222
|
+
**Entegrasyon Kaynağı Silme ve Pasif Etme:**
|
|
1223
|
+
- **Silme:** Entegrasyon kaynakları veritabanında denetim bütünlüğü için silinemez.
|
|
1224
|
+
- **Pasif Etme (`is_active = false`):** Sadece pasif konuma getirilebilir. Pasif yapıldığında bu entegrasyona bağlı olan IoT cihazlarından gelen telemetri verileri sistem tarafından reddedilir. Geçmiş entegrasyon logları saklanmaya devam eder.
|
|
1225
|
+
|
|
1226
|
+
**IoT Cihaz Silme ve Düzenleme:**
|
|
1227
|
+
- **Silme:** Sensör fiziksel olarak kaldırıldığında cihaz envanterden silinemez, durum parametresi **"Arşivlendi (archived)"** olarak güncellenir. Bu durumda cihaza ait veri alımı kalıcı olarak durdurulur ama geçmiş veri bütünlüğü korunur.
|
|
1228
|
+
- **Düzenleme:** Cihaz bilgileri (cihaz türü, atık tipi, lokasyon notu) IoT Cihaz Envanteri listesinde [Düzenle] butonu ile güncellenebilir.
|
|
1229
|
+
|
|
1230
|
+
#### 2.5.8 Duyuru Yönetimi
|
|
1231
|
+
|
|
1232
|
+
**URL:** `/admin/announcements`
|
|
1233
|
+
**Erişim:** `muni_admin`
|
|
1234
|
+
|
|
1235
|
+
**Liste + Oluşturma / Düzenleme Formu**
|
|
1236
|
+
|
|
1237
|
+
| Alan | Tür | Kural |
|
|
1238
|
+
| :--- | :--- | :--- |
|
|
1239
|
+
| Başlık | Metin | Zorunlu, max 150 karakter |
|
|
1240
|
+
| İçerik | Zengin metin editörü | Zorunlu, max 5000 karakter |
|
|
1241
|
+
| Tür | Radio | Bilgi / Uyarı / Acil |
|
|
1242
|
+
| Etkilenen İlçe/Mahalleler | Çoklu dropdown | Zorunlu; "Tüm Belediye" seçeneği de var |
|
|
1243
|
+
| Yayın Tarihi | Tarih-saat | Zorunlu; ileriye tarihleme desteklenir |
|
|
1244
|
+
| Bitiş Tarihi | Tarih-saat | Opsiyonel; girildiyse vatandaş arayüzünden otomatik kaldırılır |
|
|
1245
|
+
|
|
1246
|
+
**Duyuru Silme ve Yayından Kaldırma:**
|
|
1247
|
+
- **Silme:** Duyurular listedeki [Sil] butonu ile fiziksel olarak silinebilir. Silindiğinde vatandaş arayüzünden ve mobil bildirimlerden anında kaldırılır.
|
|
1248
|
+
- **Yayından Kaldırma:** Bitiş tarihi beklenmeden duyuruyu anlık olarak yayından kaldırmak için [Yayından Kaldır] butonu mevcuttur. Bu buton duyurunun durumunu `draft` veya `archived` olarak günceller ve vatandaş ekranlarından gizler.
|
|
1249
|
+
|
|
1250
|
+
#### 2.5.9 Fikir Moderasyonu
|
|
1251
|
+
|
|
1252
|
+
**URL:** `/admin/ideas`
|
|
1253
|
+
**Erişim:** `muni_admin`
|
|
1254
|
+
|
|
1255
|
+
**Filtreler:** Durum (Beklemede / Onaylandı / Reddedildi) · Tarih
|
|
1256
|
+
|
|
1257
|
+
**İşlemler**
|
|
1258
|
+
- [Onayla]: Fikir vatandaş arayüzünde yayımlanır
|
|
1259
|
+
- [Reddet]: Gerekçe alanı (max 500 karakter) zorunlu; vatandaşa bildirim gönderilmez
|
|
1260
|
+
- [Resmi Yanıt Ekle]: Metin alanı (max 1000 karakter); vatandaş arayüzünde fikrin altında yayımlanır
|
|
1261
|
+
|
|
1262
|
+
**Fikir Silme ve Düzenleme Kuralları:**
|
|
1263
|
+
- **Silme / Yayından Kaldırma:** Onaylanmış veya reddedilmiş bir fikir, vatandaşların oyları ve veri bütünlüğü için fiziksel olarak silinemez. Ancak, sonradan uygunsuz içerik tespit edilirse [Geri Çek / Gizle] butonu ile vatandaş panelinden tamamen gizlenebilir (`status = 'hidden'`).
|
|
1264
|
+
- **Resmi Yanıt Düzenleme:** Fikre eklenen "Resmi Yanıt" istenildiği zaman [Yanıtı Düzenle] butonu ile güncellenebilir veya [Yanıtı Sil] ile tamamen kaldırılabilir.
|
|
1265
|
+
|
|
1266
|
+
#### 2.5.10 Analitik ve Raporlama
|
|
1267
|
+
|
|
1268
|
+
**URL:** `/admin/analytics`
|
|
1269
|
+
**Erişim:** `muni_admin`, `muni_department_manager` (yalnızca kendi müdürlüğü), `muni_team_chief` (yalnızca kendi ekibi)
|
|
1270
|
+
|
|
1271
|
+
**Sekmeler**
|
|
1272
|
+
|
|
1273
|
+
| Sekme | İçerik |
|
|
1274
|
+
| :--- | :--- |
|
|
1275
|
+
| **Özet** | Bekleyen / Devam / Çözülen sayıları; müdürlük dağılımı; kaynak tipi dağılımı |
|
|
1276
|
+
| **Isı Haritası** | **Bölgesel Yoğunluk Analizi:** Belediye sınırları içerisinde mahalle ve sokak bazlı sorun kümelerini gösteren ısı haritası. Kategori ve tarih filtresine göre dinamik güncellenir. Halka açık görünürlük durumuna göre filtreleme (`is_public_visible = true|false`) ve katman yönetimi mevcuttur. |
|
|
1277
|
+
| **Performans** | Ortalama çözüm süresi (trend grafiği); müdürlük ve ekip bazında tamamlanan iş; en sık kategoriler |
|
|
1278
|
+
| **SLA Raporu** | Süresinde kapatılan vs. aşılan iş oranı; müdürlük bazında SLA uyum yüzdesi |
|
|
1279
|
+
| **Vatandaş Memnuniyeti** | Yıldız ortalaması (tüm zaman / aylık); yeniden açılma oranı; kategori bazında memnuniyet |
|
|
1280
|
+
| **Destek Analitiği** | Vatandaş katılımı ve "+1 Beni de Etkiliyor" desteği metrikleri: En Çok Desteklenen Raporlar listesi, mahalle bazlı destek yoğunluk dağılımı, zaman serisi bazında destek sayısı trend grafiği. |
|
|
1281
|
+
| **Personel Performansı** | Ekip/personel bazında tamamlanan iş sayısı ve ortalama süre |
|
|
1282
|
+
| **Özel Raporlar (Custom)** | **Dinamik Özel Rapor Oluşturucu (Custom Report Builder):** Drag-and-drop arayüzü ile belediye yöneticilerinin kendi özel rapor şablonlarını oluşturduğu alan. Boyutlar (kategori, mahalle, personel, müdürlük, öncelik, kronik durumu) ile metrikler (iş sayısı, SLA uyum %, ortalama çözüm süresi, memnuniyet puanı, re-open %) serbestçe eşleştirilip filtrelenebilir. |
|
|
1283
|
+
|
|
1284
|
+
**Ortak Kontroller (tüm sekmeler için)**
|
|
1285
|
+
- Tarih aralığı seçici: Son 7 Gün / Son 30 Gün / Son 3 Ay / Özel
|
|
1286
|
+
- Müdürlük filtresi (yalnızca muni_admin için)
|
|
1287
|
+
- Dışa Aktar butonu: PDF veya Excel (XLSX)
|
|
1288
|
+
|
|
1289
|
+
**Dinamik Özel Rapor Oluşturucu ve Zamanlayıcı Yapısı:**
|
|
1290
|
+
1. **Şablon Tasarımı (Builder):** `muni_admin` seçtiği metrikleri (örn. *Fen İşleri Ortalama Çözüm Süresi*), boyutları (örn. *Mahalle Bazlı*) sürükleyip bırakarak pivot veya tablo görünümü oluşturur.
|
|
1291
|
+
2. **Performans İzleme (Read Replica):** Raporlama sorguları veritabanı performansını düşürmemek için doğrudan canlı DB yerine read-replica sunucusu üzerinden izole olarak çalıştırılır.
|
|
1292
|
+
3. **Otomatik Zamanlayıcı (Report Scheduler):** Oluşturulan özel şablonlar periyodik gönderime bağlanabilir. Admin panelinden haftalık (örn. Her Pazartesi 09:00) veya aylık (örn. Ayın 1'i) periyotlar seçilerek tanımlanan e-posta adreslerine rapor otomatik olarak şık stilize edilmiş PDF veya ham veri içeren XLSX formatında gönderilir.
|
|
1293
|
+
|
|
1294
|
+
#### 2.5.11 Denetim Logları
|
|
1295
|
+
|
|
1296
|
+
**URL:** `/admin/audit-logs`
|
|
1297
|
+
**Erişim:** `muni_admin`
|
|
1298
|
+
|
|
1299
|
+
**Liste Sütunları**
|
|
1300
|
+
- Tarih-Saat · Kullanıcı · Rol · Olay Tipi · Etkilenen Kayıt (iş emri no / kullanıcı adı vb.) · IP Adresi · Aksiyonlar
|
|
1301
|
+
|
|
1302
|
+
**Filtreler**
|
|
1303
|
+
|
|
1304
|
+
| Filtre | Seçenekler |
|
|
1305
|
+
| :--- | :--- |
|
|
1306
|
+
| Olay Tipi | REPORT_REDISPATCHED, STATUS_CHANGED, USER_CREATED, KVKK_DELETE, KVKK_ANONYMIZE_STARTED, GDPR_AUDIT_LOG_MASKED, INTEGRATION_ERROR, MANAGER_FORCE_APPROVE, FORCE_RESOLVE, MANUAL_APPROVAL, ROLE_CHANGE_CLEANUP, DISPUTE_RESOLVED, PUBLIC_VISIBILITY_CHANGED, SUPPORT_VOTE_ADDED, SUPPORT_VOTE_REMOVED vb. (dropdown, çoklu seçim) |
|
|
1307
|
+
| Kullanıcı | Metin araması |
|
|
1308
|
+
| Tarih Aralığı | Özel aralık |
|
|
1309
|
+
| Vatandaş | `citizen_id` UUID bazlı arama (KVKK denetim sorgusu) |
|
|
1310
|
+
|
|
1311
|
+
**Görsel Denetim Logu Vizörü (Visual JSONB Diff Viewer):**
|
|
1312
|
+
Her denetim log satırının sonunda bulunan **"İncele"** butonuna basıldığında ekranın sağ tarafından HSL Adaçayı/Orman Yeşili temalı şık bir drawer (modal yan panel) açılır:
|
|
1313
|
+
1. **Üst Bilgi Kartı:** İşlemi yapan personelin adı-soyadı, e-postası, rolü, işlemin gerçekleştiği IP adresi ve cihaz bilgileri (User-Agent) listelenir.
|
|
1314
|
+
2. **JSONB Diff Görünümü:** Veritabanındaki `payload_old` ve `payload_new` JSON verileri karşılaştırılarak side-by-side (yan yana) veya line-by-line (satır satır) karşılaştırmalı görünümde yansıtılır:
|
|
1315
|
+
- **Eklenen Veriler / Yeni Değerler:** Arka planı hafif HSL yeşili (`#e6f4ea`) ve yeşil metin rengi ile vurgulanır.
|
|
1316
|
+
- **Silinen Veriler / Eski Değerler:** Arka planı hafif HSL kırmızı/pembe (`#fce8e6`) ve kırmızı metin rengi ile vurgulanır.
|
|
1317
|
+
- Değişmeyen satırlar arka plan rengi olmadan düz listelenir.
|
|
1318
|
+
3. **Veri Sayfalama (Offset-based Pagination):** Tarihsel audit sorgularının performansı için listelemede `page` ve `limit = 25` parametreleri içeren offset bazlı sayfalama zorunludur.
|
|
1319
|
+
|
|
1320
|
+
- Loglar kesinlikle silinemez, değiştirilemez ve dışarıdan manipüle edilemez; yalnızca okunabilir (Read-Only).
|
|
1321
|
+
- Dışa Aktar: CSV formatında dışa aktarma düğmesi mevcuttur.
|
|
1322
|
+
|
|
1323
|
+
|
|
1324
|
+
#### 2.5.12 KVKK Yönetimi
|
|
1325
|
+
|
|
1326
|
+
**URL:** `/admin/gdpr`
|
|
1327
|
+
**Erişim:** `muni_admin`
|
|
1328
|
+
|
|
1329
|
+
**gdpr_requests Tablo Yapısı:**
|
|
1330
|
+
- `id UUID PRIMARY KEY`
|
|
1331
|
+
- `citizen_id UUID (ref: citizen.id)`
|
|
1332
|
+
- `status TEXT (pending | processing | completed) DEFAULT 'pending'`
|
|
1333
|
+
- `requested_at TIMESTAMPTZ`
|
|
1334
|
+
- `processed_at TIMESTAMPTZ NULL`
|
|
1335
|
+
- `anonymized_at TIMESTAMPTZ NULL`
|
|
1336
|
+
- `admin_notes TEXT NULL`
|
|
1337
|
+
|
|
1338
|
+
- Vatandaş silme taleplerinin listesi: `gdpr_requests` tablosu üzerinden; talep tarihi, durum (Beklemede / İşlemde / Tamamlandı), `anonymized_at` zaman damgası.
|
|
1339
|
+
- **[Talebi İşle] akışı:**
|
|
1340
|
+
1. E-posta veya telefon ile kullanıcı aranarak eşleştirme doğrulanır.
|
|
1341
|
+
2. `muni_admin` onayladığında: `citizen` tablosu kişisel alan maskelenir, `work_orders` anonimleştirilir, `support_votes` silinir, IP adresleri `0.0.0.0` yapılır. İşlem denetim loguna `KVKK_DELETE` olarak kaydedilir.
|
|
1342
|
+
3. **Asenkron Denetim Logu Maskeleme (KVKK Zorunluluğu):** Ana anonimleştirme tamamlandıktan sonra sistem otomatik olarak arka plan job'u başlatır. Bu job `audit_logs` tablosundaki `old_value` ve `new_value` alanlarında silinen vatandaşa ait geçmiş kayıtları regex ile tarar; telefon, T.C. kimlik numarası, e-posta ve ad-soyad verilerini `[KİŞİSEL VERİ SİLİNDİ]` ile maskeler. Job tamamlandığında `gdpr_requests.status = 'completed'` ve `anonymized_at` zaman damgası yazılır; denetim loguna `GDPR_AUDIT_LOG_MASKED` olayı eklenir.
|
|
1343
|
+
- Tamamlanan talepler silinmez; arşiv olarak tutulur (`gdpr_requests` tablosu silinemez).
|
|
1344
|
+
|
|
1345
|
+
|
|
1346
|
+
#### 2.5.13 Belediye Ayarları
|
|
1347
|
+
|
|
1348
|
+
**URL:** `/admin/settings`
|
|
1349
|
+
**Erişim:** `muni_admin`
|
|
1350
|
+
|
|
1351
|
+
| Alan | Tür | Kural |
|
|
1352
|
+
| :--- | :--- | :--- |
|
|
1353
|
+
| Belediye Adı | Metin | Zorunlu |
|
|
1354
|
+
| Logo | Dosya yükleme | PNG/SVG, max 2 MB |
|
|
1355
|
+
| İletişim E-postası | E-posta | Zorunlu |
|
|
1356
|
+
| İletişim Telefonu | Telefon | Opsiyonel |
|
|
1357
|
+
| Coğrafi Sınırlar (GeoJSON) | Dosya yükleme veya metin alanı | PostGIS uyumlu GeoJSON; haritada önizleme gösterilir. **Failsafe:** Alan daralması tespiti ve uyarısı mevcuttur. |
|
|
1358
|
+
| Zaman Dilimi | Dropdown | Varsayılan: Europe/Istanbul |
|
|
1359
|
+
| Varsayılan Dil | Dropdown | Şu an yalnızca Türkçe |
|
|
1360
|
+
|
|
1361
|
+
**Geofencing Ayarları**
|
|
1362
|
+
- [Geofencing Aktif/Pasif] Toggle (Acil durumlarda sistem genelinde sınırlamayı kaldırmak için)
|
|
1363
|
+
- **50m Geofence İstisna Tanımlama:** Bazı iş kategorileri için 50 metrelik mesafe kuralı yetersiz kalabilir (geniş alanlı park bakım, altyapı çalışmaları gibi). `muni_admin`, kategori veya müdürlük bazında "Geofence Mesafesi" değerini 50m–500m arasında özelleştirebilir. Her istisna düzenleyebilir ve kaldırılabilir; değişiklikler denetim loguna kaydedilir.
|
|
1364
|
+
|
|
1365
|
+
**Public Harita Ayarları**
|
|
1366
|
+
- **Public Harita Genel Toggle:** Halka açık sorun haritasının aktif veya pasif yapılmasını sağlar. Pasif yapıldığında ana sayfa (`/`) graceful fallback mesajı gösterir.
|
|
1367
|
+
- **Varsayılan Görünürlük Politikası:** Yeni gelen raporların varsayılan görünürlük durumu (`Otomatik Görünür` - moderation sonrası doğrudan gösterim / `Moderatör Onaylı` - moderatörün açık onayını gerektiren gösterim).
|
|
1368
|
+
- **Çözülen Raporların Kalma Süresi:** Çözülmüş statüsündeki raporların public haritada ne kadar süre daha gösterilmeye devam edeceğini belirler (30 gün / 90 gün / 6 ay / 1 yıl).
|
|
1369
|
+
- **Koordinat Fuzzing Miktarı (Yarıçapı):** Güvenlik ve gizlilik sebebiyle public haritada pinlerin konumlarının ne kadar kaydırılacağını (fuzzing) belirler (25m / 50m / 100m).
|
|
1370
|
+
- **Fotoğrafların Public Gösterilmesi Varsayılanı:** Halka açık haritada rapor fotoğraflarının varsayılan olarak gösterilip gösterilmeyeceğini belirler (Açık / Kapalı).
|
|
1371
|
+
- **Varsayılan Kaynak Görünürlük Politikaları:** Kaynak tiplerine göre (`citizen_report`, `manual_internal`, `scheduled`, `integration` - IoT) varsayılan görünürlük ayarlarının özelleştirilmesi.
|
|
1372
|
+
|
|
1373
|
+
> **Kısıtlama:** Bu Public Web Yol Haritası **sadece Merkez Panel (Central Admin)** üzerinden yönetilebilir. Belediye paneli (muni_admin dahil) bu içeriğe erişemez ve değiştiremez. Belediye sadece kendi belediyesine özel Public Harita ayarlarını yönetebilir.
|
|
1374
|
+
|
|
1375
|
+
**Statik Nokta (Geri Dönüşüm / Afet) Yönetimi**
|
|
1376
|
+
- `/admin/settings/static-points` sayfası üzerinden:
|
|
1377
|
+
- **Geri Dönüşüm Noktaları:** Ekle / Düzenle / Sil (Tür, Adres, Konum, Detay)
|
|
1378
|
+
- **Afet Toplanma Alanları:** Ekle / Düzenle / Sil (Kapasite, Adres, Konum)
|
|
1379
|
+
- **Toplu Veri:** GeoJSON veya CSV formatında toplu nokta yükleme ve harita üzerinde önizleme.
|
|
1380
|
+
|
|
1381
|
+
#### 2.5.14 Kriz Masası Canlı Haritası
|
|
1382
|
+
|
|
1383
|
+
**URL:** `/admin/crisis-map`
|
|
1384
|
+
**Erişim:** `muni_admin` (Afet Modu aktifken görünür)
|
|
1385
|
+
**Amaç:** Afet anında gelen panik sinyallerini gerçek zamanlı izlemek ve koordine etmek.
|
|
1386
|
+
|
|
1387
|
+
**Sayfa İçeriği**
|
|
1388
|
+
- **Tam Ekran Harita:** Gelen panik sinyalleri (GPS) ısı haritası veya kümelenmiş (clustered) pinler olarak gösterilir.
|
|
1389
|
+
- **Sinyal Detayı:** Pin üzerine tıklandığında konum, saat ve vatandaş takip kodu gösterilir.
|
|
1390
|
+
- **Toplu İşlem Paneli (Bulk Actions):**
|
|
1391
|
+
- Seçili alanı kare içine alarak tüm sinyalleri seçme.
|
|
1392
|
+
- "Müdahale Edildi / Güvende" olarak toplu kapatma.
|
|
1393
|
+
- **Statik Katmanlar:** Toplanma alanları, hastaneler ve kapalı yollar harita üzerinde katman olarak açılıp kapatılabilir.
|
|
1394
|
+
|
|
1395
|
+
#### 2.5.15 Anlaşmazlık Çözüm (Ping-Pong) Kuyruğu
|
|
1396
|
+
|
|
1397
|
+
**URL:** `/admin/disputes`
|
|
1398
|
+
**Erişim:** `muni_admin`
|
|
1399
|
+
**Amaç:** Müdür/admin tarafından 3. re-dispatch gerçekleştiğinde (re-dispatch sayacı `> 2`) sistem tarafından admin'e eskalasyon yapılan iş emirlerini incelemek ve son kararı vermek.
|
|
1400
|
+
|
|
1401
|
+
**Liste Sütunları**
|
|
1402
|
+
- İş Emri No · Başlık · Müdürlükler Arası Geçiş Sayısı · Son Reddeden Müdürlük · Tarih
|
|
1403
|
+
- Satır tıklanınca iş emri detayına gider. Admin bu sayfada doğrudan herhangi bir müdürlüğe **"Kesin Atama"** yapabilir.
|
|
1404
|
+
|
|
1405
|
+
**Kesin Atama Davranışı:**
|
|
1406
|
+
- Kesin atama yapıldığında iş emrine `is_force_assigned = true` flag'i yazılır.
|
|
1407
|
+
- Bu flag aktifken hedef müdürlük ve müdürler `re-dispatch` yapamaz; iş API katmanında kilitlidir.
|
|
1408
|
+
- Yalnızca `muni_admin` tekrar müdahale edebilir (flag'i kaldırabilir veya yeniden kesin atama yapabilir).
|
|
1409
|
+
- Re-dispatch sayacı sıfırlanır; iş sıfır sayaçla yeni müdürlüğe düşer.
|
|
1410
|
+
- Her kesin atama işlemi denetim loguna `DISPUTE_RESOLVED` olarak kaydedilir.
|
|
1411
|
+
|
|
1412
|
+
|
|
1413
|
+
---
|
|
1414
|
+
|
|
1415
|
+
### 2.6 Profil ve Güvenlik Ayarları (Tüm Belediye Personeli)
|
|
1416
|
+
|
|
1417
|
+
**URL:** `/profile/security`
|
|
1418
|
+
**Erişim:** Tüm Belediye Rolleri
|
|
1419
|
+
**Amaç:** Kullanıcının kendi bilgilerini ve 2FA ayarlarını yönetmesi.
|
|
1420
|
+
|
|
1421
|
+
**Bölümler**
|
|
1422
|
+
- **Hesap Bilgileri:** Ad, Soyad, E-posta, Profil Fotoğrafı.
|
|
1423
|
+
- **Şifre Güncelleme:** Mevcut şifre ve yeni şifre alanları.
|
|
1424
|
+
- **İki Faktörlü Doğrulama (2FA):**
|
|
1425
|
+
- Durum (Aktif / Pasif) toggle.
|
|
1426
|
+
- Aktifleştirildiğinde: QR kod gösterimi (Authenticator App uyumlu) + Yedek kodlar listesi.
|
|
1427
|
+
- **Oturum Yönetimi:** Mevcut aktif oturumların listesi ve "Tüm Cihazlardan Çıkış" butonu.
|
|
1428
|
+
|
|
1429
|
+
---
|
|
1430
|
+
|
|
1431
|
+
### 2.7 Birleşik Mobil Uygulama (Unified Mobile App) — Rol Tabanlı Mobil Deneyim ve Aksiyonlar
|
|
1432
|
+
|
|
1433
|
+
KENTİM Mobil Uygulaması (React Native + Expo), normal vatandaşların yanı sıra belediye içindeki tüm operasyonel rollerin (**Saha Personeli, Ekip Şefi ve Departman Müdürü**) hareket halindeyken (on-the-go) görev takibi yapabilmesi, push bildirimleri alabilmesi ve iş atayıp onaylayabilmesi için **Dinamik Rol Tabanlı UI Geçişi** ile tasarlanmıştır.
|
|
1434
|
+
|
|
1435
|
+
#### 2.7.1 Mobil Vatandaş Görünümü
|
|
1436
|
+
* **Arayüz:** Web public arayüzündeki tüm harita, 3 adımlı rapor modalı, takip drawer'ı, oylama, duyurular, geri dönüşüm ve acil/panik afet katmanları mobil ekranına duyarlı (responsive) olarak sunulur.
|
|
1437
|
+
|
|
1438
|
+
#### 2.7.2 Mobil Belediye Görünümü (Rol Tabanlı Ekranlar)
|
|
1439
|
+
|
|
1440
|
+
Kullanıcı kurumsal hesabı ile giriş yaptığında, JWT token içindeki yetki rolüne göre mobil kabuk (shell UI) otomatik olarak şu ekranlara dönüşür:
|
|
1441
|
+
|
|
1442
|
+
##### A. Saha Personeli Görünümü (`muni_worker`)
|
|
1443
|
+
* *Mobil Görev Havuzu:* Kendisine atanan işlerin öncelik ve yakınlık mesafesine göre listelenmesi.
|
|
1444
|
+
* *Görev Detay ve Tamamlama:* Navigasyon başlatma, dahili not ekleme, 50m geofence GPS kilidi, EXIF doğrulamalı kamera vizörü ile fotoğraf çekip işi tamamlayarak şef onayına gönderme.
|
|
1445
|
+
* *Çevrimdışı Mod:* SQLite/MMKV yerel veri önbelleği ve internet bağlantısı sağlandığında otomatik sync kuyruğu.
|
|
1446
|
+
* *Vardiya Kapatma (Handover):* Vardiya kapatıldığında `in_progress` işleri otomatik olarak şef havuzuna devretme.
|
|
1447
|
+
|
|
1448
|
+
##### B. Ekip Şefi Görünümü (`muni_team_chief`) — Mobil Planlama ve Fotoğraf Onay
|
|
1449
|
+
* **Mobil Görev Dağıtım Ekranı:**
|
|
1450
|
+
* Müdürlükten ekibe sevk edilmiş atanmamış (`assigned_to_team`) işlerin listesi.
|
|
1451
|
+
* İş emri kartının altındaki [Personele Ata] butonu tıklanarak kendi ekibindeki aktif personellerin listelendiği dropdown açılır; onaylandıktan sonra durum `assigned_to_worker` olur ve ilgili personele push bildirimi gider.
|
|
1452
|
+
* **Mobil Fotoğraf ve Kanıt Denetimi:**
|
|
1453
|
+
* Personelin tamamlayıp `pending_chief_approval` durumuna getirdiği işler şefin mobil ekranına anlık push bildirimiyle düşer.
|
|
1454
|
+
* Şef fotoğrafları ve üzerindeki EXIF GPS/saat damgalarını mobil ekranında inceleyerek doğrudan **[Fotoğrafı Onayla (resolved)]** veya **[Fotoğrafı Reddet (in_progress - gerekçe zorunlu)]** aksiyonu alır.
|
|
1455
|
+
* **Mobil Kalite Kontrol (QA):**
|
|
1456
|
+
* Vatandaşın düşük puan verdiği işler şefe push bildirimiyle iletilir. Şef mobil detay ekranından **[Çözümü Kesinleştir]** veya **[Yetersiz - İşe Döndür]** kararlarını anında verir.
|
|
1457
|
+
|
|
1458
|
+
##### C. Departman Müdürü Görünümü (`muni_department_manager`) — Mobil Yönetim ve Eskalasyon
|
|
1459
|
+
* **Mobil Müdür Havuzu:**
|
|
1460
|
+
* Müdürlüğün atanmamış havuzunda (`dispatched_to_department`) bekleyen veya müdürlük altındaki tüm aktif iş emirlerinin listelenmesi.
|
|
1461
|
+
* **Mobil Üzerinden İş Atama (Bypass Yetkisi):**
|
|
1462
|
+
* Müdür, mobil detay sayfasından **[Şefe Ata]** dropdown'unu kullanarak işi uygun şefin havuzuna yönlendirir.
|
|
1463
|
+
* Dilerse şeflik kademesini atlayarak **[Personele Doğrudan Ata (Bypass)]** dropdown'u ile işi doğrudan saha personeline atayabilir. Bu durumda onay yetkisi müdüre geçer.
|
|
1464
|
+
* **Eskalasyon ve Acil Aksiyon Butonları (Müdür Kontrolleri):**
|
|
1465
|
+
* Müdürün telefonuna şu durumlarda **Kritik Eylem Push Bildirimleri** gönderilir:
|
|
1466
|
+
1. **SLA Kritik / SLA Aşıldı:** İş emrinin SLA süresi dolduğunda veya %80 sınıra ulaştığında.
|
|
1467
|
+
2. **Ret Devre Kesici (Circuit Breaker):** Bir iş üst üste 3 kez fotoğraf reddi alıp `pending_manager_review` durumuna düştüğünde.
|
|
1468
|
+
3. **Re-dispatch Anlaşmazlığı:** İş emri ping-pong korumasına girmeden önce müdüre sevk uyarısı geldiğinde.
|
|
1469
|
+
* Müdür bildirim üzerine tıkladığında mobil uygulama doğrudan o iş emrinin detay sayfasını açar ve müdüre şu **Hızlı Karar Butonlarını** sunar:
|
|
1470
|
+
* **[Zorla Çözüldü Yap] (`force_resolve`):** Şef veya personel kanıtlarını bypass ederek işi doğrudan kapatır.
|
|
1471
|
+
* **[Personel Değiştir] (`reassign_worker`):** Ret sayacını sıfırlayarak işi yeni personeline sevk eder.
|
|
1472
|
+
* **[İşi İptal Et] (`reject`):** Gerekçeli olarak iş emrini sonlandırır.
|
|
1473
|
+
* **[Manuel Onayla] (`manual_approval`):** Mevcut yetersiz kanıtları kabul ederek onaylar.
|
|
1474
|
+
* **[Müdürlük Sevk] (`re-dispatch`):** İşin kendi müdürlüğüne ait olmadığı gerekçesiyle mobil ekranından gerekçe girerek işi tekrar moderatör kuyruğuna iade eder.
|
|
1475
|
+
|
|
1476
|
+
#### 2.7.3 İnteraktif Mobil Push Bildirim Matrisi (Actionable Push Notifications)
|
|
1477
|
+
Mobil uygulama üzerinden gönderilen bildirimler yalnızca bilgilendirici değil, **tıklanabilir ve hızlı aksiyon alınabilir** (actionable) yapıdadır:
|
|
1478
|
+
|
|
1479
|
+
| Alıcı Rol | Tetikleyici Olay | Push Bildirim İçeriği | Tıklama Sonrası Mobil Aksiyon / Ekran |
|
|
1480
|
+
| :--- | :--- | :--- | :--- |
|
|
1481
|
+
| **Saha Personeli** | Yeni İş Atandı | "Size yeni bir saha görevi atandı. Detayları görmek için tıklayın." | Doğrudan görev detay sayfasını açar; `[İşi Üstlen (in_progress)]` butonu odaklanır. |
|
|
1482
|
+
| **Ekip Şefi** | İş Onay Bekliyor | "Personel [Ad] görevi tamamladı. Fotoğraflı kanıtları onaylamak için tıklayın." | Şefin fotoğraf denetim vizörünü açar; `[Onayla]` ve `[Reddet]` hızlı butonları belirir. |
|
|
1483
|
+
| **Departman Müdürü** | Devre Kesici (3x Ret) | "ACİL: [No] nolu iş üst üste 3 kez reddedildi. İncelemek için tıklayın." | `pending_manager_review` ekranını açar; `[Force Resolve]` / `[Reassign]` aksiyon paneli aktifleşir. |
|
|
1484
|
+
| **Departman Müdürü** | SLA Aşıldı | "UYARI: [No] nolu iş emrinin SLA süresi aşıldı! Müdahale etmek için tıklayın." | İş emrinin zaman çizelgesini ve atanan ekibi açar; müdüre `[Reassign]` veya `[Force Approve]` yetkisi sunar. |
|
|
1485
|
+
|
|
1486
|
+
**Sonuç:** KENTİM Mobil Uygulaması, saha personelinden departman müdürüne kadar tüm rolleri birbirine anlık etkileşimli push bildirimleri ve aksiyon butonlarıyla bağlayan, tam kapsamlı bir mobil iş yönetim merkezidir.
|
|
1487
|
+
|
|
1488
|
+
---
|
|
1489
|
+
|
|
1490
|
+
## BÖLÜM 3: Central Panel — `central.kentim.com.tr`
|
|
1491
|
+
|
|
1492
|
+
### 3.0 Kimlik Doğrulama
|
|
1493
|
+
|
|
1494
|
+
**URL:** `/login`
|
|
1495
|
+
|
|
1496
|
+
```
|
|
1497
|
+
E-posta + şifre girişi
|
|
1498
|
+
→ Başarılı: Role göre yönlendirme
|
|
1499
|
+
- central_admin → /dashboard
|
|
1500
|
+
- central_moderator → /dashboard
|
|
1501
|
+
→ Başarısız: 5 denemede 15 dakika kilidi
|
|
1502
|
+
```
|
|
1503
|
+
|
|
1504
|
+
İsteğe bağlı 2FA (TOTP): `muni_admin` ve `central_admin` rolleri için etkinleştirilebilir (`/profile/security` sayfasından).
|
|
1505
|
+
|
|
1506
|
+
---
|
|
1507
|
+
|
|
1508
|
+
### 3.1 Central Dashboard
|
|
1509
|
+
|
|
1510
|
+
**URL:** `/dashboard`
|
|
1511
|
+
**Erişim:** `central_admin`, `central_moderator`
|
|
1512
|
+
**Amaç:** Tüm belediyelerin anlık özetini izlemek.
|
|
1513
|
+
|
|
1514
|
+
**Widget'lar**
|
|
1515
|
+
|
|
1516
|
+
- Aktif Belediye Sayısı / Toplam Lisans
|
|
1517
|
+
- Toplam Aktif İş Emri (tüm belediyeler)
|
|
1518
|
+
- Bu Ay Çözülen İş Emirleri
|
|
1519
|
+
- SLA Aşım Oranı (belediye ortalaması)
|
|
1520
|
+
- **Belediye Durumu Tablosu:** Her belediye için ad · Aktif İş · Heartbeat Durumu (yeşil/sarı/kırmızı) · Son Veri Alım Zamanı · Abonelik Bitiş Tarihi
|
|
1521
|
+
- **Uyarılar Bölümü:** Heartbeat kesintileri, SLA aşımları, abonelik bitiş yaklaşanlar (30 gün içinde)
|
|
1522
|
+
|
|
1523
|
+
> `central_moderator` için: Dashboard, Sistem Sağlığı (`/system-health`), Global Raporlar (`/reports`) ve Denetim Logları (salt-okunur, sadece kendi yaptığı işlemler) erişimine sahiptir. Belediye yönetimi, Afet Modu tetikleme, Kullanıcı yönetimi ve Global Kategori düzenleme yetkisi **yoktur**. Bireysel iş emri, vatandaş verisi veya koordinat detayına erişemez.
|
|
1524
|
+
|
|
1525
|
+
---
|
|
1526
|
+
|
|
1527
|
+
### 3.2 Belediye Yönetimi
|
|
1528
|
+
|
|
1529
|
+
**URL:** `/municipalities`
|
|
1530
|
+
**Erişim:** `central_admin`
|
|
1531
|
+
**Amaç:** Belediye ekleme, durum güncelleme ve abonelik yönetimi.
|
|
1532
|
+
|
|
1533
|
+
**Liste Sütunları**
|
|
1534
|
+
- Belediye Adı · İl · Durum (Aktif / Pasif / Süresi Dolmuş) · Abonelik Bitiş · Heartbeat Durumu · Kayıt Tarihi
|
|
1535
|
+
- Arama: belediye adı ile
|
|
1536
|
+
|
|
1537
|
+
**Yeni Belediye Ekleme & Dinamik Lokasyon Bağlama**
|
|
1538
|
+
|
|
1539
|
+
Belediye ekleme formu, Türkiye'nin coğrafi sözlük hiyerarşisiyle tam entegre çalışır. Lokasyon dropdown alanları şu kurallarla dinamik olarak beslenir:
|
|
1540
|
+
1. **İl Dropdown (Dinamik Binding):** Form açıldığı anda, frontend arka planda `GET /v1/central/locations/hierarchy` endpoint'ini çağırır. Dönen JSON listesindeki `type = 'province'` olan tüm illeri (toplam 81 il) alfabetik olarak "İl" dropdown'una doldurur.
|
|
1541
|
+
2. **İlçe Dropdown (Bağımlı Tetikleyici):** Kullanıcı "İl" dropdown'undan bir şehir (örn: *İstanbul*, `id: "a2e564ad-43ab-41c1-90a1-24c568ad9cf1"`) seçtiği anda, "İlçe" dropdown'u aktifleşir ve sistem asenkron olarak `GET /v1/central/locations/hierarchy?parent_id=a2e564ad-43ab-41c1-90a1-24c568ad9cf1` isteğini fırlatır. Dönen sonuçtaki ilgili ilçeler (örn: *Kadıköy*, *Beşiktaş*) "İlçe" dropdown'una dinamik olarak bind edilir.
|
|
1542
|
+
3. Bu sayede, database seed (`turkey_locations_seed.sql`) verisiyle %100 uyumlu, tutarlı ve eksiksiz bir il/ilçe seçimi sağlanır.
|
|
1543
|
+
|
|
1544
|
+
| Alan | Tür | Kural / Dinamik Veri Kaynağı |
|
|
1545
|
+
| :--- | :--- | :--- |
|
|
1546
|
+
| Belediye Adı | Metin | Zorunlu, benzersiz |
|
|
1547
|
+
| İl | Dropdown | Zorunlu (Central API Province listesinden beslenir) |
|
|
1548
|
+
| İlçe | Dropdown | Opsiyonel (Seçili İl'e bağlı District listesinden beslenir) |
|
|
1549
|
+
| Yetkili Kişi Adı | Metin | Zorunlu |
|
|
1550
|
+
| Yetkili E-posta | E-posta | Zorunlu; bu adrese `muni_admin` davet maili gönderilir |
|
|
1551
|
+
| Abonelik Başlangıç Tarihi | Tarih | Zorunlu |
|
|
1552
|
+
| Abonelik Bitiş Tarihi | Tarih | Zorunlu |
|
|
1553
|
+
|
|
1554
|
+
|
|
1555
|
+
Kayıt sonrası:
|
|
1556
|
+
1. Standart müdürlük şablonu otomatik oluşturulur (Fen İşleri, Temizlik İşleri, Park Bahçeler, Su Kanal, Zabıta)
|
|
1557
|
+
2. `muni_admin` kullanıcısı için davet maili gönderilir
|
|
1558
|
+
3. Belediyeye özgü API anahtarı oluşturulur
|
|
1559
|
+
|
|
1560
|
+
**Belediye Silme Politikası:**
|
|
1561
|
+
- **Silme:** Belediyeler hiçbir koşulda veritabanından fiziksel olarak silinemez (yasal/tarihsel veri bütünlüğü ve denetim loglarının korunması sebebiyle).
|
|
1562
|
+
- **Pasif Etme (`status = 'passive'`):** Sadece [Pasif] toggle ile devre dışı bırakılabilirler. Pasife alındığında belediye sistemine tüm erişim durdurulur (7 günlük "salt-tamamlama" grace period sonunda).
|
|
1563
|
+
|
|
1564
|
+
#### 3.2.1 Belediye Detay
|
|
1565
|
+
|
|
1566
|
+
**URL:** `/municipalities/:id`
|
|
1567
|
+
**Erişim:** `central_admin`
|
|
1568
|
+
|
|
1569
|
+
**Sekmeler**
|
|
1570
|
+
|
|
1571
|
+
| Sekme | İçerik |
|
|
1572
|
+
| :--- | :--- |
|
|
1573
|
+
| **Genel Bilgiler** | Düzenleme formu; Aktif/Pasif toggle |
|
|
1574
|
+
| **Abonelik** | Bitiş tarihi, yenileme geçmişi; [Tarihi Güncelle] butonu |
|
|
1575
|
+
| **İstatistikler** | Belediyeden gelen anonimleştirilmiş özet veriler (son 30 günlük trend) |
|
|
1576
|
+
| **Heartbeat** | Son 24 saatteki heartbeat kayıtları; kesinti anları kırmızı ile işaretli |
|
|
1577
|
+
| **API Anahtarları** | Mevcut anahtar (maskelenmiş); [Yenile] butonu (mevcut anahtarı geçersiz kılar; onay modal'ı gerektirir) |
|
|
1578
|
+
| **Denetim Logu** | Bu belediyeyle ilgili central düzeydeki işlem kayıtları |
|
|
1579
|
+
|
|
1580
|
+
---
|
|
1581
|
+
|
|
1582
|
+
### 3.3 Global Kategori Yönetimi
|
|
1583
|
+
|
|
1584
|
+
**URL:** `/categories`
|
|
1585
|
+
**Erişim:** `central_admin`
|
|
1586
|
+
|
|
1587
|
+
**Liste**
|
|
1588
|
+
- Tüm global kategoriler: ad, risk skoru, varsayılan müdürlük türü, oluşturulma tarihi
|
|
1589
|
+
- Global kategoriler silinemez; yalnızca düzenlenebilir ve Aktif/Pasif yapılabilir
|
|
1590
|
+
- `central_moderator` bu sayfayı görebilir ama düzenleyemez
|
|
1591
|
+
|
|
1592
|
+
**Kategori Formu**
|
|
1593
|
+
|
|
1594
|
+
| Alan | Tür | Kural |
|
|
1595
|
+
| :--- | :--- | :--- |
|
|
1596
|
+
| Kategori Adı | Metin | Zorunlu, benzersiz, max 100 karakter |
|
|
1597
|
+
| Açıklama | Textarea | Opsiyonel, max 500 karakter |
|
|
1598
|
+
| Risk Skoru | Sayı 1–10 | Zorunlu |
|
|
1599
|
+
| Public Haritada Görünür mü? | Toggle | Aktif/Pasif (Kategori bazlı yasaklama seçeneği. Pasif yapıldığında kategori-level deny olarak işaretlenir ve bu kategoriye ait hiçbir iş emri belediyeden bağımsız olarak public haritada gösterilemez) |
|
|
1600
|
+
| Durum | Toggle | Aktif / Pasif |
|
|
1601
|
+
|
|
1602
|
+
---
|
|
1603
|
+
|
|
1604
|
+
### 3.4 Lokasyon Hiyerarşisi Yönetimi
|
|
1605
|
+
|
|
1606
|
+
**URL:** `/locations`
|
|
1607
|
+
**Erişim:** `central_admin`
|
|
1608
|
+
|
|
1609
|
+
**Hiyerarşik Ağaç:** Bölge → Şehir → İlçe → Mahalle → Sokak
|
|
1610
|
+
|
|
1611
|
+
**İşlemler**
|
|
1612
|
+
- Tekil kayıt ekleme / düzenleme / silme (alt kaydı olanlar silinemez)
|
|
1613
|
+
- Toplu içe aktarım: CSV yükleme; sütun formatı: `bolge, sehir, ilce, mahalle, sokak`; hatalı satırlar ayrı bir özet raporda listelenir
|
|
1614
|
+
- Dışa aktarım: Tüm hiyerarşiyi CSV olarak indir
|
|
1615
|
+
|
|
1616
|
+
---
|
|
1617
|
+
|
|
1618
|
+
### 3.5 Sistem Sağlığı İzleme
|
|
1619
|
+
|
|
1620
|
+
**URL:** `/system-health`
|
|
1621
|
+
**Erişim:** `central_admin`, `central_moderator`
|
|
1622
|
+
**Not:** central_moderator sadece izleyebilir; heartbeat testi tetikleme veya alarm kapatma yapamaz.
|
|
1623
|
+
|
|
1624
|
+
**Sayfa İçeriği & Düzen**
|
|
1625
|
+
|
|
1626
|
+
1. **Merkezi SaaS Altyapı Sağlığı (Monitör Kartları):**
|
|
1627
|
+
- **Central DB:** Durum (UP/DOWN) · Latency (ms) · Aktif Bağlantı Sayısı
|
|
1628
|
+
- **Kuyruklar:** Durum (Sağlıklı) · PostgreSQL Panik Sinyali Kuyruk Derinliği (bekleyen işler)
|
|
1629
|
+
- **Gateway API Sunucusu:** CPU Kullanımı (%) · Bellek Kullanımı (MB)
|
|
1630
|
+
|
|
1631
|
+
2. **Dağıtık Belediye Backend Sunucu Sağlığı (Polling & Heartbeat Grid):**
|
|
1632
|
+
- **Grid Kolonları:** Belediye Adı · Backend URL · Durum (`UP` / `DEGRADED` / `DOWN`) · Latency (ms) · DB Bağlantısı · pg_listener_active · Disk Doluluk Oranı (%) · Son Heartbeat Zamanı · Aksiyonlar (Heartbeat Testi Tetikle)
|
|
1633
|
+
- **Görsel Kodlama:**
|
|
1634
|
+
- **Yeşil (UP):** Sunucu `/ready` polling testini başarıyla geçmiş, DB/pg_listener_active aktif, latency < 150ms.
|
|
1635
|
+
- **Sarı (DEGRADED):** Polling testi başarılı fakat son 3 dakikada heartbeat gecikmiş VEYA DB/pg_listener_active servislerinden biri ulaşılamaz VEYA disk doluluk > %85 VEYA latency > 500ms.
|
|
1636
|
+
- **Kırmızı (DOWN):** Polling testine 5 saniye boyunca yanıt yok VEYA son 3 dakikadır heartbeat kesik.
|
|
1637
|
+
- **Heartbeat & Latency Geçmişi:** Satıra tıklandığında son 24 saatlik `/ready` ping gecikme ve ulaşılamazlık (Uptime) grafiklerini gösteren modal yan panel açılır.
|
|
1638
|
+
- **Kritik Sunucu Uyarı Paneli:** Son 24 saatte "DOWN" durumuna düşen belediye sunucularını kesinti süreleriyle birlikte listeler.
|
|
1639
|
+
|
|
1640
|
+
|
|
1641
|
+
---
|
|
1642
|
+
|
|
1643
|
+
### 3.6 Global Raporlar
|
|
1644
|
+
|
|
1645
|
+
**URL:** `/reports`
|
|
1646
|
+
**Erişim:** `central_admin`, `central_moderator`
|
|
1647
|
+
**Not:** central_moderator sadece görüntüleyebilir ve dışa aktarabilir. Karşılaştırma raporlarında belediye bazlı filtre kullanabilir ancak hiçbir zaman bireysel iş emri veya vatandaş verisine inemez.
|
|
1648
|
+
|
|
1649
|
+
**Sekmeler**
|
|
1650
|
+
|
|
1651
|
+
| Sekme | İçerik |
|
|
1652
|
+
| :--- | :--- |
|
|
1653
|
+
| **Genel İstatistikler** | Tüm belediyelerden toplanan anonimleştirilmiş toplu veriler: kategori bazında iş emri dağılımı, bölgesel SLA uyum oranları, aylık trend grafiği |
|
|
1654
|
+
| **Bölgesel Sorun Haritası** | Türkiye haritası üzerinde il bazında iş emri yoğunluğu (ısı haritası) |
|
|
1655
|
+
| **Belediye Karşılaştırma** | SLA uyumu, ortalama çözüm süresi, vatandaş memnuniyeti gibi anonimleştirilmiş karşılaştırma tablosu |
|
|
1656
|
+
|
|
1657
|
+
**Tarih Aralığı Seçici:** Son 30 Gün / Son 3 Ay / Son Yıl / Özel
|
|
1658
|
+
**Dışa Aktar:** CSV veya JSON
|
|
1659
|
+
|
|
1660
|
+
---
|
|
1661
|
+
|
|
1662
|
+
### 3.7 Afet Modu
|
|
1663
|
+
|
|
1664
|
+
**URL:** `/disaster-mode`
|
|
1665
|
+
**Erişim:** Yalnızca `central_admin`
|
|
1666
|
+
|
|
1667
|
+
**Sayfa Durumları**
|
|
1668
|
+
|
|
1669
|
+
**A — Pasif Durum:**
|
|
1670
|
+
- Mevcut mod: "Normal"
|
|
1671
|
+
- [Afet Modunu Etkinleştir] butonu (kırmızı)
|
|
1672
|
+
|
|
1673
|
+
**B — Etkinleştirme Akışı:**
|
|
1674
|
+
```
|
|
1675
|
+
[central_admin] → "Afet Modunu Etkinleştir" butonuna tıklar
|
|
1676
|
+
↓
|
|
1677
|
+
[Etkilenen Belediyeler Seçimi]
|
|
1678
|
+
Tüm Belediyeler / Belirli İller / Belirli Belediyeler (çoklu seçim)
|
|
1679
|
+
↓
|
|
1680
|
+
[Açıklama Alanı] — max 500 karakter (zorunlu)
|
|
1681
|
+
↓
|
|
1682
|
+
[Onay Modal'ı]
|
|
1683
|
+
"Bu işlem seçili belediyelerde vatandaş arayüzünde
|
|
1684
|
+
Acil / Panik butonunu öne çıkaracaktır. Onaylıyor musunuz?"
|
|
1685
|
+
Onay için admin şifre tekrar girişi istenir
|
|
1686
|
+
↓
|
|
1687
|
+
[Sistem] → Seçili belediyelere sinyal gönderilir
|
|
1688
|
+
Vatandaş arayüzünde panik butonu öne çıkar
|
|
1689
|
+
İşlem denetim loguna kaydedilir
|
|
1690
|
+
```
|
|
1691
|
+
|
|
1692
|
+
**C — Aktif Durum:**
|
|
1693
|
+
- Etkin mod başlangıç zamanı ve açıklama gösterilir
|
|
1694
|
+
- Etkilenen belediyeler listesi
|
|
1695
|
+
- [Afet Modunu Sonlandır] butonu → onay modal'ı (şifre tekrar)
|
|
1696
|
+
|
|
1697
|
+
---
|
|
1698
|
+
|
|
1699
|
+
### 3.8 Kullanıcı ve Yetki Yönetimi
|
|
1700
|
+
|
|
1701
|
+
**URL:** `/users`
|
|
1702
|
+
**Erişim:** `central_admin`
|
|
1703
|
+
|
|
1704
|
+
**Liste**
|
|
1705
|
+
- Central panel kullanıcıları: ad, e-posta, rol, durum, son giriş tarihi
|
|
1706
|
+
|
|
1707
|
+
**Kullanıcı Oluşturma / Düzenleme**
|
|
1708
|
+
|
|
1709
|
+
| Alan | Tür | Kural |
|
|
1710
|
+
| :--- | :--- | :--- |
|
|
1711
|
+
| Ad Soyad | Metin | Zorunlu |
|
|
1712
|
+
| E-posta | E-posta | Zorunlu, benzersiz |
|
|
1713
|
+
| Rol | Radio | central_admin / central_moderator |
|
|
1714
|
+
| Durum | Toggle | Aktif / Pasif |
|
|
1715
|
+
|
|
1716
|
+
Oluşturmada davet maili gönderilir; kullanıcı ilk girişte şifre oluşturur.
|
|
1717
|
+
|
|
1718
|
+
**Central Kullanıcı Silme Politikası:**
|
|
1719
|
+
- **Silme:** Central panel kullanıcıları (admin/moderatör) veritabanındaki denetim loglarının (audit log) geçmiş izlenebilirliği açısından fiziksel olarak silinemez.
|
|
1720
|
+
- **Pasif Etme (`status = 'passive'`):** Sadece durum toggle'ı kullanılarak pasif konuma getirilebilirler. Pasif yapılan kullanıcıların panele tüm erişimi anında kesilir.
|
|
1721
|
+
|
|
1722
|
+
---
|
|
1723
|
+
|
|
1724
|
+
### 3.9 Central Denetim Logları
|
|
1725
|
+
|
|
1726
|
+
**URL:** `/audit-logs`
|
|
1727
|
+
**Erişim:** `central_admin`
|
|
1728
|
+
|
|
1729
|
+
**Açıklama:**
|
|
1730
|
+
Merkezi SaaS seviyesindeki sistem yöneticilerinin gerçekleştirdiği tüm global eylemlerin (`central_audit_logs` tablosu) izlendiği ekrandır.
|
|
1731
|
+
- Belediye ekleme, lisans askıya alma/grace period güncellemeleri, afet modu tetiklemeleri gibi tüm kritik eylemlerin listelenmesi.
|
|
1732
|
+
- **Visual JSONB Diff Viewer Panel Entegrasyonu:** Tıpkı belediye panelinde olduğu gibi, central log vizöründe de her satır için original ve new durumları (JSONB payload'ları) karşılaştırarak yeşil/kırmızı renk kodlarıyla diff olarak sunan yan panel mevcuttur. Örneğin bir belediyenin lisans tarihi uzatıldığında `payload_old.license_expires_at` ile `payload_new.license_expires_at` arasındaki fark görselleştirilerek sunulur.
|
|
1733
|
+
- Filtreler: Olay Tipi (Dropdown, çoklu) · Central Kullanıcı · Etkilenen Belediye · Tarih Aralığı
|
|
1734
|
+
- Sayfalama: Hızlı tarihsel tarama için offset bazlı pagination (`limit = 25`).
|
|
1735
|
+
- Silinemez, düzenlenemez; salt-okunurdur (Read-Only).
|
|
1736
|
+
- Dışa Aktar: CSV formatında dışa aktarma seçeneği mevcuttur.
|
|
1737
|
+
|
|
1738
|
+
|
|
1739
|
+
---
|
|
1740
|
+
|
|
1741
|
+
### 3.10 Yönetici Sunum Raporları (Executive Presentation-Ready Reports)
|
|
1742
|
+
|
|
1743
|
+
**URL:** `/admin/executive-reports`
|
|
1744
|
+
**Erişim:** `central_admin`, `central_moderator`
|
|
1745
|
+
**Amaç:** Merkez SaaS düzeyinde, tüm belediyelerin karşılaştırmalı performans, hacim ve vatandaş memnuniyet verilerini içeren sunuma hazır (Executive Presentation-Ready) şık grafiksel PDF ve Excel (XLSX) raporlarını oluşturmak ve dışa aktarmak.
|
|
1746
|
+
|
|
1747
|
+
**Temel Özellikler:**
|
|
1748
|
+
- **Karşılaştırmalı Belediye Analizi (Benchmark):** Tüm aktif belediyelerin SLA uyum oranları, ortalama çözüm süreleri ve vatandaş memnuniyeti yıldız ortalamalarının yan yana karşılaştırıldığı dinamik pivot tabloları ve bar grafikleri.
|
|
1749
|
+
- **Global SLA Trendleri ve Isı Dağılımı:** Hangi kategorilerde (Fen İşleri, Zabıta, vb.) ülke genelinde SLA aşım eğilimi olduğunu gösteren trend çizgileri.
|
|
1750
|
+
- **SaaS Gelir ve Lisanslama Projeksiyonu:** Bütçe sunumları için lisans bitimine kalan süre, belediye büyüme oranları ve gelir özetleri.
|
|
1751
|
+
- **Vatandaş Katılımı & Memnuniyet Analitiği:** "+1 Beni de Etkiliyor" desteği ve vatandaş puanlamalarının karşılaştırmalı analizi.
|
|
1752
|
+
- **Sunum Dışa Aktarım Katmanı:** Tek tıkla meclis veya yönetim kurullarına sunulmaya uygun, modern kurumsal renk paletleriyle stilize edilmiş, KENTİM logolu, sayfa numaralı ve grafik nesneleri gömülü **Vektörel PDF Raporu** ve detaylı **Pivot Excel Tablosu** üretimi.
|
|
1753
|
+
- **Tenant Güvenlik İzolasyonu:** Raporlama motoru çalışırken ham işlemlere ve kişisel verilere (`citizen` tabloları, `work_orders` detayları) kesinlikle erişilmez. Her tenant'ın kendi izole şemasından periyodik asenkron ETL scheduler ile toplanan ve central analytical DB'ye yazılan **anonim agrege veriler** kullanılır. Cross-tenant leak riski tamamen sıfırlanmıştır.
|
|
1754
|
+
|
|
1755
|
+
---
|
|
1756
|
+
|
|
1757
|
+
### 3.11 Public Web Yol Haritası Yönetimi (Geliştirme Rehberi Seviyesi)
|
|
1758
|
+
|
|
1759
|
+
**URL:** `/public-web-roadmap`
|
|
1760
|
+
**Erişim:** Yalnızca `central_admin` (2FA önerilir)
|
|
1761
|
+
**Amaç:** Vatandaş arayüzünde gösterilecek "Sistem Yol Haritası" içeriğini (MVP ve V1) merkezi, kontrollü ve denetlenebilir şekilde yönetmek.
|
|
1762
|
+
|
|
1763
|
+
#### 1. Acceptance Criteria (Kabul Kriterleri)
|
|
1764
|
+
|
|
1765
|
+
**AC-1: İçerik Düzenleme**
|
|
1766
|
+
- Central Admin, MVP ve V1 yol haritası içeriklerini ayrı sekmelerde düzenleyebilmelidir.
|
|
1767
|
+
- Her sürüm için Başlık, Alt Başlık, Markdown İçerik, Yayın Tarihi ve Aktif/Pasif durumu değiştirilebilir olmalıdır.
|
|
1768
|
+
- Değişiklikler anında sağ taraftaki Live Preview panelinde yansıtılmalıdır.
|
|
1769
|
+
|
|
1770
|
+
**AC-2: Yayın Kontrolü**
|
|
1771
|
+
- Central Admin, bir sürümü (MVP veya V1) aktif/pasif yapabilmelidir.
|
|
1772
|
+
- Pasif yapılan sürüm vatandaş arayüzünde görünmemelidir.
|
|
1773
|
+
- En az bir sürüm aktif olmalıdır (sistem bunu zorunlu kılmalıdır).
|
|
1774
|
+
|
|
1775
|
+
**AC-3: Önizleme**
|
|
1776
|
+
- Central Admin, değişiklikleri yayınlamadan önce tek kullanımlık önizleme linki üretebilmelidir.
|
|
1777
|
+
- Önizleme linki 24 saat geçerli olmalı ve sadece o adminin tarayıcısından erişilebilir olmalıdır.
|
|
1778
|
+
|
|
1779
|
+
**AC-4: Denetim**
|
|
1780
|
+
- Tüm değişiklikler (içerik güncelleme, aktif/pasif değiştirme) `central_audit_logs` tablosuna yazılmalıdır (kim, ne zaman, ne değişti).
|
|
1781
|
+
|
|
1782
|
+
#### 2. Business Rules (İş Kuralları)
|
|
1783
|
+
|
|
1784
|
+
- Sadece `central_admin` rolü bu ekrana erişebilir ve değişiklik yapabilir.
|
|
1785
|
+
- `central_moderator` sadece görüntüleyebilir (salt-okunur).
|
|
1786
|
+
- Belediye paneli (hiçbir rol) bu içeriğe erişemez veya değiştiremez.
|
|
1787
|
+
- İçerik `central_static_contents` tablosunda şu key’lerle saklanır:
|
|
1788
|
+
- `public_web_roadmap_mvp`
|
|
1789
|
+
- `public_web_roadmap_v1`
|
|
1790
|
+
- Bir sürüm aktif hale getirildiğinde, diğer sürümün aktiflik durumu otomatik olarak değişmez (bağımsızdır).
|
|
1791
|
+
- Markdown içerik 20.000 karakteri geçemez.
|
|
1792
|
+
|
|
1793
|
+
#### 3. Edge Cases & Error Handling
|
|
1794
|
+
|
|
1795
|
+
| Senaryo | Sistem Davranışı | Kullanıcıya Gösterilen Mesaj |
|
|
1796
|
+
|---------|------------------|------------------------------|
|
|
1797
|
+
| Her iki sürüm de pasif bırakılmaya çalışılıyor | İşlem reddedilir | "En az bir sürüm aktif olmalıdır." |
|
|
1798
|
+
| 20.000 karakterden uzun içerik kaydediliyor | Kaydet butonu pasif veya hata | "İçerik 20.000 karakteri geçemez." |
|
|
1799
|
+
| Aynı anda iki admin aynı sürümü düzenliyor | İyimser kilitleme devreye girer | "Bu içerik başka bir kullanıcı tarafından güncellendi. Sayfayı yenileyin." |
|
|
1800
|
+
| Önizleme linki süresi doldu | Link 404 döner | "Önizleme linkinin süresi dolmuş." |
|
|
1801
|
+
|
|
1802
|
+
#### 4. Validation Rules
|
|
1803
|
+
|
|
1804
|
+
- Başlık: Min 5 - Max 120 karakter
|
|
1805
|
+
- Alt Başlık: Max 200 karakter
|
|
1806
|
+
- İçerik: Min 50 karakter (boş bırakılamaz)
|
|
1807
|
+
- Yayın Tarihi: Opsiyonel, girilirse geçmiş tarih olamaz
|
|
1808
|
+
|
|
1809
|
+
#### 5. Non-Functional Requirements
|
|
1810
|
+
|
|
1811
|
+
- Değişiklik sonrası Live Preview < 300ms içinde güncellenmelidir.
|
|
1812
|
+
- Kaydet işlemi < 2 saniye içinde tamamlanmalıdır.
|
|
1813
|
+
- Önizleme linki üretimi < 1 saniye sürmelidir.
|
|
1814
|
+
- İçerik Markdown render edilirken XSS koruması (sanitization) zorunludur.
|
|
1815
|
+
|
|
1816
|
+
#### 6. Audit & Logging
|
|
1817
|
+
|
|
1818
|
+
Her kaydetme işleminde şu bilgiler `central_audit_logs` tablosuna yazılır:
|
|
1819
|
+
- `central_user_id`
|
|
1820
|
+
- `event_type`: `PUBLIC_WEB_ROADMAP_UPDATED` veya `PUBLIC_WEB_ROADMAP_TOGGLED`
|
|
1821
|
+
- `payload_old` / `payload_new` (tam içerik snapshot)
|
|
1822
|
+
- `ip_address`, `user_agent`
|
|
1823
|
+
|
|
1824
|
+
#### 7. Teknik Uygulama Notları
|
|
1825
|
+
|
|
1826
|
+
- Mevcut `central_static_contents` tablosu kullanılacaktır.
|
|
1827
|
+
- Key’ler: `public_web_roadmap_mvp` ve `public_web_roadmap_v1`
|
|
1828
|
+
- Migration: Sadece INSERT ile yeni satırlar eklenir (schema değişikliği gerekmez).
|
|
1829
|
+
- Frontend: Live Preview için Markdown → HTML dönüşümü client-side yapılabilir (güvenlik için backend sanitization da zorunludur).
|
|
1830
|
+
|
|
1831
|
+
---
|
|
1832
|
+
|
|
1833
|
+
### 3.11 Statik İçerik Yönetimi
|
|
1834
|
+
|
|
1835
|
+
**URL:** `/central/static-contents`
|
|
1836
|
+
**Erişim:** `central_admin`
|
|
1837
|
+
**Amaç:** Vatandaş arayüzünde gösterilen "Hakkımızda", "KVKK Metni", "Gizlilik Politikası" gibi statik sayfaların içeriklerini merkezi olarak düzenlemek.
|
|
1838
|
+
|
|
1839
|
+
**Sayfa Yapısı**
|
|
1840
|
+
- Sol panelde yönetilebilir içeriklerin listesi (`about`, `faq`, `privacy`, `kvkk`, `terms`, `contact`).
|
|
1841
|
+
- Seçilen içeriğe tıklandığında sağ tarafta düzenleme formu açılır.
|
|
1842
|
+
|
|
1843
|
+
**Düzenleme Formu**
|
|
1844
|
+
|
|
1845
|
+
| Alan | Tür | Kural |
|
|
1846
|
+
| :--- | :--- | :--- |
|
|
1847
|
+
| Başlık (`title`) | Metin | Zorunlu, max 200 karakter. Tarayıcı sekmesinde ve sayfa başlığında kullanılır. |
|
|
1848
|
+
| İçerik (`content`) | Markdown / Zengin Metin Editörü | Zorunlu. İçeriğin gövdesini oluşturur. |
|
|
1849
|
+
|
|
1850
|
+
- **[Kaydet]** butonu tıklandığında `PUT /v1/central/static-contents/:key` endpoint'i çağrılır.
|
|
1851
|
+
- Değişiklikler anında `GET /v1/public/static-contents/:key` endpoint'ine yansır.
|
|
1852
|
+
|
|
1853
|
+
---
|
|
1854
|
+
|
|
1855
|
+
## Özet: Sayfa ve İşlem Envanteri (MVP - Map-First + Modal Model)
|
|
1856
|
+
|
|
1857
|
+
### Vatandaş Web
|
|
1858
|
+
Ana deneyim tek sayfada (`/`) toplanmıştır. Halka açık harita ana sayfadır. Tüm diğer vatandaş akışları **modal / slide-over drawer** olarak açılır.
|
|
1859
|
+
|
|
1860
|
+
| # | Tür | Açıklama |
|
|
1861
|
+
| :--- | :--- | :--- |
|
|
1862
|
+
| 1 | Ana Sayfa | `/` — Tam public harita (serbest pan/zoom + dinamik yükleme) + floating aksiyonlar |
|
|
1863
|
+
| 2 | Rapor Oluşturma | Home haritası üzerinden açılan **modal** (3 adımlı) |
|
|
1864
|
+
| 3 | Rapor Takip | Home üzerinden açılan **modal** (takip kodu + sonuç drawer) |
|
|
1865
|
+
| 4 | Duyurular | Home üzerinden açılan **modal** (liste + detay) |
|
|
1866
|
+
| 5 | Fikir Önerileri | Home üzerinden açılan **modal** (liste, detay, oluşturma, oy) |
|
|
1867
|
+
| 6 | Geri Dönüşüm Haritası | Ana harita üzerine katman veya **modal** |
|
|
1868
|
+
| 7 | Dashboard | Giriş yapmış kullanıcı için **modal** (raporlarım, desteklerim, tercih) |
|
|
1869
|
+
| 8 | Profil & Ayarlar | **Modal** (bilgi güncelleme, şifre, hesap silme) |
|
|
1870
|
+
| 9 | Auth Akışları | Giriş, kayıt, OTP, şifre sıfırlama (modal veya sayfa) |
|
|
1871
|
+
| 10 | Panik / Acil | Home üzerinden her zaman erişilebilir **modal** |
|
|
1872
|
+
|
|
1873
|
+
**Not:** Ayrı `/map`, `/report/new`, `/announcements`, `/ideas`, `/dashboard` gibi tam sayfalar kaldırılmıştır.
|
|
1874
|
+
|
|
1875
|
+
### Belediye Paneli — **30** Sayfa / Görünüm
|
|
1876
|
+
| # | URL | Rol |
|
|
1877
|
+
| :--- | :--- | :--- |
|
|
1878
|
+
| 1 | `/login` | Tüm roller |
|
|
1879
|
+
| 2 | `/moderator/queue` | Moderatör, Admin |
|
|
1880
|
+
| 3 | `/moderator/reports/:id` | Moderatör, Admin |
|
|
1881
|
+
| 4 | `/moderator/work-orders/new` | Moderatör, Admin |
|
|
1882
|
+
| 5 | `/manager/work-orders` | Müdür, Admin |
|
|
1883
|
+
| 6 | `/manager/work-orders/:id` | Müdür, Admin |
|
|
1884
|
+
| 7 | `/manager/work-orders/new` | Müdür, Admin |
|
|
1885
|
+
| 8 | `/chief/work-orders` | Şef |
|
|
1886
|
+
| 9 | `/chief/work-orders/:id` | Şef |
|
|
1887
|
+
| 10 | `/chief/work-orders/new` | Şef |
|
|
1888
|
+
| 11 | `/chief/daily-plan` | Şef |
|
|
1889
|
+
| 12 | `/chief/team-stats` | Şef |
|
|
1890
|
+
| 13 | `/worker/tasks` | Personel |
|
|
1891
|
+
| 14 | `/worker/tasks/:id` | Personel |
|
|
1892
|
+
| 15 | `/admin/dashboard` | Admin |
|
|
1893
|
+
| 16 | `/admin/departments` | Admin |
|
|
1894
|
+
| 17 | `/admin/teams` | Admin |
|
|
1895
|
+
| 18 | `/admin/categories` | Admin |
|
|
1896
|
+
| 19 | `/admin/routing-rules` | Admin |
|
|
1897
|
+
| 20 | `/admin/schedule` | Admin, Müdür |
|
|
1898
|
+
| 21 | `/admin/integrations` | Admin |
|
|
1899
|
+
| 22 | `/admin/announcements` | Admin |
|
|
1900
|
+
| 23 | `/admin/ideas` | Admin |
|
|
1901
|
+
| 24 | `/admin/analytics` | Admin, Müdür, Şef |
|
|
1902
|
+
| 25 | `/admin/audit-logs` | Admin |
|
|
1903
|
+
| 26 | `/admin/gdpr` | Admin |
|
|
1904
|
+
| 27 | `/admin/settings` | Admin |
|
|
1905
|
+
| 28 | `/admin/crisis-map` | Admin |
|
|
1906
|
+
| 29 | `/admin/disputes` | Admin |
|
|
1907
|
+
| 30 | `/profile/security` | Tüm Roller |
|
|
1908
|
+
|
|
1909
|
+
### Central Panel — 11 Sayfa
|
|
1910
|
+
| # | URL | Rol |
|
|
1911
|
+
| :--- | :--- | :--- |
|
|
1912
|
+
| 1 | `/login` | Tüm central roller |
|
|
1913
|
+
| 2 | `/dashboard` | Admin, Moderatör |
|
|
1914
|
+
| 3 | `/municipalities` + `/:id` | Admin |
|
|
1915
|
+
| 4 | `/categories` | Admin, Moderatör (salt-okunur) |
|
|
1916
|
+
| 5 | `/locations` | Admin |
|
|
1917
|
+
| 6 | `/system-health` | Admin, Moderatör |
|
|
1918
|
+
| 7 | `/reports` | Admin, Moderatör |
|
|
1919
|
+
| 8 | `/disaster-mode` | Admin |
|
|
1920
|
+
| 9 | `/users` | Admin |
|
|
1921
|
+
| 10 | `/audit-logs` | Admin |
|
|
1922
|
+
| 11 | `/central/static-contents` | Admin |
|
|
1923
|
+
|
|
1924
|
+
---
|
|
1925
|
+
|
|
1926
|
+
## EK - Public Harita ve Modal Deneyimi (MVP)
|
|
1927
|
+
|
|
1928
|
+
### Ana Sayfa (`/`) — Public Harita (Map-First)
|
|
1929
|
+
- **URL:** `/` (tek ana deneyim)
|
|
1930
|
+
- **Erişim:** Herkese açık (anonim okuma). +1 desteği için JWT zorunlu.
|
|
1931
|
+
- **Bileşenler:** Tam ekran / baskın Leaflet haritası + floating aksiyon butonları. Tüm vatandaş akışları (rapor, takip, duyuru, fikir vb.) harita üzerinde **modal / drawer** olarak açılır.
|
|
1932
|
+
- **Davranış:** Vatandaş harita üzerinde tamamen serbestçe gezinebilir. BBOX + zoom seviyesine göre dinamik veri yüklenir.
|
|
1933
|
+
|
|
1934
|
+
### Admin Dashboard Widget'ları (Belediye Paneli)
|
|
1935
|
+
- **Public Map Sağlık Kartı:** Toplam public görünür iş/adet, son 24 saat destek oyları, cache hit/miss oranı.
|
|
1936
|
+
- **En Çok Destek Alan 10 İş:** Sol panelde listelenir.
|
|
1937
|
+
- **Moderasyon Bekleyen Public Özet**
|
|
1938
|
+
|
|
1939
|
+
### Analytics ve Destek Metrikleri
|
|
1940
|
+
- `support_votes` zaman serisi
|
|
1941
|
+
- Modal açılış metrikleri (hangi modal ne kadar kullanılıyor)
|
|
1942
|
+
- Destek → Çözüm korelasyonu
|
|
1943
|
+
|
|
1944
|
+
### Denetim Olayları
|
|
1945
|
+
- `PUBLIC_VISIBILITY_CHANGED`, `SUPPORT_VOTE_ADDED/REMOVED` (aynı)
|
|
1946
|
+
|
|
1947
|
+
### Public Harita Pasif Fallback
|
|
1948
|
+
- Belediye public haritayı kapatmışsa, ana sayfa (`/`) üzerinde graceful mesaj gösterilir. "Rapor oluşturmak için harita üzerinden 'Yeni Rapor' butonunu kullanın."
|
|
1949
|
+
|
|
1950
|
+
### Hesap Silme Uyarısı (MVP)
|
|
1951
|
+
- Hesap silme modalında +1 destek oyları ve `support_count` güncellemesi hakkında açık uyarı.
|
|
1952
|
+
|
|
1953
|
+
## BÖLÜM 4: Sistem Performansı ve Servis Kalitesi (QoS)
|
|
1954
|
+
|
|
1955
|
+
Sistemin operasyonel hızı ve kullanıcı deneyimi için aşağıdaki teknik hedefler (KPI) belirlenmiştir:
|
|
1956
|
+
|
|
1957
|
+
| Metrik | Hedef Değer | Açıklama |
|
|
1958
|
+
| :--- | :--- | :--- |
|
|
1959
|
+
| **API Yanıt Süresi** | < 200ms (P95) | Liste ve detay sayfaları için sunucu yanıt hızı. |
|
|
1960
|
+
| **Görsel Yükleme** | < 2s | 5MB fotoğrafın optimize edilip CDN'e basılma süresi. |
|
|
1961
|
+
| **Harita Render** | < 1s | 100+ pin içeren haritanın etkileşime hazır olma süresi. |
|
|
1962
|
+
| **Eşzamanlı Kullanıcı** | 10.000+ | Belediye başına beklenen anlık aktif vatandaş trafiği. |
|
|
1963
|
+
| **Sistem uptime** | %99.9 | Yıllık kesintisiz çalışma oranı. |
|
|
1964
|
+
|
|
1965
|
+
---
|
|
1966
|
+
|
|
1967
|
+
## BÖLÜM 5: Çok Belediyeli Bağımsız IoT ve Donanım Entegrasyon API Standartları
|
|
1968
|
+
|
|
1969
|
+
KENTİM platformu, her belediyenin kendi yerel donanımlarını (farklı marka/model akıllı çöp sensörleri, akıllı geri dönüşüm kutuları vb.) sisteme esnek ve izole şekilde entegre edebilmesi için **Self-Service Payload Mapping** mimarisine sahiptir.
|
|
1970
|
+
|
|
1971
|
+
### Ortak Telemetri API Uç Noktası (Telemetry API Endpoint)
|
|
1972
|
+
|
|
1973
|
+
* **Metot:** `POST`
|
|
1974
|
+
* **Adres:** `https://api.kentim.com.tr/v1/integrations/iot/telemetry`
|
|
1975
|
+
* **Headers:**
|
|
1976
|
+
```http
|
|
1977
|
+
Authorization: Bearer <API_KEY>
|
|
1978
|
+
x-idempotency-key: <UUIDv4>
|
|
1979
|
+
Content-Type: application/json
|
|
1980
|
+
```
|
|
1981
|
+
|
|
1982
|
+
> [!NOTE]
|
|
1983
|
+
> Gelen istekte bulunan `Authorization` başlığındaki `API_KEY` bilgisi, Central SaaS Gateway tarafından çözülerek ilgili belediyenin `tenant_id` değeri ile eşleştirilir. Bu sayede tüm veriler RLS katmanında tamamen izole edilir.
|
|
1984
|
+
|
|
1985
|
+
---
|
|
1986
|
+
|
|
1987
|
+
### Dinamik Alan Eşleştirme (Payload Mapping & Parser)
|
|
1988
|
+
|
|
1989
|
+
Her belediye, kendi panelindeki `/admin/integrations` sekmesinden gelen cihaz verilerini KENTİM standart formatına dönüştürecek kuralları tanımlar.
|
|
1990
|
+
|
|
1991
|
+
#### Örnek A: Basit Alan Eşleştirme (GUI Mapping)
|
|
1992
|
+
Belediyenin kullandığı sensör doluluk oranını `"status.capacity"` olarak, cihaz seri numarasını da `"uuid"` olarak yolluyorsa, admin panelden yapılan eşleştirme şöyledir:
|
|
1993
|
+
* `device_id` ➔ `uuid`
|
|
1994
|
+
* `fill_level_percentage` ➔ `status.capacity * 100`
|
|
1995
|
+
|
|
1996
|
+
#### Örnek B: Gelişmiş JavaScript Sandbox Parser (Custom Script Parser)
|
|
1997
|
+
Eğer cihaz verisi ham voltaj, mesafe veya karmaşık formatlar içeriyorsa, belediye admini sisteme güvenli JavaScript parser kodu girer. Sunucu tarafında bu betik V8 sandbox içinde izole olarak çalıştırılır:
|
|
1998
|
+
|
|
1999
|
+
```javascript
|
|
2000
|
+
/**
|
|
2001
|
+
* Ham IoT telemetri verisini standart KENTİM formatına dönüştürür.
|
|
2002
|
+
* @param {Object} rawPayload - Cihazdan gelen ham JSON verisi
|
|
2003
|
+
* @returns {Object} Standart KENTİM IoT şeması
|
|
2004
|
+
*/
|
|
2005
|
+
function parse(rawPayload) {
|
|
2006
|
+
// Örnek: Cihaz çöp kutusunun üst kapağı ile atık arasındaki mesafeyi mm olarak yolluyor (toplam yükseklik 1200mm)
|
|
2007
|
+
const maxDistance = 1200; // mm
|
|
2008
|
+
const currentDistance = rawPayload.sensor_reading.distance_mm;
|
|
2009
|
+
|
|
2010
|
+
// Doluluk yüzdesini hesaplama
|
|
2011
|
+
let fillRatio = ((maxDistance - currentDistance) / maxDistance) * 100;
|
|
2012
|
+
fillRatio = Math.max(0, Math.min(100, Math.round(fillRatio))); // 0-100 arasına sınırla
|
|
2013
|
+
|
|
2014
|
+
return {
|
|
2015
|
+
device_id: rawPayload.device_metadata.serial_no,
|
|
2016
|
+
device_type: "smart_waste_bin",
|
|
2017
|
+
waste_type: rawPayload.device_metadata.waste_category === "PET" ? "plastic" : "general_waste",
|
|
2018
|
+
fill_level_percentage: fillRatio,
|
|
2019
|
+
battery_level_percentage: Math.round((rawPayload.sensor_reading.battery_mv - 2000) / 12), // mV'tan yüzdeye çevirme
|
|
2020
|
+
status: rawPayload.sensor_reading.distance_mm < 50 ? "faulty" : "active", // Tıkanma durumu
|
|
2021
|
+
coordinates: {
|
|
2022
|
+
latitude: rawPayload.gps.lat,
|
|
2023
|
+
longitude: rawPayload.gps.lng
|
|
2024
|
+
}
|
|
2025
|
+
};
|
|
2026
|
+
}
|
|
2027
|
+
```
|
|
2028
|
+
|
|
2029
|
+
---
|
|
2030
|
+
|
|
2031
|
+
### Standart KENTİM IoT Veri Şeması (Target Internal Schema)
|
|
2032
|
+
Dinamik dönüştürücüden çıktıktan sonra veritabanına ve iş emri durum makinesine gönderilen standardize edilmiş nihai JSON şeması:
|
|
2033
|
+
|
|
2034
|
+
```json
|
|
2035
|
+
{
|
|
2036
|
+
"device_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
|
|
2037
|
+
"device_type": "smart_waste_bin",
|
|
2038
|
+
"waste_type": "plastic",
|
|
2039
|
+
"tenant_id": "muni_a",
|
|
2040
|
+
"fill_level_percentage": 89,
|
|
2041
|
+
"battery_level_percentage": 94,
|
|
2042
|
+
"status": "active",
|
|
2043
|
+
"coordinates": {
|
|
2044
|
+
"latitude": 41.0082,
|
|
2045
|
+
"longitude": 28.9784
|
|
2046
|
+
},
|
|
2047
|
+
"timestamp": "2026-05-20T18:48:00Z"
|
|
2048
|
+
}
|
|
2049
|
+
```
|
|
2050
|
+
|
|
2051
|
+
---
|
|
2052
|
+
|
|
2053
|
+
### HTTP Durum Kodları ve Hata Yönetimi
|
|
2054
|
+
|
|
2055
|
+
| Hata / Yanıt | HTTP Kodu | Açıklama |
|
|
2056
|
+
| :--- | :--- | :--- |
|
|
2057
|
+
| **Success (Yeni İş Emri)** | `201 Created` | Doluluk eşiği (%85) aşıldı veya arıza tespit edildi; otomatik olarak **Temizlik İşleri** veya **Sıfır Atık** müdürlüğüne `dispatched_to_department` durumunda yeni iş emri oluşturuldu. |
|
|
2058
|
+
| **Success (Aksiyon Yok)** | `200 OK` | Telemetri verisi başarıyla kaydedildi. Eşik aşılmadığı için yeni iş emri oluşturulmadı VEYA o cihaz için zaten açık, kapatılmamış aktif bir iş emri mevcut (Mükerrerlik koruması devrede). |
|
|
2059
|
+
| **Bad Request (Sınır Dışı)** | `400 Bad Request` | Gönderilen koordinatlar belediyenin PostGIS sınır poligonu (`boundaries`) dışında kaldı. İstek `integration_logs` tablosuna `FAILED` olarak kaydedilir. |
|
|
2060
|
+
| **Unauthorized** | `401 Unauthorized` | API anahtarı geçersiz veya iptal edilmiş. |
|
|
2061
|
+
| **Forbidden (Askı Modu)** | `403 Forbidden` | Belediye aboneliği pasife alınmış ve 7 günlük "salt-tamamlama" (grace period) süresi de dolmuş. Telemetri verisi kabul edilmez. |
|
|
2062
|
+
| **Parser Error** | `422 Unprocessable Entity` | Belediyenin tanımladığı Custom Parser Script hata verdi veya JSON alan eşleştirmeleri gelen gövdeyle uyuşmadı. |
|
|
2063
|
+
|
|
2064
|
+
---
|
|
2065
|
+
|
|
2066
|
+
*MVP Sürümü — KENTİM Sayfa Yapısı ve İşlemler Belgesi*
|
|
2067
|
+
*Birlikte okunacak belge: proje.md*
|
|
2068
|
+
|
|
2069
|
+
---
|
|
2070
|
+
|
|
2071
|
+
## Arayüz Standartları, Mobil Jestleri, WCAG Erişilebilirlik ve Analitik Şemaları (Eksikler Giderildi)
|
|
2072
|
+
|
|
2073
|
+
Bu bölüm, KENTİM vatandaş ve belediye paneli arayüzlerinin mobil cihazlarda, erişilebilirlik standartlarında ve analitik izleme katmanında sorunsuz çalışması için uyulması zorunlu olan kesin kuralları tanımlar:
|
|
2074
|
+
|
|
2075
|
+
### 1. Mobil Jest ve Çekmece (Drawer / Bottom Sheet) Çakışma Yönetimi
|
|
2076
|
+
|
|
2077
|
+
Mobil tarayıcılarda ve webviews üzerinde tam ekran harita ile bottom sheet çekmecesinin hareket çakışmalarını sıfıra indirmek için şu kurallar zorunludur:
|
|
2078
|
+
- **Harita Etkileşim Kilidi (Map Interaction Lock):**
|
|
2079
|
+
- İstemcide drawer'ın sürüklenmeye başlandığı an (`touchstart` / `mousedown`) harita nesnesinin (Leaflet/Mapbox) `dragging.disable()`, `touchZoom.disable()` ve `doubleClickZoom.disable()` metotları tetiklenerek harita tamamen pasifleştirilir.
|
|
2080
|
+
- Sürükleme bittiğinde (`touchend` / `mouseup`) harita etkileşimleri yeniden aktifleşir.
|
|
2081
|
+
- **Snap-Points Sınırları ve Davranışları:**
|
|
2082
|
+
- **Aşama 1 (Yükseklik %10 - Collapsed):** Yalnızca başlık, takip kodu ve durum rozeti görünür. Haritada serbest gezinti yapılabilir.
|
|
2083
|
+
- **Aşama 2 (Yükseklik %50 - Preview):** Rapor açıklaması, kategori ve en fazla 2 fotoğraf önizlemesi yüklenir. Bottom sheet'e odaklanıldığında haritadaki ilgili pin otomatik olarak ekranın üst %25'lik kısmına kaydırılarak (offset) görünür tutulur.
|
|
2084
|
+
- **Aşama 3 (Yükseklik %95 - Expanded):** Tüm zaman çizelgesi, geri bildirim formları ve yorumlar yüklenir. Arka plan tamamen donuklaşır (dim backdrop) ve harita tıklamaları bloke edilir.
|
|
2085
|
+
- **Dikey Kaydırma Yakalama (Scroll Capture Pipeline):**
|
|
2086
|
+
- Çekmece `%95` yüksekliğe ulaşana kadar CSS `touch-action: pan-y` kısıtlamasıyla çekmecenin kendi iç kaydırması kilitli kalır, her dikey hareket çekmeceyi büyütmeye yönlendirilir.
|
|
2087
|
+
- Çekmece en tepeye ulaştığında (`translateY` sıfıra eşitlendiğinde), çekmece gövdesinin iç kaydırması (`overflow-y: scroll`) aktifleşir.
|
|
2088
|
+
|
|
2089
|
+
### 2. WCAG AA/AAA Erişilebilirlik ve Odak Yönetimi (Focus Trap)
|
|
2090
|
+
|
|
2091
|
+
KENTİM platformunun engelli vatandaşlar ve ekran okuyucu kullanan bireyler için uyumlu olması yasal bir zorunluluktur (WCAG 2.1 standardı):
|
|
2092
|
+
- **Focus Trap (Odak Kilidi) Algoritması:**
|
|
2093
|
+
- Herhangi bir modal veya drawer açıldığında, odak (`focus`) modal içindeki ilk etkileşimli elemana (örn. kapatma butonu veya ilk input) taşınır.
|
|
2094
|
+
- Kullanıcı `Tab` tuşuna bastığında, odak modal içindeki elemanlar arasında döner. Eğer odaktaki eleman modalın son elemanıysa ve kullanıcı tekrar `Tab` yaparsa, odak modalın başına döner (`Shift + Tab` için tersi geçerlidir).
|
|
2095
|
+
- **Klavye Navigasyonu:**
|
|
2096
|
+
- `Esc` tuşuna basıldığında aktif modal/drawer anında kapanır, URL query param'ı (`/` haline) temizlenir ve odak modalı tetikleyen butona geri döner.
|
|
2097
|
+
- Harita üzerindeki pinler `tabindex="0"` özniteliğine sahiptir. Kullanıcı haritada klavyeyle gezinirken ok tuşlarıyla pinleri seçebilir ve `Enter` ile modal detay penceresini açabilir.
|
|
2098
|
+
- **WAI-ARIA Yapısı:**
|
|
2099
|
+
- Tüm modal pencereleri `role="dialog"` ve `aria-modal="true"` özniteliklerini içermelidir.
|
|
2100
|
+
- Kapatma butonlarında `aria-label="Kapat"` etiketi bulunmalıdır.
|
|
2101
|
+
- Harita pinleri ekran okuyucular tarafından okunurken `"Pin [Takip Kodu], Kategori: [Kategori Name], Durum: [Durum Name]"` şeklinde seslendirilir.
|
|
2102
|
+
|
|
2103
|
+
### 3. Analitik (Analytics) Standart Event Şeması
|
|
2104
|
+
|
|
2105
|
+
KENTİM vatandaş web uygulamasındaki tüm modal açılışları ve kullanıcı etkileşimleri, tarayıcı history'sini kirletmeden aşağıdaki standartlaştırılmış veri şemasıyla ölçümleme sunucusuna push edilir:
|
|
2106
|
+
|
|
2107
|
+
#### A. Modal Açılış Event'i (`modal_open`)
|
|
2108
|
+
```json
|
|
2109
|
+
{
|
|
2110
|
+
"event": "modal_open",
|
|
2111
|
+
"timestamp": "2026-05-26T20:15:00Z",
|
|
2112
|
+
"payload": {
|
|
2113
|
+
"modal_type": "report-new | track | announcement | idea | profile | about | faq | privacy | kvkk",
|
|
2114
|
+
"tracking_code": "KENT-34-ABC12345", // yalnızca track ise, aksi halde null
|
|
2115
|
+
"source": "header_button | map_pin_click | footer_link | direct_link"
|
|
2116
|
+
}
|
|
2117
|
+
}
|
|
2118
|
+
```
|
|
2119
|
+
|
|
2120
|
+
#### B. Rapor Başarı Gönderim Event'i (`report_submit_success`)
|
|
2121
|
+
```json
|
|
2122
|
+
{
|
|
2123
|
+
"event": "report_submit_success",
|
|
2124
|
+
"timestamp": "2026-05-26T20:15:00Z",
|
|
2125
|
+
"payload": {
|
|
2126
|
+
"category_id": "uuid",
|
|
2127
|
+
"is_anonymous": true,
|
|
2128
|
+
"has_photo": true,
|
|
2129
|
+
"geofence_distance_m": 12.4
|
|
2130
|
+
}
|
|
2131
|
+
}
|
|
2132
|
+
```
|
|
2133
|
+
|
|
2134
|
+
#### C. Fikir Oy Verme Event'i (`idea_vote_submitted`)
|
|
2135
|
+
```json
|
|
2136
|
+
{
|
|
2137
|
+
"event": "idea_vote_submitted",
|
|
2138
|
+
"timestamp": "2026-05-26T20:15:00Z",
|
|
2139
|
+
"payload": {
|
|
2140
|
+
"idea_id": "uuid",
|
|
2141
|
+
"direction": 1 // 1: +1 desteği, -1: olumsuz destek
|
|
2142
|
+
}
|
|
2143
|
+
}
|
|
2144
|
+
```
|
|
2145
|
+
|
|
2146
|
+
#### Ek Event'ler
|
|
2147
|
+
- `duplicate_check_triggered`: Harita üzerinde konum seçildiğinde mükerrer kontrol tetiklendiğinde
|
|
2148
|
+
- `qa_loop_triggered`: Vatandaş 1-2 yıldız verdiğinde QA kuyruğuna düşme olayı tetiklendiğinde
|
|
2149
|
+
|
|
2150
|
+
**Sonuç:** Bu sayfa yapısı, operasyonel işlemler ve görsel standartlar KENTİM platformunun tüm bileşenlerinde tam performansla çalışmaktadır. Bilinen hiçbir eksiklik bulunmamaktadır.
|