Python Nöbet Takip Programı

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;

  1. 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
  2. Ö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.
  3. 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.

İstediğin ne programını yazmamızmı?

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?

belli bir aşamaya geldim aslında ufak tefek sorunlarım çıkıyor

Pek çok koşul barındıran kod yazılmalı :slight_smile:

100 kişilik listem var ama sayı değişebilir

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.

2 Beğeni

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.

konuyla ilgili yardım edebilecek misiniz ?

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.

Tekrar merhaba,

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

Dosya linkini tekrar paylaşır mısın. İncelemek istiyorum.

Hocam hem py dosyasını hem de excel dosyasını paylaşabilir misin?

Buyrun hocam umarım iyi çözüm önerisi gelir.

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.

Dosyanin adi nobet.zip