Architektura: osobny host zamiast przypadkowego timera
Za automatyzację odpowiada proces exksef.Scheduler. Web pozostaje miejscem pracy operatora, a scheduler działa jako oddzielny host z własnym logiem, konfiguracją, walidacją zależności i cyklem życia. Przy starcie proces ładuje wspólne adaptery KSeF, Pekao Connect, pocztę, SMS, push, repozytoria i use case'y używane również przez aplikację webową.
Takie rozdzielenie ma praktyczne znaczenie. Zadania okresowe nie wykonują się w kontekście kliknięcia użytkownika, nie blokują strony i nie zależą od tego, czy ktoś ma otwartą przeglądarkę. Jednocześnie nie powstaje drugi świat logiki: scheduler korzysta z tych samych reguł domenowych, walidatorów, dispatcherów i repozytoriów co web.
Silnik CronSchedulerService pracuje minutowo. Po starcie zapisuje heartbeat, czeka do pełnej minuty, pobiera włączone zadania z bazy, sprawdza ich wyrażenia CRON i uruchamia tylko te przebiegi, których zaplanowany tick nie został jeszcze wykonany. Nieznane zadania są pomijane z ostrzeżeniem, a błędne wyrażenie CRON nie zatrzymuje procesu.

