Kaynak:
docs/knowledge-base/security/authorization.md— KB-docs. Parola/hash algoritma ayrıntıları burada özetlenir; değer taşınmaz.
Yetkilendirme (Authorization) — ERPPRO / ERPGOLD V2
Kapsam: Kullanıcı grubu bayrakları (
Sistem.UserGroup.Permission), menü (Ribbon) izinleri, işlem ekranı (iScreen) buton görünürlükleri, şube/kasa/şirket kapsamı ve özel durumlar (GroupId=1, UserId=1, IsResmi, Provizyon, PIN gereken işlemler). Gerçeklik türü: AS-IMPLEMENTED. Etiketler: VERIFIED / INFERRED / UNKNOWN. Kimlik doğrulama →security/authentication.md; ayar enum'ları →architecture/configuration.md.
1. Yetki modeli özeti — VERIFIED
Sistem.Users ──< Sistem.UserDetails (UserId, SubeId, KasaId, GroupId, IsLocked) >── Sistem.UserGroup (Permission)
│
Sistem.GetUsers(@SirketId) (TVF) → AIO.Sistem.LoginUser
└─ .Group = New AIO.Sistem.Usergroup(GroupId)
└─ LoadPermission(Permission) → 23 Boolean + MenuPermisson listesi
- Yetki şube bazlıdır: aynı kullanıcı farklı şubelerde farklı gruba/kasaya bağlanabilir (
UserDetailssatırı başına). Kaynak:kb_src/db/columns.json(Sistem.UserDetails),Class/Ext/Sistem.LoginUser.vb:22-37. - Grup nesnesi girişte bir kez yüklenir ve
LoginInformation.User.Groupüzerinden süreç boyunca kullanılır; grup izinleri değişince kullanıcı yeniden giriş yapmalıdır (INFERRED: yeniden yükleme çağrısı yok; yalnız şube değişimindeLogintekrar çalışır → FrmMainForm.vb:41). - Denetim istemci tarafındadır: bayraklar buton görünürlüğü/enabled ve mesaj kutuları ile uygulanır; DB tarafında (tetikleyici/proc) kullanıcı grubu kontrolü yoktur — VERIFIED:
kb_src/db/modules_all.jsoniçinde 12 tetikleyiciden hiçbiriUserGroup/Permissionokumaz; yalnızCari.HesapUpdate"Yetkiniz yoktur!" RAISERROR'u vardır (koşulu UNKNOWN, bu dokümanda incelenmedi).
2. Permission alanı: kodlama ve çözme — VERIFIED
2.1 Yazma (FrmAddUserGroup.GetToCode, Form/Users/FrmAddUserGroup.vb:78-121)
- 23 onay kutusu
True/Falsemetinleri;ile birleştirilir, sonuna|eklenir (:80-103). Sıra: Takoz; Maden; Hurda; Nakit; Cevir; Vadeli; Hizmet; Tas; Pirlanta; Model; Genel; IslemDuzelt; IslemIptal; Kod; Borc; Virman; Fatura; Emtia; SeriIslem(PesinKontrol); Cesni; Parite; TicketStatus; Bakiye(ShowBalance). - Griddeki her görünür işaretli menü öğesi için
Ceng(Page;Group;Item)|eklenir (:104-111).CengTürkçe karakterleri ASCII'ye çevirir (ığüşöçĞÜŞİÖÇ → igusocGUSIOC, Class/Module/Extention.vb:237-244). - Sonuç dizenin her karakteri
Asc(c).ToString("000")ile 3 haneli ASCII koda çevrilir (:117-120). Örnek:"True;"→084114117101059. Bu bir kodlamadır, şifreleme değildir (INFERRED: tersine çevrilebilir, gizlilik sağlamaz). Usergroup.Permission = GetToCode(); Save()(:143-154) →Sistem.UserGroupINSERT/UPDATE parametreli (Sistem.Usergroup.vb:273, 307).
2.2 Okuma (Usergroup.LoadPermission, Class/Dao/Sistem.Usergroup.vb:54-113)
- 3'er karakter →
Chr(Val(…))ile geri çevrilir (:61-68),|ile bölünür (:69). - İlk parça
;ile bölünüpPer1.Length >= nkontrolleriyle 23 bayrağa atanır (:71-96) — eski (daha kısa) kayıtlarla geriye uyumlu: eksik bayraklarFalsekalır. - Sonraki parçalar
Page;Group;Itemüçlüsü olarakMenuPermissonlistesine eklenir (:97-104). - Tüm blok
Try/Catchiçinde, catch boş (:108-110) → bozuk kayıt sessizce "yetkisiz" sonucu verir (INFERRED). Permissionboşsa ("") hiçbir bayrak yüklenmez (:55) — ancakNULLiseMe.Permissionatanmaz veLoadPermission(Nothing)çağrısıAscData = ""karşılaştırmasında True döner (VB'de Nothing = "" True) → aynı sonuç.
2.3 Tablo — 23 bayrak
| İndeks | Bayrak (Usergroup özelliği) | Ekran kutusu (FrmAddUserGroup) | Ne açar | Kaynak (uygulama noktası) |
|---|---|---|---|---|
| 0 | Takoz |
ChkTakoz | iScreen: BtnTakozGiris (Provizyon değilse), BtnTakozCikis; kayıt çift tık ile TAKOZ giriş/çıkış ve ÇEŞNİ işlem açma |
iScreen.vb:47-48, 652-654, 705 (Cesni yerine Takoz bayrağı kontrol ediliyor — VERIFIED tutarsızlık) |
| 1 | Maden |
ChkMaden | BtnMaden, BtnTeslimat; MADEN işlem açma; ParakendeSatis'te CmbIslem.Items(1) |
iScreen.vb:50, 56, 657; ParakendeSatis.vb:58 |
| 2 | Hurda |
ChkHurda | BtnHurda; HURDA açma |
iScreen.vb:51, 663 |
| 3 | Nakit |
ChkNakit | BtnNakit; NAKIT açma |
iScreen.vb:52, 669 |
| 4 | Cevir |
ChkCevir | BtnCevir; CEVIR açma |
iScreen.vb:53, 675 |
| 5 | Vadeli |
ChkVadeli | BtnVadeli; VADELI açma |
iScreen.vb:54, 687 |
| 6 | Hizmet |
ChkHizmet | BtnHizmet; HIZMET açma |
iScreen.vb:55, 681 |
| 7 | Tas |
ChkTas | BtnTas (Provizyon değilse); TAS açma |
iScreen.vb:57, 693 |
| 8 | Pirlanta |
ChkPirlanta | BtnPirlanta (Provizyon değilse); PIRLANTA açma |
iScreen.vb:58, 695 |
| 9 | Model |
ChkModel | BtnModel (Provizyon değilse); MODEL açma |
iScreen.vb:59, 697 |
| 10 | Genel |
ChkGenel | BtnGenel (Provizyon değilse); GENEL açma |
iScreen.vb:60, 699 |
| 11 | IslemDuzelt |
ChkIslemDuzelt | BtnDuzelt görünürlüğü; düzeltmede "İşlem Düzeltme Yetkiniz Yok."; DynamicList BtnKayıtDuzelt |
iScreen.vb:67, 279, 594-597, 1196; DynamicList.vb:63 |
| 12 | IslemIptal |
ChkIslemIptal | BtnIptal, BtnIptalFisNo görünürlüğü; iptalde "İşlem İptal Etme Yetkiniz Yok."; FrmTransfer BtnIptal; GiseEkrani iptal; DynamicList BtnKayitSil |
iScreen.vb:68, 280, 730-733, 1197-1198; FrmTransfer.vb:48; GiseEkrani.vb:600; DynamicList.vb:62 |
| 13 | KodTanimlama |
ChkKod | DbCombo içinde Insert tuşu ile yeni kod (DbCombo öğesi) ekleme |
Controls/Editor/DbCombo.vb:184 |
| 14 | BorcIslemleri |
ChkBorc | BtnBorcIslem (Provizyon değilse); BORC açma; FrmPozisyonDurum "KZ" kolonu |
iScreen.vb:66, 701; FrmPozisyonDurum.vb:22 |
| 15 | VirmanIslemleri |
ChkVirman | BtnVirman, BtnVirman1 (Provizyon değilse) |
iScreen.vb:62-63 |
| 16 | FaturaIslemleri |
ChkFatura | BtnFatura (Provizyon değilse) |
iScreen.vb:61 |
| 17 | EmtiaIslemleri |
ChkEmtia | BtnEmtia (Provizyon değilse); EMTIA açma |
iScreen.vb:65, 703 |
| 18 | PesinKontrol |
ChkSeriIslem | "Peşin işlem kontrolü": fiş yazdırmadan önce Cari.Islem.GetFisTutar(UserId, FisNo) <> 0 ise "İşlemin Karşılığı Bulunamadı…" ve yazdırma iptal; ilgili işlem bayrağı yoksa kayıt çift tıkta SERIISLEM ekranı açılır |
iScreen.vb:98-104, 659-689; FrmSeriIslem.vb:227-232 |
| 19 | Cesni |
ChkCesni | BtnCesni görünürlüğü |
iScreen.vb:49 (açma tarafında kullanılmıyor, bkz. indeks 0) |
| 20 | Parite |
ChkParite | BtnParite |
iScreen.vb:64 |
| 21 | TicketStatus |
ChkTicketStatus | Takvim görevlerinde başkasının görevini düzenleme / ChkAktif (aktif-pasif) değiştirme |
Controls/Takvim/Class/ShowTicket.vb:46-48 |
| 22 | ShowBalance |
ChkBakiye | iScreen bakiye gridi (GrdBakiye); sipariş ekranlarında Fiyat/Tutar/Birim kolonları |
iScreen.vb:10; FrmSiparisGirisi.vb:59-63; FrmSipModelEkle.vb:250 |
Bulgular (VERIFIED):
- FrmAddUserGroup.FormDataBind (:9-48) mevcut grubu yüklerken ChkTicketStatus atanmaz (grep: yalnız :102'de yazılır). INFERRED: grup her düzenlenip kaydedildiğinde TicketStatus kutunun varsayılan (işaretsiz) değerine döner.
- iScreen.vb:705: tIslemKodu.CESNI için Group.Takoz kontrol edilir, Group.Cesni değil.
- iScreen.vb:1196-1198 (VwIslem.RowCountChanged): BtnIptalFisNo görünürlüğü IslemIptal'e göre yeniden atanır; InitPermission (:46) ise Program.IsResmi'ye göre atar → satır sayısı değişince IsResmi koşulu ezilir (INFERRED çelişki).
3. Menü (Ribbon) izinleri — VERIFIED
Kaynak: Class/Dao/Sistem.Usergroup.vb:125-162 (CreateMenu), :115-124 (FindByMenuName), :163-192 (MenuPermission); çağrı: Program.Init → LoginInformation.User.Group.CreateMenu() (Program.vb:229).
- Her
RibbonPage → RibbonPageGroup → BarButtonItemLinkiçin anahtarCeng(Sayfa) ; Ceng(Grup) ; Ceng(Başlık)üretilir (:129). - Öğe görünür olur eğer: anahtar
MenuPermissonlistesinde varsa veya grup adı"GrpInfo"ise veyaProgram.UserId = 1ise (:130-134). Aksi haldeitm.Visible = False. - Boş kalan gruplar ve sayfalar gizlenir (:139-156).
- Hata olursa "Kullanıcı Grup Yetkileri Alınamadı… Lütfen Tekrar Giriş Yapmayı Deneyiniz." +
End(:157-160). FrmMainForm.MenuClickyalnızLinks(0).Visible = Trueolan öğelerdeItemClickyükseltir (FrmMainForm.vb:53-56) → gizli öğe kısayolla da çalışmaz (INFERRED).- Eşleşme ekran metnine (sayfa/grup/başlık) dayanır: bir menü başlığı değişirse tüm gruplarda o izin kaybolur (INFERRED risk). İzin listesi
FrmAddUserGroup.GetItems(:50-70) tarafındanGrpInfohariç canlı Ribbon'dan üretilir. - Dinamik (AifaDeveloper/
UiDesigner.PopulatePage) ribbon öğeleriCreateMenu'den önce eklendiğinden (Program.vb:213 → :229) aynı görünürlük kuralına tabidir (INFERRED). - Program.UserId <> 1 istisnası:
Sistem.Users.Id = 1olan kullanıcı tüm menüleri görür (Usergroup.vb:131).FrmMainForm.vb:706:User.Id = 1+ Shift+D ileBtnDevirgörünür.
4. Kapsam: şirket / şube / kasa — VERIFIED
| Kapsam | Nasıl belirlenir | Kaynak |
|---|---|---|
| Şirket | Giriş ekranında CmbSirket (Sistem.Sirketler); Program.SirketId = LoginInformation.Sirket.Id |
FrmLoginForm.vb:50-55; Program.vb:121-129 |
| Şube | Sistem.GetUsers(SirketId) Where UserId → kullanıcının UserDetails satırları; giriş sonrası FrmMainForm.CmbSube (CmbActiveSube repository, Sistem.getusers(SirketId) Where UserId) ile geçiş; geçişte LoginInformation.Login(YeniSube, …) ve Program.Init() yeniden çalışır |
FrmLoginForm.vb:97; Program.vb:234-238; FrmMainForm.vb:35-52 |
| Kasa | UserDetails.KasaId → LoginInformation.Kasa; Program.KasaId; IsLocked=True ise işlem ekranlarında kasa/şube seçim kutusu kilitli (kullanıcı yalnız kendi kasasında işlem yapar) |
Login.vb:25; Program.vb:139-147; iHesapControl.vb:71, FrmOdemeGirisi.vb:6, FrmTransferEkle.vb:7, Mutabakat.vb:6, MutabakatOnay.vb:16, HizliSatisEkrani.vb:23, ParakendeSatis.vb:70, DataStokList.vb:171, FrmOdemeListesi.vb:8 |
| Veri filtreleme | Sorgular Program.SubeId/KasaId/SirketId ile string birleştirilerek filtrelenir (ör. FrmMainForm "CESNISTOKLARI", "IZINLISTESI") |
FrmMainForm.vb:204-207 vb. |
Not (VERIFIED): LoginUser.New Sistem.GetUsers(0) kullanır — SirketId filtresi yoktur; UserId + SubeId çifti belirleyicidir.
5. Özel durumlar
5.1 GroupId = 1 — VERIFIED
iScreen.Init:BtnIslemAktar.Visible = (LoginInformation.User.GroupId = 1)(iScreen.vb:35); tıklamada tekrar kontrol edilipFrmHesapTemizle(HesapId)açılır (:1179-1187). INFERRED: GroupId=1 "yönetici grubu" varsayımıdır;Sistem.SirketOlusturyeni şirkette Id=1 grubunu ve Id=1 kullanıcısını oluşturur (modules_all.json, satır 34-35).- Başka
GroupId = 1kontrolü yok (grep).
5.2 Program.IsResmi (Sube.IsResmi) — VERIFIED
iScreen.InitPermission:BtnIptalFisNoyalnız resmi şubede görünür (:46); tıklamada sabit yönetici parolası istenir veCari.IslemlerIsDeleted='True'yapılır (:720-727; parola → authentication.md §6).FrmMainForm.FormInit:RbSeriIslem.Visible = Sube.IsResmi(Seri işlem ribbon sayfası) (:11).Program.IsResmiyorumu: "Doviz programı olarak çalışıyorsa Maden Satış işleminde İşçilik hanesinin gelmesini sağlar" (Program.vb:56-61).ResmiIslemLimitiTL(Program.vb:62-66) — kullanım yeri bu dokümanda incelenmedi (UNKNOWN).ShadowMode(Sube.SubeTipi="DOVIZ") kullanıcının kendi parolasıyla açılır/kapanır ve DB'ye yazılır (Program.vb:31-55) → application-flow.md §2.9.
5.3 Provizyon modu (GlobalSettings.Provizyon = True ve karşı hesap tanımlı) — VERIFIED
iScreen.IsProvizyon = (GlobalSettings.Provizyon And CmbHesap.KarsiHesapId <> 0) (iScreen.vb:37-41). Bu durumda gizlenen butonlar (bayrak True olsa bile): BtnTakozGiris, BtnTas, BtnPirlanta, BtnModel, BtnGenel, BtnFatura, BtnVirman, BtnVirman1, BtnEmtia, BtnBorcIslem (:47, 57-63, 65-66). Görünür kalanlar: TakozCikis, Cesni, Maden, Hurda, Nakit, Cevir, Vadeli, Hizmet, Teslimat, Parite, Duzelt, Iptal. İptalde ayrıca AIO.Cari.Provizyon.IsAllow(Id) kontrolü: "Önce Gönderen Şube İptal Etmelidir." (:736-739). iFormBase.IsProvizyon aynı kural (iFormBase.vb:55).
5.4 Düzeltme / iptal / mutabakat kilitleri (GlobalSettings) — VERIFIED
Kaynak: iScreen.vb:622-645 (düzelt), :745-765 (iptal); enum'lar Form/Settings/Settings.vb:65-90.
| Ayar | Enum | Davranış |
|---|---|---|
| DuzeltmeOnayi → ModifyPermission | tPermission: SilmeYapilir=0, EskiTariheYapilamaz=1, PinGerekli=2 | PinGerekli ve işlem DuzeltmeGun günden eskiyse PinShowDialog; EskiTariheYapilamaz ve eskiyse "İşlemi Düzeltmezsiniz." |
| SilmeOnayi → DeletePermission | tPermission | PinGerekli ise her iptalde PIN; EskiTariheYapilamaz ve SilGun'den eskiyse "Yöneticiniz İptal Edebilir." |
| MutabakatLock → MutabakatPermission | tPermissionV1: IslemYapilir=0, PinGerekli=1, IslemYapilamaz=2 | Hesabın LastMutabikId >= Id ise: IslemYapilamaz → engel; PinGerekli → PIN (sonraki PIN atlanır, SkipPin) |
Not: iScreen.vb:641'deki koşul ModifyPermission = tPermission.EskiTariheYapilamaz = tPermission.EskiTariheYapilamaz biçiminde yazılmıştır (çift eşitlik) — VB'de (a = b) = b olarak değerlendirilir; INFERRED: EskiTariheYapilamaz(=1) için True = 1 karşılaştırması True döner, SilmeYapilir(=0) için False = 1… davranışı belirsiz; UNKNOWN (test edilmedi).
5.5 PesinKontrol (ChkSeriIslem) — VERIFIED
Bayrak açık olan gruplarda, fiş basılmadan önce AIO.Cari.Islem.GetFisTutar(Program.UserId, FisNo) sıfırdan farklıysa ("işlemin karşılığı girilmemiş") yazdırma engellenir (iScreen.vb:98-104, FrmSeriIslem.vb:227-232). Ayrıca kullanıcının ilgili işlem türü bayrağı yoksa kayıt çift tıkta SERIISLEM ekranı açılır (iScreen.vb:659-689). INFERRED: "peşin/seri işlem" operatörleri için kısıtlı bir çalışma modu.
5.6 ShowBalance ve TicketStatus — VERIFIED
ShowBalance=False: işlem ekranında bakiye gridi gizli (iScreen.vb:10); sipariş ekranlarındaFiyat/Tutar/Birimkolonları kaldırılır (FrmSiparisGirisi.vb:59-63; FrmSipModelEkle.vb:250).TicketStatus=True: başka kullanıcının takvim görevini düzenleyebilir veChkAktifalanını değiştirebilir (ShowTicket.vb:46-48).
5.7 Yetki ekranı (Form/Users/FrmAddUserGroup.vb) — VERIFIED
"KULLANICIGRUPLARI"menüsü →DataGridList.Show(Of AIO.Sistem.Usergroup)(FrmMainForm.vb:283-284); düzenleme formuFrmAddUserGroup.FormInit→GetItems()canlı Ribbon'dan menü listesi (Page/Group/Item/Visible) üretir (:50-70);BtnTumunuSectüm menüleri işaretler (:156-160);FormSave→GetToCode()+Usergroup.Save()(:143-154).SirketId = Program.SirketIdolarak yazılır (:147).- Grup düzenleme yetkisi: menü görünürlüğüne bağlı (ayrı bir bayrak yok) — INFERRED.
6. Kanıt listesi
ERPPRO/Class/Dao/Sistem.Usergroup.vb:29-50 (New), 54-113 (LoadPermission), 115-124 (FindByMenuName), 125-162 (CreateMenu), 163-192 (MenuPermission), 228-253 (özellikler), 271-337 (Insert/Update)ERPPRO/Form/Users/FrmAddUserGroup.vb:4-48, 50-70, 78-121, 123-141, 143-160ERPPRO/Class/Module/Extention.vb:237-244 (Ceng)ERPPRO/Controls/Islem Ekranı/Base Control/iScreen.vb:4-17, 24-41, 43-89, 96-104, 279-280, 594-645, 650-706, 720-765, 1179-1187, 1194-1198ERPPRO/Controls/Islem Ekranı/Ekran/iFormBase.vb:55;…/Ekran/FrmTransfer.vb:48;…/Ekran/ParakendeSatis.vb:58, 70, 469-476;…/Ekran/SeriIslemEkrani/FrmSeriIslem.vb:227-232;…/Parakende/GiseEkrani.vb:600-604;…/Parakende/HizliSatisEkrani.vb:23;…/Base Control/iHesapControl.vb:71ERPPRO/Controls/Editor/DbCombo.vb:184;ERPPRO/Class/Dao/Dynamic/Controls/DynamicList.vb:62-63;ERPPRO/Controls/Takvim/Class/ShowTicket.vb:46-48;ERPPRO/Controls/Grid/DataStokList.vb:171ERPPRO/Form/Siparis/FrmSiparisGirisi.vb:59-63;ERPPRO/Form/Siparis/FrmSipModelEkle.vb:250;ERPPRO/Form/RefreshGrid/FrmPozisyonDurum.vb:22;ERPPRO/Form/Tanımlamalar/Stok/Mutabakat.vb:6,MutabakatOnay.vb:16ERPPRO/Form/Genel/FrmMainForm.vb:8-29, 35-56, 283-284, 705-717ERPPRO/Class/Module/Program.vb:31-66, 121-165, 213, 229, 234-238ERPPRO/Class/Module/Login.vb:19-44;ERPPRO/Class/Ext/Sistem.LoginUser.vb:22-37ERPPRO/Form/Settings/Settings.vb:65-90ERPPRO/Class/Ext/Cari.Provizyon.vb:323-327- DB:
Sistem.GetUsers(IF),Sistem.SirketOlustur(P, satır 34-35), tetikleyici listesi —kb_src/db/modules_all.json;Sistem.UserGroup/UserDetailskolonları —kb_src/db/columns.json
7. Bilinmeyenler (UNKNOWN)
Cari.HesapUpdatetetikleyicisindeki "Yetkiniz yoktur!" RAISERROR koşulu (hangi alan/kullanıcı) — incelenmedi.AIO.Cari.Provizyon.IsAllow(Id)kuralının tam içeriği.Program.ResmiIslemLimitiTLveSube.IsLimitControlalanlarının hangi ekranlarda uygulandığı.FrmHesapTemizle(BtnIslemAktar) işleminin veri etkisi.iScreen.vb:641çift eşitlik koşulunun çalışma zamanı davranışı.- Rapor/tasarımcı ekranlarında (ReportManager, DashBoardDesigner, RibbonDesigner, SQLEDITOR) menü görünürlüğü dışında ek bir yetki kontrolü olup olmadığı — grep'te
Group.kullanımı görülmedi (INFERRED: yok), tek tek doğrulanmadı. AifaDev.Formsdinamik formlarındaki yetki modeli (CodeDesigner projesi) — incelenmedi.
