Factorizer/Cluster ERP WikiCluster ERP English
Ana sayfa / Platform

Açıklama

Çalışma zamanı

core/working_time.py içindeki saat dilimi farkında çalışma zamanı motoru; vardiyalar, istisnalar, takvim kalıtımı ve yaz saati.

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 Shifts eş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, closed ve inherit denetimleri 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).
  • localize belge dizgisi, zoneinfo ile 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).
  • calendars dışındaki çağıranlar takvimlere EventBus üzerinden GetCalendarWindows, GetEffectiveWorkingCalendar, GetEffectiveWorkingCalendars ve GetOwnerWorkingDays ile ulaşır; production, WorkingCalendarChanged olayı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_organisations ve production içindeki 8 dosya tarafından içe aktarılır (grep -rln core.working_time src/cluster_erp/modules ile 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ı.

Doğrulanan commit 92f8051 · 2026-11-13