diff --git a/.github/instructions/lowcode.instructions.md b/.github/instructions/lowcode.instructions.md index 1d769258..c356acb1 100644 --- a/.github/instructions/lowcode.instructions.md +++ b/.github/instructions/lowcode.instructions.md @@ -1766,7 +1766,8 @@ aday olur ve iki koşulla seçilebilir — kapsamdaki `{sql|postgres}/object/{Ta `CREATE TABLE` scriptidir (platform tabloları bu klasörde durmaz; scriptsiz tablo `NotManaged`) ve tabloyu başka bir ekran (sorgu/C/U/D komutu ya da bu ekranı alt form olarak kullanan üst ekran), Custom Endpoint SQL'i ya da custom component veri kaynağı kullanmaz (`InUse`). Kullanıcı onay -diyaloğunda tabloyu seçerse (`WizardDeleteInput.DropTables`) kayıt temizliğinden **sonra** +diyaloğunda tabloyu seçerse (`WizardDeleteInput.DropTables`; birden çok seçilebilir tablo varsa +başlıktaki **Tümünü seç** hepsini işaretler) kayıt temizliğinden **sonra** `DROP TABLE` çalışır, ardından tablonun CRUD endpoint'leri ve seed dosyaları (`{sql|postgres}/object/{Tablo}.sql`, `crud/{Tablo}.json`) silinir. Düşürme hatası (ör. yabancı anahtar) silmeyi durdurmaz: tablo ve scripti yerinde kalır, rapor `Failed` + mesaj gösterir. diff --git a/configs/seeds/host/data/App.DevRequests/31f9867d-f243-4e29-9819-bcd9dee19d5a.json b/configs/seeds/host/data/App.DevRequests/31f9867d-f243-4e29-9819-bcd9dee19d5a.json index dfb63b80..24cb5224 100644 --- a/configs/seeds/host/data/App.DevRequests/31f9867d-f243-4e29-9819-bcd9dee19d5a.json +++ b/configs/seeds/host/data/App.DevRequests/31f9867d-f243-4e29-9819-bcd9dee19d5a.json @@ -18,7 +18,7 @@ "Priority": null, "Completed": true, "SortOrder": 0, - "Timesheets": "[{\"id\":\"b0877f68-e287-6a71-ee2e-3a2403820cf5\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_Doctor tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"f2dc9019-5288-2d82-f9f7-3a2403828035\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Doctor.json wizard\\u0027\\u0131 deploy edildi (1 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"c554eecc-b9af-3152-70f2-3a240382925d\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_Certificate tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"29a2829f-e1a5-8ca6-5f78-3a240382dd1d\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Certificate.json wizard\\u0027\\u0131 deploy edildi (16 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"5bdece23-8a14-d008-4128-3a24038341a7\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_Hospital tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"cf4e73e7-e879-529f-5110-3a240383bec6\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hospital.json wizard\\u0027\\u0131 deploy edildi (45 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"ee05f153-cea5-71f7-1f9a-3a240383cdc4\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_HospitalDepartment tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"520a8e77-e28f-71e9-7bf3-3a2403842ca9\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"HospitalDepartment.json wizard\\u0027\\u0131 deploy edildi (31 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"b24ad81f-1406-6b3f-6abd-3a2403843c21\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_DocumentType tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"24faa132-3d57-03ab-6397-3a240384d3a2\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"DocumentType.json wizard\\u0027\\u0131 deploy edildi (48 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"3d4f555a-a723-418a-d3d0-3a240384e6f8\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"10 tamamlanm\\u0131\\u015F alt g\\u00F6rev eklendi\",\"duration\":0.0167},{\"id\":\"c461de20-dc4b-72c4-c29c-3a2403852945\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Analize \\u00FCretim notu eklendi\",\"duration\":0.0167},{\"id\":\"17a0bb99-9fc2-e1ef-f94e-3a2403854b2e\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"App.DevRequests ekran\\u0131nda sat\\u0131r g\\u00FCncellendi (Status)\",\"duration\":0.0167}]", + "Timesheets": "[{\"id\":\"b0877f68-e287-6a71-ee2e-3a2403820cf5\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_Doctor tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"f2dc9019-5288-2d82-f9f7-3a2403828035\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Doctor.json wizard\\u0027\\u0131 deploy edildi (1 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"c554eecc-b9af-3152-70f2-3a240382925d\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_Certificate tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"29a2829f-e1a5-8ca6-5f78-3a240382dd1d\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Certificate.json wizard\\u0027\\u0131 deploy edildi (16 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"5bdece23-8a14-d008-4128-3a24038341a7\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_Hospital tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"cf4e73e7-e879-529f-5110-3a240383bec6\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hospital.json wizard\\u0027\\u0131 deploy edildi (45 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"ee05f153-cea5-71f7-1f9a-3a240383cdc4\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_HospitalDepartment tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"520a8e77-e28f-71e9-7bf3-3a2403842ca9\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"HospitalDepartment.json wizard\\u0027\\u0131 deploy edildi (31 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"b24ad81f-1406-6b3f-6abd-3a2403843c21\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Hr_T_DocumentType tablosu olu\\u015Fturuldu\",\"duration\":0.0167},{\"id\":\"24faa132-3d57-03ab-6397-3a240384d3a2\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"DocumentType.json wizard\\u0027\\u0131 deploy edildi (48 demo sat\\u0131r)\",\"duration\":0.0167},{\"id\":\"3d4f555a-a723-418a-d3d0-3a240384e6f8\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"10 tamamlanm\\u0131\\u015F alt g\\u00F6rev eklendi\",\"duration\":0.0167},{\"id\":\"c461de20-dc4b-72c4-c29c-3a2403852945\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"Analize \\u00FCretim notu eklendi\",\"duration\":0.0167},{\"id\":\"17a0bb99-9fc2-e1ef-f94e-3a2403854b2e\",\"date\":\"2026-09-30\",\"userName\":\"system@sozsoft.com\",\"description\":\"App.DevRequests ekran\\u0131nda sat\\u0131r g\\u00FCncellendi (Status)\",\"duration\":0.0167},{\"id\":\"a1defc25-7594-3a9a-cb07-3a2406a03b80\",\"date\":\"2026-10-01\",\"userName\":\"system@sozsoft.com\",\"description\":\"Talep analiz edildi\",\"duration\":0.0333}]", "SubTasks": "[{\"id\":\"8ec8d59b-2dee-b142-e656-3a240384e6e3\",\"title\":\"create_table: Hr_T_Doctor\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"1a95dfc3-0b5c-5e04-53c4-3a240384e6e3\",\"title\":\"deploy_wizard: Doctor.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"adb1a974-5df2-87e3-d144-3a240384e6e3\",\"title\":\"create_table: Hr_T_Certificate\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"a0bcc99d-766d-ea7a-df0d-3a240384e6e3\",\"title\":\"deploy_wizard: Certificate.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"479cc491-407a-d6ea-7b5c-3a240384e6e3\",\"title\":\"create_table: Hr_T_Hospital\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"44c91f37-c4f0-9d8a-5bed-3a240384e6e3\",\"title\":\"deploy_wizard: Hospital.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"a4bc6a6d-1fc6-1e1c-af69-3a240384e6e3\",\"title\":\"create_table: Hr_T_HospitalDepartment\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"db359bee-ce61-9cd0-f1e8-3a240384e6e3\",\"title\":\"deploy_wizard: HospitalDepartment.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"36ece9eb-28d9-8614-d8e3-3a240384e6e3\",\"title\":\"create_table: Hr_T_DocumentType\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true},{\"id\":\"c3337738-46c6-951f-5343-3a240384e6e3\",\"title\":\"deploy_wizard: DocumentType.json\",\"assignee\":\"system@sozsoft.com\",\"dueDate\":\"2026-09-30\",\"completed\":true}]", "Analysis": "
Amaç
İK modülünün Tanımlamalar menüsüne, personel sağlık ve özlük süreçlerinde seçim kaynağı olarak kullanılacak beş tanım listesi eklenir: Kurum Doktorları, Yeterlilik Belgeleri, Hastaneler, Hastane Bölümleri ve Evrak Türleri. Kullanıcı İK ekibidir.
Görsel analizi
Çözüm yolu
Her ekran Wizard List (ComponentKind 0) ile üretilir: kayıt listesi, ekle/düzenle/sil, filtre ve arama. Her ekranın arkasında yeni bir tablo durur. Serbest yerleşim ihtiyacı yok.
Menü yeri
İnsan Kaynakları › Tanımlamalar › {Ekran}
Seviye | Kod | Ad (TR / EN) | İkon | Durum |
Kök | App.Hr | İnsan Kaynakları / Human Resources | FcConferenceCall | Var |
Ara | App.Hr.Definitions | Tanımlamalar / Definitions | FcFilingCabinet | Var |
Ekran | App.Hr.Doctor | Kurum Doktorları / Company Doctors | FcPortraitMode | Yeni |
Ekran | App.Hr.Certificate | Yeterlilik Belgeleri / Qualification Certificates | FcDiploma2 | Yeni |
Ekran | App.Hr.Hospital | Hastaneler / Hospitals | FcOrganization | Yeni |
Ekran | App.Hr.HospitalDepartment | Hastane Bölümleri / Hospital Departments | FcList | Yeni |
Ekran | App.Hr.DocumentType | Evrak Türleri / Document Types | FcDocument | Yeni |
ModuleId: Hr · İzin grubu: App.Hr (var) · MenuParentCode: App.Hr.Definitions, MenuParentPath: App.Hr · Route: /admin/list/{ListFormCode}. Ekranlar arasında lookup bağımlılığı yok; menüde talepteki sırayla, var olan Yetenek Tipleri, Departmanlar ve Pozisyonlar ekranlarının ardından yer alırlar.
Veri modeli
Beş tablo da yenidir. Her birinde Multi-Tenant ve Full Audited kolon setleri bulunur (Id uniqueidentifier PK, TenantId, audit kolonları). Kapsam IsTenant = true, IsBranch = false.
Hr_T_Doctor — Tanım tablosu: Evet. Tanımlamalar menüsünde duruyor ve sağlık kayıtlarına doktor seçim kaynağı olacak.
Kolon | Tip | Zorunlu | Başlık |
FullName | nvarchar(200) | Evet | Doktor Adı Soyadı |
DiplomaNo | nvarchar(50) | Hayır | Diploma No |
DiplomaDate | date | Hayır | Diploma Tarihi |
OhsCertificateNo | nvarchar(50) | Hayır | İşyeri Hekimi Belge No |
OhsCertificateDate | date | Hayır | İşyeri Hekimi Belge Tarihi |
IdentityNo | nvarchar(11) | Hayır | T.C. Kimlik No |
IsActive | bit, varsayılan 1 | Evet | Aktif |
Hr_T_Certificate — Tanım tablosu: Evet. Belge listesi personel yeterlilik kayıtlarının seçim kaynağıdır.
Kolon | Tip | Zorunlu | Başlık |
Name | nvarchar(200) | Evet | Belge Adı |
IsActive | bit, varsayılan 1 | Evet | Aktif |
Hr_T_Hospital — Tanım tablosu: Evet. Sağlık raporu ve muayene kayıtlarında kurum seçim kaynağıdır.
Kolon | Tip | Zorunlu | Başlık |
Name | nvarchar(250) | Evet | Kurum Adı |
IsActive | bit, varsayılan 1 | Evet | Aktif |
Hr_T_HospitalDepartment — Tanım tablosu: Evet. Muayene kayıtlarında bölüm seçim kaynağıdır.
Kolon | Tip | Zorunlu | Başlık |
Name | nvarchar(200) | Evet | Bölüm Adı |
IsActive | bit, varsayılan 1 | Evet | Aktif |
Hr_T_DocumentType — Tanım tablosu: Evet. Personel özlük dosyasına yüklenecek evrakların tür listesidir.
Kolon | Tip | Zorunlu | Başlık |
GroupName | nvarchar(50) | Evet | Dosya Grubu — sabit liste: Genel · Özlük Evrakları · Sağlık |
Name | nvarchar(200) | Evet | Dosya Türü |
IsRequired | bit, varsayılan 0 | Evet | Zorunlu |
IsActive | bit, varsayılan 1 | Evet | Aktif |
Etkilenen kısımlar
Görünümler ve davranış
Kararlar
Üretim planı
Üretime hazır
Evet
Üretilenler (menü: İnsan Kaynakları › Tanımlamalar, izin grubu App.Hr, IsTenant = true, IsBranch = false; görünümler Grid/Card/Pivot/Chart, açılış Grid; form tek grup 2 kolon):
\nApp.Hr.Doctor (Doctor.json): FullName, DiplomaNo, DiplomaDate, OhsCertificateNo, OhsCertificateDate, IdentityNo, IsActive. Demo: 1 satır (Rıza YILMAZ, T.C. Kimlik No boş). Widget: Toplam · Aktif · Pasif.App.Hr.Certificate (Certificate.json): Name, IsActive. Demo: 16 satır. Widget: Toplam · Aktif · Pasif.App.Hr.Hospital (Hospital.json): Name (250), IsActive. Demo: 45 satır. Widget: Toplam · Aktif · Pasif.App.Hr.HospitalDepartment (HospitalDepartment.json): Name, IsActive. Demo: 31 satır. Widget: Toplam · Aktif · Pasif.App.Hr.DocumentType (DocumentType.json): GroupName (dxSelectBox, sabit liste Genel · Özlük Evrakları · Sağlık), Name, IsRequired (dxCheckBox), IsActive. Demo: 48 satır (17 + 16 + 15), hepsi Zorunlu = Hayır. Widget: Toplam · Aktif · Pasif · Zorunlu (ColSpan 3).Yetkiler her ekranda {ListFormCode} + .Create/.Update/.Delete/.Export/.Import/.Note; hiçbir role atanmadı. Yeni dil anahtarları: beş ekran başlığı/menüsü, alan başlıkları (FullName, DiplomaNo, DiplomaDate, OhsCertificateNo, OhsCertificateDate, IdentityNo, GroupName, IsRequired) ve Dosya Grubu değerleri App.Hr.DocumentType.Group.General/Personnel/Health. Tüm demo satırlar IsActive = true.
Varsayılanlar ve sapmalar
\nmask: 00000000000, maxLength 11) uygulandı; alan boş bırakılabilir.DB Migrate bekleyen wizard'lar: Doctor.json, Certificate.json, Hospital.json, HospitalDepartment.json, DocumentType.json.
" } diff --git a/configs/seeds/host/data/App.DevRequests/ce4269ad-8d08-487a-9e36-c002dd482a3c.json b/configs/seeds/host/data/App.DevRequests/ce4269ad-8d08-487a-9e36-c002dd482a3c.json index e0407c4b..ac3b3250 100644 --- a/configs/seeds/host/data/App.DevRequests/ce4269ad-8d08-487a-9e36-c002dd482a3c.json +++ b/configs/seeds/host/data/App.DevRequests/ce4269ad-8d08-487a-9e36-c002dd482a3c.json @@ -11,16 +11,16 @@ "RequestDate": null, "Status": "Backlog", "Title": "Human Resources -> Sağlık", - "Description": "Bu eklenecekler Human Resources -> Sağlık alt menüsünün içerisine eklenecektir. Çalışan (Kullanıcı) ile ilgili tüm bilgileri AbpUsers tablosundan alınabilir. Örneğin Idendity Number, Gender, EducationStatus, BirthDate vs. tüm bilgiler bu tablodan alınabilir. Branch bilgisi eğer kullanıcı birden fazla Branch yetkisi varsa seçmeli, eğer bir branch yetkisi varsa o branch kullanıcı seçildikten sonra otomatik gelmeli.
İstirahat Listesi : Çalışanların istirahat listesi ekranıdır. İstirahat Tipi: Hastalık, İş Kazası, Analık, Meslek Hastalığı gibi seçilebilmelidir.
Muayene Listesi : Çalışanların Muayene Listesidir. Her kullanıcının periyodik veya plansız şekilde yapılan muayene sonuçlarının listesidir.Kullanıcı seçilince Eğitim Durumu, Tc Kimlik No, Doğum Tarihi, Departman gibi bilgiler otomatik gelir.
Hasta Kayıt Defteri: Kullanıcıların hasta olduklarında doldurdukları listedir. Tip sütununda Hastalık, İş Kazası Dönüş, İstirahat Dönüş, Sonuç kısmında Tedavi (Taburcu), Sevk ve İstirahat seçenekleri olmalı. Sevk olaunca Sevk Yeri açılıyor. Kullanıcı seçilince Adres, yaş, cinsiyet gibi bilgiler otomatik gelir. Sıra No sütunu eklenmeyecek.
Bu eklenecekler Human Resources -> Sağlık alt menüsünün içerisine eklenecektir. Çalışan (Kullanıcı) ile ilgili tüm bilgileri AbpUsers tablosundan alınabilir. Örneğin Idendity Number, Gender, EducationStatus, BirthDate vs. tüm bilgiler bu tablodan alınabilir. Branch bilgisi eğer kullanıcı birden fazla Branch yetkisi varsa seçmeli, eğer bir branch yetkisi varsa o branch kullanıcı seçildikten sonra otomatik gelmeli. Lİstelerde Avatar (Kullanıcı Resmi) olmasına gerek yok, eklenmeyecek.
İstirahat Listesi : Çalışanların istirahat listesi ekranıdır. İstirahat Tipi: Hastalık, İş Kazası, Analık, Meslek Hastalığı gibi seçilebilmelidir.
Muayene Listesi : Çalışanların Muayene Listesidir. Her kullanıcının periyodik veya plansız şekilde yapılan muayene sonuçlarının listesidir.Kullanıcı seçilince Eğitim Durumu, Tc Kimlik No, Doğum Tarihi, Departman gibi bilgiler otomatik gelir.
Hasta Kayıt Defteri: Kullanıcıların hasta olduklarında doldurdukları listedir. Tip sütununda Hastalık, İş Kazası Dönüş, İstirahat Dönüş, Sonuç kısmında Tedavi (Taburcu), Sevk ve İstirahat seçenekleri olmalı. Sevk olaunca Sevk Yeri açılıyor. Kullanıcı seçilince Adres, yaş, cinsiyet gibi bilgiler otomatik gelir. Sıra No sütunu eklenmeyecek.
İK / işyeri hekimliği ekibinin çalışanların sağlık süreçlerini tek menüde takip etmesi: istirahat raporları, periyodik/plansız muayene sonuçları ve revire başvuran çalışanların hasta kayıt defteri. Çalışan bilgileri (TC, cinsiyet, doğum tarihi, eğitim, adres, departman, görev) kullanıcı seçilince AbpUsers'tan, şube ise kullanıcının şube yetkilerinden (Sas_T_BranchUsers) otomatik gelir.
Görsellerdeki fotoğraf alanı talep metni gereği (\"Listelerde Avatar olmasına gerek yok, eklenmeyecek\") üretilmez.
\n\nÜç ekran da Wizard List (ComponentKind 0) ile, her biri kendi yeni tablosu üzerinde üretilir: kayıt listesi + popup ekle/düzenle/sil, filtre ve arama. Otomatik dolan çalışan/şube/doktor bilgileri lookup'ların seçili kaydından EditorScript (copy, selected) ile taşınır; hesaplar (Gün, Yaş), şube doğrulaması ve koşullu kilitler de EditorScript ile yapılır.
İnsan Kaynakları › Sağlık › {Ekran}
\n| Seviye | Kod | Ad (TR / EN) | İkon | Durum |
|---|---|---|---|---|
| Kök | App.Hr | İnsan Kaynakları / Human Resources | FcConferenceCall | Var |
| Ara | App.Hr.Health | Sağlık / Health | FcLike | Yeni |
| Ekran | App.Hr.SickLeave | İstirahat Listesi / Sick Leaves | FcPlanner | Yeni |
| Ekran | App.Hr.MedicalExamination | Muayene Listesi / Medical Examinations | FcInspection | Yeni |
| Ekran | App.Hr.PatientRegister | Hasta Kayıt Defteri / Patient Register | FcViewDetails | Yeni |
ModuleId: Hr · İzin grubu: App.Hr (var) · MenuParentCode: App.Hr.Health · MenuParentPath: App.Hr · Route: /admin/list/{ListFormCode}.
Yetki: App.Hr › App.Hr.Health (Yeni) › App.Hr.SickLeave / App.Hr.MedicalExamination / App.Hr.PatientRegister.
Ekranlar arasında lookup bağımlılığı yok (hepsi var olan tanım ekranlarını kullanır); menüde talepteki sırayla yer alırlar.
\n\nÜç tablo da yenidir (önceki üretimin tabloları, wizard'ları ve menüleri kaldırılmış; veritabanında yoklar). Her tabloda Multi-Tenant + Full Audited kolon seti. Kapsam IsTenant = true, IsBranch = false. Kullanıcıdan kopyalanan kolonlar AbpUsers ile aynı ad/tip/boyla açılır: IdentityNumber nvarchar(15), Gender nvarchar(16) (Male/Female), EducationLevel nvarchar(128), HomeAddress nvarchar(512), BirthDate datetime2, DepartmentId/JobPositionId uniqueidentifier. Avatar kolonu hiçbir tabloda açılmaz.
Şube kuralı (üç ekranda ortak): BranchId kullanıcının şube yetkilerinden (Sas_T_BranchUsers, yalnızca aktif ve silinmemiş Sas_T_Branch) belirlenir.
SELECT u.Id AS [Key], u.Name + ' ' + u.Surname AS [Name], {ekranın kopya kolonları}, bc.BranchCount, bc.SingleBranchId FROM AbpUsers u OUTER APPLY (SELECT COUNT(*) AS BranchCount, CASE WHEN COUNT(*) = 1 THEN LOWER(MAX(CAST(bu.BranchId AS nvarchar(36)))) END AS SingleBranchId FROM Sas_T_BranchUsers bu JOIN Sas_T_Branch b ON b.Id = bu.BranchId AND b.IsDeleted = 'false' AND b.IsActive = 'true' WHERE bu.UserId = u.Id) bc WHERE u.IsDeleted = 'false' AND u.IsActive = 'true' AND u.TenantId = '@TENANTID' ORDER BY u.Name, u.SurnameBranchCount = 1 ise BranchId tek şubeyle dolar ve kilitlenir; birden fazlaysa ya da hiç yoksa BranchId boşaltılır ve seçime açılır.SELECT b.Id AS [Key], b.Name AS [Name], (SELECT LOWER(STRING_AGG(CAST(bu.UserId AS nvarchar(36)), ',')) FROM Sas_T_BranchUsers bu WHERE bu.BranchId = b.Id) AS [UserIds] FROM Sas_T_Branch b WHERE b.IsDeleted = 'false' AND b.IsActive = 'true' AND b.TenantId = '@TENANTID' ORDER BY b.NameUserIds listesinde çalışan yoksa \"Seçilen şube bu çalışana tanımlı değil\" uyarısı verilir ve alan boşaltılır. BranchId formda zorunludur.Gösterim lookup'ları: DepartmentId → Hr_T_Department, JobPositionId → Hr_T_JobPosition, DoctorId → Hr_T_Doctor (IsActive), HospitalId/ReferralHospitalId → Hr_T_Hospital (IsActive), HospitalDepartmentId → Hr_T_HospitalDepartment (IsActive); hepsinde IsDeleted = 'false' ve TenantId = '@TENANTID'.
Hr_T_SickLeave — Tanım tablosu: Hayır (çalışan bazlı hareket kaydı).
\n| Kolon | Tip | Zorunlu | Başlık | Not |
|---|---|---|---|---|
| UserId | uniqueidentifier | Evet | Adı Soyadı | kullanıcı lookup'ı |
| BranchId | uniqueidentifier NULL | Evet (form) | Şube Adı | şube kuralı |
| IdentityNumber | nvarchar(15) | Hayır | TC Kimlik No | kopya, salt okunur |
| DepartmentId | uniqueidentifier | Hayır | Departman | kopya, salt okunur |
| StartDate | date | Evet | Başlangıç Tarihi | |
| EndDate | date | Evet | Bitiş Tarihi | |
| DayCount | int | Hayır | Gün | hesap, salt okunur |
| LeaveType | nvarchar(32) | Evet | İstirahat Tipi | sabit liste: Hastalık · İş Kazası · Analık · Meslek Hastalığı; varsayılan Hastalık |
| HospitalId | uniqueidentifier | Hayır | Kurum | Hr_T_Hospital |
| HospitalDepartmentId | uniqueidentifier | Hayır | Bölüm | Hr_T_HospitalDepartment |
| Reason | nvarchar(MAX) | Hayır | İstirahat Sebebi | dxTextArea |
Hr_T_MedicalExamination — Tanım tablosu: Hayır (çalışan bazlı muayene kaydı).
\n| Kolon | Tip | Zorunlu | Başlık | Not |
|---|---|---|---|---|
| UserId | uniqueidentifier | Evet | Adı Soyadı | kullanıcı lookup'ı |
| IdentityNumber | nvarchar(15) | Hayır | TC Kimlik No | kopya, salt okunur |
| ExaminationDate | date | Evet | Muayene Tarihi | açılışta bugün |
| ExaminationType | nvarchar(32) | Evet | Muayene Tipi | sabit liste: Periyodik · Plansız; varsayılan Periyodik |
| EducationLevel | nvarchar(128) | Hayır | Eğitim Durumu | kopya, salt okunur |
| BirthDate | datetime2 | Hayır | Doğum Tarihi | kopya, salt okunur |
| JobPositionId | uniqueidentifier | Hayır | Görevi | kopya, salt okunur |
| DepartmentId | uniqueidentifier | Hayır | Departman | kopya, salt okunur |
| BranchId | uniqueidentifier NULL | Evet (form) | Şube Adı | şube kuralı |
| Examination | nvarchar(MAX) | Hayır | Muayene | dxTextArea |
| Result | nvarchar(MAX) | Hayır | Sonuç | dxTextArea |
| DoctorId | uniqueidentifier | Evet | Doktor | Hr_T_Doctor |
| DiplomaNo | nvarchar(50) | Hayır | Diploma No | doktordan kopya, salt okunur |
| DiplomaDate | date | Hayır | Diploma Tarihi | doktordan kopya, salt okunur |
| OhsCertificateNo | nvarchar(50) | Hayır | İşyeri Hekimi Belge No | doktordan kopya, salt okunur |
| OhsCertificateDate | date | Hayır | İşyeri Hekimi Belge Tarihi | doktordan kopya, salt okunur |
Hr_T_PatientRegister — Tanım tablosu: Hayır (revir başvuru kaydı).
\n| Kolon | Tip | Zorunlu | Başlık | Not |
|---|---|---|---|---|
| UserId | uniqueidentifier | Evet | Adı Soyadı | kullanıcı lookup'ı |
| RegisterDate | date | Evet | Tarih | açılışta bugün |
| HomeAddress | nvarchar(512) | Hayır | Adres | kopya, salt okunur |
| BirthDate | datetime2 | Hayır | Doğum Tarihi | kopya, salt okunur (Yaş hesabının kaynağı) |
| Age | int | Hayır | Yaş | hesap, salt okunur |
| Gender | nvarchar(16) | Hayır | Cinsiyet | kopya, salt okunur; Male/Female, App.StaticLookup.Male/Female |
| BranchId | uniqueidentifier NULL | Evet (form) | Şube Adı | şube kuralı |
| DoctorId | uniqueidentifier | Hayır | Doktor | Hr_T_Doctor |
| RegisterType | nvarchar(32) | Evet | Tip | sabit liste: Hastalık · İş Kazası Dönüş · İstirahat Dönüş; varsayılan Hastalık |
| Result | nvarchar(32) | Evet | Sonuç | sabit liste: Tedavi (Taburcu) · Sevk · İstirahat; varsayılan Tedavi (Taburcu) |
| LeaveDayCount | int | Hayır | İstirahat Günü | yalnızca Sonuç = İstirahat iken açık |
| ReferralHospitalId | uniqueidentifier | Hayır | Sevk Yeri | Hr_T_Hospital; yalnızca Sonuç = Sevk iken açık |
| Description | nvarchar(MAX) | Hayır | Açıklama | dxTextArea |
App.Hr.Health (Sağlık) ve aynı kodlu ara yetki; altında üç yeni liste ekranı ve menü kaydı.{ListFormCode} + .Create/.Update/.Delete/.Export/.Import/.Note, App.Hr grubunda.App.Listform.ListformField. + UserId, StartDate, EndDate, DayCount, LeaveType, HospitalId, HospitalDepartmentId, Reason, ExaminationDate, ExaminationType, Examination, Result, DoctorId, RegisterDate, Age, RegisterType, LeaveDayCount, ReferralHospitalId — var olanlar yeniden açılmaz).copy ile doldurur (İstirahat: IdentityNumber, DepartmentId · Muayene: IdentityNumber, EducationLevel, BirthDate, JobPositionId, DepartmentId · Hasta Kayıt: HomeAddress, BirthDate, Gender) ve şube kuralını uygular (snum(\"BranchCount\") = 1 → set(BranchId) + readOnly(BranchId, true); aksi → clear(BranchId) + readOnly(BranchId, false)). Kopya alanlar EditorOptions.readOnly ile kilitlidir.UserIds listesinde UserId yoksa notify + clear(BranchId).DayCount = EndDate − StartDate (gün, bitiş hariç); iki tarih de doluysa yazılır. EndDate < StartDate ise uyarı verilir, EndDate ve DayCount boşaltılır.copy ile dolar. ExaminationDate açılışta bugün, ExaminationType açılışta Periyodik.readOnly(LeaveDayCount, Result ≠ İstirahat), readOnly(ReferralHospitalId, Result ≠ Sevk) (açılışta ve değişimde); değişimde koşulu kalkan alan boşaltılır. RegisterDate açılışta bugün, RegisterType açılışta Hastalık, Result açılışta Tedavi (Taburcu).\"TenantId\" = '@TENANTID' ve \"IsDeleted\" = 'false'): İstirahat — Bu Ay Başlayan · Şu An İstirahatte · Bu Ay Toplam Gün; Muayene — Toplam · Bu Ay · Plansız; Hasta Kayıt — Bugün · Bu Ay Sevk · Bu Ay İstirahat.d9f5fe73-d18e-cd9d-7666-3a2406936c9f), tek şube yetkisi Branch1 (1c125bf3-3ffd-4445-a270-1bc43ac3f61c), departman 8f14e45f-ea2d-4d9f-9f1d-1a2b3c4d5e6f, TC boş (kullanıcı kaydında yok), 17.02.2026 – 19.02.2026, 2 gün, Hastalık, Baltalimanı Kemik Hastalıkları Hastanesi (ccc391fa-7813-628e-38f2-3a240383beb3), Beyin ve Sinir Cerrahisi (d6271053-2d73-9ada-7de4-3a2403842c90). Muayene ve Hasta Kayıt görsellerinde satır olmadığından demo veri yazılmaz.Evet
Üretilenler (menü: İnsan Kaynakları › Sağlık — App.Hr.Health yeni ara menü/ara yetki, ikon FcLike; izin grubu App.Hr; IsTenant = true, IsBranch = false; görünümler Grid/Card/Pivot/Chart, açılış Grid; form popup, tek grup 2 kolon):
App.Hr.SickLeave (SickLeave.json): UserId, BranchId, IdentityNumber, DepartmentId, StartDate, EndDate, DayCount, LeaveType, HospitalId, HospitalDepartmentId, Reason. Demo: 1 satır (Sedat ÖZTÜRK · Branch1 · 17.02–19.02.2026 · 2 gün · Hastalık · Baltalimanı Kemik Hastalıkları Hastanesi · Beyin ve Sinir Cerrahisi). Widget: Bu Ay Başlayan · Şu An İstirahatte · Bu Ay Toplam Gün.App.Hr.MedicalExamination (MedicalExamination.json): UserId, IdentityNumber, ExaminationDate, ExaminationType, EducationLevel, BirthDate, JobPositionId, DepartmentId, BranchId, Examination, Result, DoctorId, DiplomaNo, DiplomaDate, OhsCertificateNo, OhsCertificateDate. Demo yok. Widget: Toplam · Bu Ay · Plansız.App.Hr.PatientRegister (PatientRegister.json): UserId, RegisterDate, HomeAddress, BirthDate, Age, Gender, BranchId, DoctorId, RegisterType, Result, LeaveDayCount, ReferralHospitalId, Description. Demo yok. Widget: Bugün · Bu Ay Sevk · Bu Ay İstirahat.Avatar talep gereği hiçbir ekrana ve tabloya eklenmedi. Şube kuralı üç ekranda da uygulandı (tek şubede otomatik dolup kilitlenir, birden fazla ya da hiç şube yoksa seçime açılır, çalışana tanımlı olmayan şube uyarıyla reddedilir; BranchId formda zorunlu).
\nYetkiler her ekranda {ListFormCode} + .Create/.Update/.Delete/.Export/.Import/.Note; hiçbir role atanmadı. Yeni dil anahtarları: ara menü, üç ekran başlığı/açıklaması, dokuz widget başlığı ve yeni alan başlıkları.
\nVarsayılanlar: script'ler kod olarak yazıldı (Script Builder kod görünümünde açılır); kopya alanlar EditorOptions.readOnly ile kilitli; departman ve görev gösterim lookup'larında IsActive filtresi yok (eski satırlarda adları görünsün diye); menü sırası deploy sırasıyla (İstirahat · Muayene · Hasta Kayıt).
DB Migrate bekleyen wizard'lar: SickLeave.json, MedicalExamination.json, PatientRegister.json.
" } ] } diff --git a/configs/seeds/host/data/App.Languages.LanguageText.json b/configs/seeds/host/data/App.Languages.LanguageText.json index 025c56b4..9327b1f2 100644 --- a/configs/seeds/host/data/App.Languages.LanguageText.json +++ b/configs/seeds/host/data/App.Languages.LanguageText.json @@ -38728,20 +38728,6 @@ "Key": "App.ListForm.WizardDeleteTableMissing", "Value": "veritabanında yok" }, - { - "Id": "7cf4a636-1aa4-5c40-b76d-6a56b2cab594", - "CultureName": "en", - "ResourceName": "Platform", - "Key": "App.ListForm.WizardDeleteTableWarning", - "Value": "The table and all of its data will be permanently deleted. This cannot be undone. Files to be deleted:" - }, - { - "Id": "de41b71a-ba27-5faa-a4b7-2875e11aaef0", - "CultureName": "tr", - "ResourceName": "Platform", - "Key": "App.ListForm.WizardDeleteTableWarning", - "Value": "Tablo ve içindeki tüm veriler kalıcı olarak silinecek. Bu işlem geri alınamaz. Silinecek dosyalar:" - }, { "Id": "13caacb0-eb0b-5a43-b5ce-0442057dbf26", "CultureName": "en", diff --git a/ui/src/views/admin/listForm/wizard/WizardFileManager.tsx b/ui/src/views/admin/listForm/wizard/WizardFileManager.tsx index 72d57896..71def42b 100644 --- a/ui/src/views/admin/listForm/wizard/WizardFileManager.tsx +++ b/ui/src/views/admin/listForm/wizard/WizardFileManager.tsx @@ -477,6 +477,18 @@ const WizardFileManager = () => { : prev, ) + /** Silinebilen tablolar; toplu seçim yalnızca bunları işaretler. */ + const droppableTables = (confirm?.tables ?? []) + .filter((t) => t.canDrop && canDropTable) + .map((t) => t.tableName) + const allTablesSelected = + droppableTables.length > 0 && droppableTables.every((t) => confirm?.dropTables.includes(t)) + + const toggleAllDropTables = () => + setConfirm((prev) => + prev ? { ...prev, dropTables: allTablesSelected ? [] : droppableTables } : prev, + ) + const handleDeleteConfirm = async () => { if (!confirm) return setDeletingFile(confirm.fileName) @@ -570,16 +582,6 @@ const WizardFileManager = () => { {translate('::App.ListForm.WizardDeleteTableNoPermission')} )} - {checked && ( -- {translate('::App.ListForm.WizardDeleteTables')} -
++ {translate('::App.ListForm.WizardDeleteTables')} +
+ {droppableTables.length > 1 && ( + + )} +{translate('::App.ListForm.WizardDeleteTablesHint')}