Herkese iyi çalışmalar forumda çok yeniyim. Yanlış yere yazdıysam özür diliyorum şimdiden.
Öncelikle benim her ay nöbet düzenleyebileceğim takip programına ihtiyacım var ve ufaktan da olsa başlangıç yaptım.
Yapmak istediklerim sırasıyla;
Excel’de tuttuğum bir personel listem var;
Sicil - Adı - Soyadı - Birimi - Telefon Numarası - Mazereti - Hafta içi gündüz - Hafta içi gece - Hafta sonu gündüz - Hafta sonu gece - Cuma gündüz - Cuma gece sütunları olacak
Öncelikle Personel listemde bulunan Mazeret sütununa bakacak mesela A kişisi için sadece ayın tek günleri nöbet tutabilir, B kişisi için 1-9 ekim arası yıllık izinli, C kişisi için sadece hafta sonu yazılır, D kişi için gece nöbetlerinden muaf gibi kriterler olacak.
Bunları denetledikten sonra Hafta içi gündüz - Hafta içi gece - Hafta sonu gündüz - Hafta sonu gece - Cuma gündüz - Cuma gece sütunlarındaki görev sayılarına göre denetim yaptıktan sonra görevi en az olan öncelikli gelecek şekilde;
Hafta sonu gece, hafta sonu gündüz, cuma gece, cuma gündüz, hafta içi gece, hafta içi gündüz olacak şekilde sırasıyla personeli nöbetlere dağıtacak ve 100 kişilik bir personel tablom olduğu için (değişkenlik gösterebilir) her personele adil olacak şekilde 1 nöbet gelmesini istiyorum.
Bunları yaparken aynı zamanda kendi oluşturduğu bir veri tabanında tutacak ve örnek veriyorum Ekim ayı nöbetini yazdım Kasım ayına geçtiğim zaman önceki ayda yada aylardaki nöbetlerini karşılaştırma yapacak ekim ayında cuma günü nöbete giden kasım ayında cuma nöbetine gitmeyecek.
biraz karmaşık bir yapı olabilir. yardımcı olursanız çok sevinirim işimi fazlasıyla kolaylaştıracak bir uygulama olacak çünkü her ay sudoku çözer gibi uğraşıyorum. şimdiden teşekkür ediyorum.
Python bilginiz ne düzeyde? Bu programın ne kadarını/hangi kısımlarını yapmaya gözünüz kesiyor? Nereleri yapamayacağınızı ön görüyorsunuz? Başladınız mı yoksa bekleme/planlama sürecinde misiniz? Tam olarak hangi kısımlarda topluluktan destek bekliyorsunuz ve nasıl bir destek bekliyorsunuz?
diyorsunuz.
Peki günlük kaç kişi nöbet tutacak?
her nöbet tutan kişi aynı yerde mi nöbet tutacak yoksa farklı birimler için farklı kişiler mi nöbet tutacak?
belli bir aşamaya geldim
demişsiniz.
Kodunuzu paylaşırsanız ya da kodunuzun neresinde yardıma ihtiyacınız olduğunu tam olarak belirebilirseniz yardımcı olmaya çalışabiliriz.
Geldiğim aşama tamamıyla burada ama eksikler çok fazla olabilir.
İstediğim şu aslında personeller excell içerinde mevcut.
Bu personel listesinde Mazeret - Hafta içi gündüz - Hafta içi gece - Hafta sonu gündüz - Hafta sonu gece - Cuma gündüz - Cuma gece sütunları var.
Yapmak istediğim mazeretleri toplayıp bu excellin içine girmek ve mazeretlerde örneğin 1-15 ekim arası yıllık izinli, 6 Ekim izinli - Sadece haftasonu yazılabilir - Gece nöbetinden muaf gibi çeşitli mazeretler olacak ama her ay bu değişecek.
Öncelikli olarak Mazeret sütununu dikkate alacak sonra Hafta Sonu Gece nöbeti en az olanı süzerek başlayacak yazmaya sonra hafta sonu gündüz, cuma gece, cuma gündüz, hafta içi gece, hafta içi gündüz şeklinde devam edecek yani genel listede nöbet sayısı en az olanları nöbetinin az olduğu türe yazarak devam edecek. Her güne gündüz 1, gece 1 kişi olacak şekilde yazılacak nöbetler. Tamamen adil olmasını istiyorum. Ve oluşturduğu veritabanında bunları tutacak.
Merhaba,
Kodunuza göz attığımda zaten sizin benden çoook daha bilgili olduğunuzu görüyorum.
Amatör ve hobi olarak python öğrenmeye çalışan biri olarak veritabanı ile uzun süre çalıştığımı söyleyemem.
Pandas kütüophanesini kullanarak excel üzerinden birşeyler nedeyeceğim.
Verileri excel ya da txt dosyasında saklamayı deneyeceğim.
Umuyorum forumdaki deneyimli kullanıcılar yardımcı olacaktır.
Not:
Bağlantı “Transfer not found” hatası veriyor.
Dosya bağlantısı silinmiş olabilir.
Sorunuz karşısında biraz düşünerek, vakit bulduğum oranda kendi çapımda kod denemesi yaptım.
Basit olması adına aşağıdaki adımları uyguladım;
Öncelikle 10 kişiden oluşan bir liste üzerinde çalıştım,
Bu listede sicil no, ad, soyad ve bugüne kadar tutulan toplam nöbet sayılarını (rastgele belirledim) bulunmakta,
“Birim” ve "Mazeret"leri henüz görmezden gelerek kod mantığını oluşturmaya çalışıyorum, (ilerleyen günlerde mazeretler de değerlendirmeye katılacaktır),
Nöbetçi belirlemedeki temel prensibim şu oldu ; Her bir sütunu (ör. “HAFTA SONU GECE”, “CUMA GUNDUZ”, …vb) küçükten büyüğe göre sıralayarak en üstteki (en az sayıda nöbet tutan) kişileri yeni nöbetçi olarak seçtirdim.
Kodları, haftalık (7 gün için) nöbetçi belirlemek için oluşturdum.
İlerleyen günlerde datetime modülü ile ayın toplam kaç günden oluştuğu (kaç çektiği) cuma ve hafta sonlarının hangi günlere denk geldiğinin tespiti ve buna uygun olarak aylık nöbet çizelgesi hazırlamayı düşünüyorum.
NOT:
Kod çalıştırılıp Nöbet sayılarındaki değişikliğin, orjinal dosyanın üzerine kaydedilmesini istersen bu kodu df.to_excel("personel_listesi.xlsx") yorumdan çıkarmalısın.
Şu ana kadar üzerinde çalıştığım dosya içeriği , kod ve çıktısını aşağıda paylaşıyorum.
Umarım size iham verebilir ve diğer kullanıcılar daha doğru yönlendirebilir.
Dosya icerigi:
ADI SOYADI BIRIM MAZERET HAFTA SONU GECE HAFTA SONU GUNDUZ CUMA GECE CUMA GUNDUZ HAFTA ICI GECE HAFTA ICI GUNDUZ
SICIL
123456 ALİ SUNAL Bilgi Teknolojileri NaN 6 3 10 1 5 2
123457 VELİ MEŞE Bilgi Teknolojileri 3 - 15 Ekim izinli 1 7 6 10 6 9
123458 BURAK TOPAL Bilgi Teknolojileri NaN 7 6 4 8 7 7
123459 ASLI KENAN Bilgi Teknolojileri NaN 6 5 5 6 10 2
123460 MEHMET MELTEM Bilgi Teknolojileri NaN 6 3 6 7 4 8
123461 CENK CANAN Bilgi Teknolojileri NaN 6 4 5 9 6 4
123462 SUAT CAN Bilgi Teknolojileri NaN 5 3 3 8 8 9
123463 FUAT KAN Bilgi Teknolojileri NaN 2 8 5 4 6 5
123464 KEREM SOL Bilgi Teknolojileri NaN 10 3 7 3 3 6
123465 KENAN SAĞ Bilgi Teknolojileri NaN 3 2 4 5 5 7
Kod:
import pandas as pd
df = pd.read_excel("personel_listesi.xlsx", index_col = "SICIL")
print("Dosya icerigi:\n", df)
baslik = list(df.columns)
### nobet listesi olusturulurken kullanılacak listeler ###
h_sonu_gece = [] # 1 kişi
h_sonu_gunduz = [] # 1 kişi
cuma_gece = [] # 1 kişi
cuma_gunduz = [] # 1 kişi
h_ici_gece = [] # 5 kişi
h_ici_gunduz = [] # 5 kişi
### Cuma günü (Haftada 1 gün) tutulacak nobete göre dağıtım yapan fonksiyonu ###
def dagit_cuma(sutun_adi):
nobetci_listesi = []
global df
df = df.sort_values(by=sutun_adi) # df'yi sütun adına göre sırala
s = baslik.index(sutun_adi) # sutun_adi'nin tablonun kaçıncı sütunu olduğunu ifade eder.
for i in range(1): # bir haftalık döngü
nobetci_listesi.append(df.index[i]) # indeks yani sicil numaralarını sırası ile listeye ekle
df.iloc[i, s] += 1 # nobet yazdıktan sonra tablodaki degerini 1 artır
return nobetci_listesi
### Hafta sonu (Haftada 2 gün) tutulacak nobete göre dağıtım yapan fonksiyonu ###
def dagit_h_sonu(sutun_adi):
nobetci_listesi = []
global df
df = df.sort_values(by=sutun_adi) # df'yi sütun adına göre sırala
s = baslik.index(sutun_adi) # sutun_adi'nin tablonun kaçıncı sütunu olduğunu ifade eder.
for i in range(2): # bir haftalık döngü
nobetci_listesi.append(df.index[i]) # indeks yani sicil numaralarını sırası ile listeye ekle
df.iloc[i, s] += 1 # nobet yazdıktan sonra tablodaki degerini 1 artır
return nobetci_listesi
### Hafta içi (Haftada 4 gün, cuma günü hariç) tutulacak nobete göre dağıtım yapan fonksiyonu ###
def dagit_h_ici(sutun_adi):
nobetci_listesi = []
global df
df = df.sort_values(by=sutun_adi) # df'yi sütun adına göre sırala
s = baslik.index(sutun_adi) # sutun_adi'nin tablonun kaçıncı sütunu olduğunu ifade eder.
for i in range(4): # bir haftalık döngü
nobetci_listesi.append(df.index[i]) # indeks yani sicil numaralarını sırası ile listeye ekle
df.iloc[i, s] += 1 # nobet yazdıktan sonra tablodaki degerini 1 artır
return nobetci_listesi
### sutun baslıklarına göre tüm dagıtımı yapacak fonksiyon ###
def nobet_dagitimina_basla():
global h_sonu_gece
global h_sonu_gunduz
global cuma_gece
global cuma_gunduz
global h_ici_gece
global h_ici_gunduz
for bas in baslik[4:]:
if bas == "HAFTA SONU GECE":
h_sonu_gece = dagit_h_sonu(bas)
elif bas == "HAFTA SONU GUNDUZ":
h_sonu_gunduz = dagit_h_sonu(bas)
elif bas == "CUMA GECE":
cuma_gece = dagit_cuma(bas)
elif bas == "CUMA GUNDUZ":
cuma_gunduz = dagit_cuma(bas)
elif bas == "HAFTA ICI GECE":
h_ici_gece = dagit_h_ici(bas)
elif bas == "HAFTA ICI GUNDUZ":
h_ici_gunduz = dagit_h_ici(bas)
nobet_dagitimina_basla()
### Nobet dağıtımı sonrası dosyayı yazdır ve Kaydet ###
# # print("\nNobet dagitimi sonrasi:\n", df)
# # df.to_excel("personel_listesi.xlsx") # değişikliklerin, orjinal dosyanın üzerine kaydedilmesini istersen bu satırı yorumdan çıkarmalısın.
### Çıktıları ekrana yazdır ###
print("\nHAFTA SONU GECE NOBETCİLERİ:\n", df.loc[h_sonu_gece])
print("\nHAFTA SONU GUNDUZ NOBETCİLERİ:\n", df.loc[h_sonu_gunduz])
print("\nCUMA GECE NOBETCİSİ:\n", df.loc[cuma_gece])
print("\nCUMA GUNDUZ NOBETCİSİ:\n", df.loc[cuma_gunduz])
print("\nHAFTA İÇİ (Pazartesi - Perşembe) GECE NOBETCİLERİ:\n", df.loc[h_ici_gece])
print("\nHAFTA İÇİ (Pazartesi - Perşembe) GUNDUZ NOBETCİLERİ:\n", df.loc[h_ici_gunduz])
KODUN ÇIKTISI:
HAFTA SONU GECE NOBETCİLERİ:
ADI SOYADI BIRIM MAZERET HAFTA SONU GECE HAFTA SONU GUNDUZ CUMA GECE CUMA GUNDUZ HAFTA ICI GECE HAFTA ICI GUNDUZ
SICIL
123457 VELİ MEŞE Bilgi Teknolojileri 3 - 15 Ekim izinli 2 7 6 10 6 9
123463 FUAT KAN Bilgi Teknolojileri NaN 3 8 5 4 7 6
HAFTA SONU GUNDUZ NOBETCİLERİ:
ADI SOYADI BIRIM MAZERET HAFTA SONU GECE HAFTA SONU GUNDUZ CUMA GECE CUMA GUNDUZ HAFTA ICI GECE HAFTA ICI GUNDUZ
SICIL
123465 KENAN SAĞ Bilgi Teknolojileri NaN 3 3 4 5 6 7
123462 SUAT CAN Bilgi Teknolojileri NaN 5 4 4 8 8 9
CUMA GECE NOBETCİSİ:
ADI SOYADI BIRIM MAZERET HAFTA SONU GECE HAFTA SONU GUNDUZ CUMA GECE CUMA GUNDUZ HAFTA ICI GECE HAFTA ICI GUNDUZ
SICIL
123462 SUAT CAN Bilgi Teknolojileri NaN 5 4 4 8 8 9
CUMA GUNDUZ NOBETCİSİ:
ADI SOYADI BIRIM MAZERET HAFTA SONU GECE HAFTA SONU GUNDUZ CUMA GECE CUMA GUNDUZ HAFTA ICI GECE HAFTA ICI GUNDUZ
SICIL
123456 ALİ SUNAL Bilgi Teknolojileri NaN 6 3 10 2 6 3
HAFTA İÇİ (Pazartesi - Perşembe) GECE NOBETCİLERİ:
ADI SOYADI BIRIM MAZERET HAFTA SONU GECE HAFTA SONU GUNDUZ CUMA GECE CUMA GUNDUZ HAFTA ICI GECE HAFTA ICI GUNDUZ
SICIL
123464 KEREM SOL Bilgi Teknolojileri NaN 10 3 7 3 4 7
123460 MEHMET MELTEM Bilgi Teknolojileri NaN 6 3 6 7 5 8
123456 ALİ SUNAL Bilgi Teknolojileri NaN 6 3 10 2 6 3
123465 KENAN SAĞ Bilgi Teknolojileri NaN 3 3 4 5 6 7
HAFTA İÇİ (Pazartesi - Perşembe) GUNDUZ NOBETCİLERİ:
ADI SOYADI BIRIM MAZERET HAFTA SONU GECE HAFTA SONU GUNDUZ CUMA GECE CUMA GUNDUZ HAFTA ICI GECE HAFTA ICI GUNDUZ
SICIL
123456 ALİ SUNAL Bilgi Teknolojileri NaN 6 3 10 2 6 3
123459 ASLI KENAN Bilgi Teknolojileri NaN 6 5 5 6 10 3
123461 CENK CANAN Bilgi Teknolojileri NaN 6 4 5 9 6 5
123463 FUAT KAN Bilgi Teknolojileri NaN 3 8 5 4 7 6
Merhaba,
Kodun tamamini zaten onceki mesajimda paylastim. Kopyala yapistir ile kullanabilirsiniz.
Excel dosyasinin icerigi de mesjada var ama madem istediniz dosya olarak ta paylaşayım.