src/cluster_erp/core/working_time.py, çizelgeleme ve planlama için çalışma pencerelerini, çalışma dakikalarını ve iş günlerini hesaplar. Veritabanı erişimi olmayan saf Python'dur; çağıranlar takvim satırlarını yükler ve düz yapılar verir. Bu sayfa iki katmanını anlatır. Onu besleyen takvim kayıtları calendars modülüne aittir; bkz. calendars ve çizelgeleme.
Kısaca¶
- Alt düzey katman, hafta gününden (0 pazartesi) duvar saati aralıklarına giden bir
Shiftseşlemesiyle çalışır (src/cluster_erp/core/working_time.py:32-34). - Duvar saatleri yerel gün başına UTC'ye çevrilir; yaz saati geçişleri için açık bir kural vardır (
src/cluster_erp/core/working_time.py:94-112). - Takvim katmanı tarih başına istisnalar,
open,closedveinheritdenetimleri ve bir temel takvimden kalıtım ekler (src/cluster_erp/core/working_time.py:340-380). - Bilinmeyen veya boş bir saat dilimi UTC'ye düşer (
src/cluster_erp/core/working_time.py:115-122). - Varsayılanlar UTC'de pazartesiden cumaya 08:00 ile 17:00 arasıdır (
src/cluster_erp/core/working_time.py:66-69).
Nasıl çalışır¶
Alt düzey ilkeller¶
| İşlev | Davranış | Kaynak |
|---|---|---|
localize(day, wall, tz) |
Duvar saatinden farkında bir datetime'a; belirsiz bir saat ilk oluşumu alır, atlanan bir saat boşluk kadar ileri kayar | src/cluster_erp/core/working_time.py:94-112 |
resolve_timezone(name) ve is_valid_timezone(name) |
UTC'ye düşen bir ZoneInfo; geçerlilik denetimi |
src/cluster_erp/core/working_time.py:115-132 |
shifts_from_rows(rows) |
day_of_week, start_time, end_time taşıyan satırlardan Shifts kurar |
src/cluster_erp/core/working_time.py:135-155 |
with_overrides(shifts, overrides) |
Tarih başına UTC pencerelerini haftalık desene DayWindowShifts olarak ekler |
src/cluster_erp/core/working_time.py:37-63 |
working_windows(shifts, tz_name, day) |
Bir yerel günün UTC pencereleri; tarih geçersiz kılması haftalık desene üstün gelir | src/cluster_erp/core/working_time.py:158-191 |
next_working_instant(...) |
Arama ufku içinde bir andan itibaren ilk çalışma anı | src/cluster_erp/core/working_time.py:194-210 |
add_working_minutes(...) |
Bir başlangıçtan boşlukları atlayarak çalışma dakikası tüketir; pozitif olmayan süre MIN_BAR_MINUTES olur |
src/cluster_erp/core/working_time.py:213-256 |
working_minutes_between(...) |
Bir UTC aralığındaki çalışma dakikaları | src/cluster_erp/core/working_time.py:259-283 |
day_capacity_minutes(...) ve effective_day_capacity_minutes(...) |
Bir yerel günün kullanılabilir dakikaları | src/cluster_erp/core/working_time.py:286-329 |
SEARCH_HORIZON_DAYS 90'dır ve boşluk aramasını sınırlar; bir iç yineleme koruması sorunlu bir vardiya eşlemesini durdurur (src/cluster_erp/core/working_time.py:76-81).
Takvim katmanı¶
Bir CalendarLayer haftalık bir şablon, bir saat dilimi, CalendarException nesnelerinden bir liste ve isteğe bağlı bir base katmanı tutar (src/cluster_erp/core/working_time.py:370-379). Bir CalendarException bir yineleme (none, annual veya weekly) ve bir denetim (open, closed veya inherit) taşır (src/cluster_erp/core/working_time.py:344-367).
windows_for_day(layer, day) bir günü şu sırayla çözer (src/cluster_erp/core/working_time.py:458-490):
flowchart TD
day["Yerel gün"] --> exc{"Kendi istisnası eşleşiyor mu?"}
exc -->|closed| none["Pencere yok"]
exc -->|aralıklı open| own["İstisna aralıkları"]
exc -->|inherit| base["Temel takvimde çöz"]
exc -->|eşleşme yok| hol{"Temel ata günü kapatıyor mu?"}
hol -->|evet| none
hol -->|hayır| tmpl["Kendi haftalık şablonu"]Düz metinle: önce katmanın kendi en özgül istisnası karar verir; tek seferlik bir tarih yıllık bir tarihi, yıllık tarih de bir hafta günü kuralını yener (src/cluster_erp/core/working_time.py:410-433). Kendi istisnası yoksa, bir temel atadaki açık bir kapalı istisna günü kapatır; temelin haftalık boşlukları yayılmaz (src/cluster_erp/core/working_time.py:436-455). Aksi halde katmanın haftalık şablonu uygulanır. Aralıksız bir open istisnası ve temeli olmayan bir inherit istisnası da şablona düşer (src/cluster_erp/core/working_time.py:478-484).
Bitişi başlangıcından sonra olmayan bir vardiya ertesi yerel günde biter (src/cluster_erp/core/working_time.py:396-407). Kalıtım derinliği 20 seviyeyle sınırlıdır; bu döngülere karşı da korur (src/cluster_erp/core/working_time.py:83-85).
Diğer yardımcılar: is_working_day, add_working_days (sınırlı döngü), add_working_days_set (tarihleri önceden çözülmüş açık günler kümesine göre kaydırır) ve preview_days (bir tarih aralığı için gün başına pencereler ve dakikalar) (src/cluster_erp/core/working_time.py:493-577).
Neden böyle kurulmuştur¶
- Modül belge dizgisi motorun saf ve birim testine uygun kaldığını, ORM satırlarını çağıranların yüklediğini ve takvim günü başına çevirmenin yaz saatini yapısı gereği doğru kıldığını belirtir (
src/cluster_erp/core/working_time.py:1-21). localizebelge dizgisi,zoneinfoile düz birleştirmenin yılda bir kez bütün vardiyaları bir saat kaydırdığını belirtir (src/cluster_erp/core/working_time.py:95-104).- Belge dizgisi izlediği modeli adlandırır: Microsoft Dynamics tarzında yeniden kullanılabilir haftalık şablon, tarih başına istisnalar ve temel takvim kalıtımı (
src/cluster_erp/core/working_time.py:12-17).
Kurallar ve sınırlar¶
- Modül hiçbir modülü veya ORM modelini içe aktarmaz (
src/cluster_erp/core/working_time.py:23-30). calendarsdışındaki çağıranlar takvimlere EventBus üzerindenGetCalendarWindows,GetEffectiveWorkingCalendar,GetEffectiveWorkingCalendarsveGetOwnerWorkingDaysile ulaşır;production,WorkingCalendarChangedolayını dinler (src/cluster_erp/core/contracts.py:1980-2037). Bkz. sözleşmeler başvurusu.
Diğer parçalarla etkileşim¶
core.working_time,calendars,owned_organisationsveproductioniçindeki 8 dosya tarafından içe aktarılır (grep -rln core.working_time src/cluster_erp/modulesile sayıldı).- Üretim çizelgeleme panosu ilkelleri yeniden dışa aktarır (
src/cluster_erp/core/working_time.py:9-10).
Sınırlar ve açık noktalar¶
add_working_days_set, çözülmüş aralığın dışındaki bir günü iş günü sayar (src/cluster_erp/core/working_time.py:530-531).- Tatil verisi takvim içeriğidir. Bir kurulumun hangi tatilleri yüklediği koddan belirlenemedi.
Tanıtılan terimler¶
| Terim | Kod tanımlayıcısı | Tanım | Türkçe terim | Kaynak |
|---|---|---|---|---|
| shifts | Shifts |
Hafta gününden duvar saati çalışma aralıklarına eşleme. | vardiyalar | src/cluster_erp/core/working_time.py:32-34 |
| calendar layer | CalendarLayer |
Çözülmüş bir takvim: şablon, istisnalar, saat dilimi ve isteğe bağlı temel. | takvim katmanı | src/cluster_erp/core/working_time.py:370 |
| calendar exception | CalendarException |
Bir takvimin haftalık çalışma düzenini geçersiz kılan ve kapsadığı günleri açan veya kapatan tarih kuralı. | takvim istisnası | src/cluster_erp/core/working_time.py:349 |
İlgili sayfalar¶
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.