Calendar
Prezentare
Calendarul ERP Core respectă majoritatea specificațiilor RFC5545. Consultați standardul pentru detalii despre comportamentul calendarului.
Funcționalitatea Calendar oferă declanșarea evenimentelor programate și baza pentru extensii. De exemplu, un plug-in poate utiliza această infrastructură pentru un sistem de rezervări.
Interfața implementării de bază a calendarului
Administratorul poate vedea în același ecran evenimentele sistemului, inclusiv cele implementate de plug-in-uri.
Evenimentele calendarului de bază permit configurarea:
- Repetării — reguli și date de recurență sau excepție;
- Încadrării în timp — durată și fus orar;
- Grupurilor de notificare pentru utilizatori și roluri;
- Grupurilor de evenimente;
- Operațiilor booleene între grupuri de evenimente, mascării și transparenței;
- Atributelor EAV;
- Ierarhiei;
- Culorilor și decorațiilor la nivel de calendar sau eveniment.
Enumerările definesc coerent zilele săptămânii, săptămânile și lunile.
Repository-ul de bază Calendar oferă operații pentru crearea, configurarea și gestionarea evenimentelor.
Definiția de bază a unui eveniment
Calendarul extins printr-un plug-in
1 Enumerări
1.1 Zilele săptămânii — Calendar WeekDay
Enumerarea ErpCalendarWeekDay definește zilele săptămânii și combinații uzuale. Valorile de tip indicator pot fi combinate prin operații binare pentru configurarea mai multor zile.
Definiția este:
namespace ErpEntity.Calendar
{
//
// Summary:
// Specifies the day of the week or combinations of days.
public enum ErpCalendarWeekDay
{
Monday = 0x01,
Tuesday = 0x02,
Wednesday = 0x04,
Thursday = 0x08,
Friday = 0x10,
Saturday = 0x20,
Sunday = 0x40
}
}
Baza de date stochează valori întregi, prezentate utilizatorului drept valori enum printr-un proxy.
1.2 Lunile — Calendar Month
ErpCalendarMonth utilizează aceeași logică binară pentru combinații de luni. Enumerarea include combinații predefinite, iar logica de business le transformă în declanșări pentru lunile individuale.
namespace ErpEntity.Calendar
{
public enum ErpCalendarMonth
{
January = 0x01,
February = 0x02,
March = 0x04,
April = 0x08,
May = 0x10,
June = 0x20,
July = 0x40,
August = 0x80,
September = 0x100,
October = 0x200,
November = 0x400,
December = 0x800
}
}
Baza de date stochează valori întregi, prezentate utilizatorului drept valori enum printr-un proxy.
1.3 Tipul de transparență
Proprietatea stabilește dacă un eveniment este ignorat la căutarea intervalelor ocupate.
namespace ErpEntity.Calendar
{
/// <summary>
/// The TRANSP of RFC5545.
/// This property defines whether or not an event is transparent to busy time searches.
/// Time Transparency is the characteristic of an event
/// that determines whether it appears to consume time on a calendar.
/// Events that consume actual time for the individual or resource
/// associated with the calendar SHOULD be recorded as OPAQUE,
/// allowing them to be detected by free/busy time searches.Other
/// events, which do not take up the individual's (or resource's) time
/// SHOULD be recorded as TRANSPARENT, making them invisible to free/
/// busy time searches.
/// </summary>
public enum ErpCalendarTransparencyType
{
/// <summary>
/// If set as inherit, the transparency type is inherited from parent to thild and from calendar to events.
/// </summary>
Inherit,
/// <summary>
/// Default value is OPAQUE.
/// Events that consume actual time for the individual or resource
/// associated with the calendar SHOULD be recorded as OPAQUE
/// allowing them to be detected by free/busy time searches.
/// </summary>
Opaque,
/// <summary>
/// Other events, which do not take up the individual's (or resource's) time
/// SHOULD be recorded as TRANSPARENT, making them invisible to free/
/// busy time searches.
/// </summary>
Transparent,
/// <summary>
/// If used, overrides the inherited transparency of calendars or events.
/// Can be used for recurrence rules to override events transparency (for example alerts over opaque events)
/// </summary>
Override
}
}
1.4 Operații booleene între calendare
Operațiile booleene pot fi aplicate între calendare, în combinație cu ErpCalendarTransparencyType. Ele sunt definite în ErpCalendarBooleanOperation:
public enum ErpCalendarBooleanOperation
{
/// <summary>
/// No Boolean action is defined.
/// </summary>
_ = 0,
/// <summary>
/// Negates the value. If an event or group of events has a NOT action, it is first
/// negated before using it in the Boolean operation.
/// Can be used as: result = (NOT A) AND B
/// </summary>
NOT,
/// <summary>
/// OR Boolean operation
/// A B X
/// 1 1 1
/// 1 0 1
/// 0 1 1
/// 0 0 0
/// </summary>
OR,
/// <summary>
/// NOR Boolean operation
/// A B X
/// 1 1 0
/// 1 0 0
/// 0 1 0
/// 0 0 1
/// </summary>
NOR,
/// <summary>
/// AND Boolean operation
/// A B X
/// 1 1 1
/// 1 0 0
/// 0 1 0
/// 0 0 0
/// </summary>
AND,
/// <summary>
/// NAND Boolean operation
/// A B X
/// 1 1 0
/// 1 0 0
/// 0 1 0
/// 0 0 1
/// </summary>
NAND,
/// <summary>
/// XOR Boolean operation
/// A B X
/// 1 1 0
/// 1 0 1
/// 0 1 1
/// 0 0 0
/// </summary>
XOR,
/// <summary>
/// XNOR Boolean operation
/// A B X
/// 1 1 1
/// 1 0 0
/// 0 1 0
/// 0 0 1
/// </summary>
XNOR,
/// <summary>
/// IMPLIES Boolean operation
/// A B X
/// 1 1 1
/// 1 0 0
/// 0 1 1
/// 0 0 1
/// </summary>
IMPLIES
}
1.5 Relația declanșării față de eveniment
Configurația stabilește relația dintre declanșarea alarmei și începutul sau sfârșitul componentei de calendar.
namespace ErpEntity.Calendar
{
/// <summary>
/// To specify the relationship of the alarm trigger with
/// respect to the start or end of the calendar component.
/// This parameter can be specified on properties that
/// specify an alarm trigger with a "DURATION" value type.The
/// parameter specifies whether the alarm will trigger relative to the
/// start or end of the calendar component.The parameter value START
/// will set the alarm to trigger off the start of the calendar
/// component; the parameter value END will set the alarm to trigger
/// off the end of the calendar component.If the parameter is not
/// specified on an allowable property, then the default is START.
/// </summary>
public enum ErpCalendarTriggerRelation
{
Start,
End
}
}
Alte tipuri de date susțin implementarea RFC5545 într-un ERP bazat pe Entity Framework. Codul sursă și comentariile sale oferă detalii suplimentare.
2 Calendare
2.1 Calendar
ErpCalendar grupează evenimente cu roluri similare: sarcini programate, generatoare de documente sau operații de sistem.
Extensiile pot defini calendare proprii. Într-un plug-in de rezervări, evenimentele pot fi grupate împreună sau împărțite în grupuri mai specifice.
ErpCalendar este o entitate ierarhică tipizată (TreeTypedNode), cu un părinte și mai mulți copii. Ierarhia permite configurarea nivelurilor de responsabilitate și declanșare.
Operațiile booleene se pot aplica între calendare și asupra fiecărui termen înaintea operației finale, de exemplu NOT.
Pentru determinarea zilelor lucrătoare, un calendar poate cuprinde zilele de luni până vineri, iar altul sărbătorile legale. Mascarea primului cu al doilea produce calendarul efectiv al zilelor lucrătoare.
Logica NOT A AND B pentru combinarea a două calendare
3 Definirea unui eveniment
3.1 Definiția evenimentului de calendar
Evenimentele sunt definite în ErpCalendarEvent. Configurația cuprinde:
- Definiția: nume, descriere, observații, grup, stare activ/inactiv, număr și index;
- Repetarea: frecvență și condiții;
- Încadrarea în timp: durată, eveniment pe întreaga zi și interval de valabilitate;
- Momentul notificării;
- Referințe către extensii, entități organizaționale, grupuri de notificare, tip, părinte și copii;
- EAV;
- Opțiuni de afișare în interfață.
3.1.1 Definiție
Secțiunea include informațiile generale Name, Description și Note.
Evenimentul este activat sau dezactivat prin lista Status.
Number este generat automat pentru identificare și comunicare ușoară între utilizatori.
OrderIndex influențează ordinea afișării în anumite ecrane.
Definițiile sunt grupate în calendare ErpCalendar, fiecare cu un rol: sarcini, evenimente definite de utilizator, raportare și altele. Un eveniment aparține unui singur calendar. Pentru un calendar extins de un plug-in, ReferenceEntityFullTypeName și ReferenceEntityId indică entitatea care extinde ErpCalendar.
3.1.2 Repetare
Evenimentele pot reapărea periodic. Sunt acceptate reguli și date de recurență, precum și reguli și date de excepție.
Modelele de recurență sunt descrise în RFC5545.
3.1.3 Încadrarea în timp
Această secțiune stabilește când are loc evenimentul.
În lipsa unei configurații explicite, câmpul CreatedAt poate fi utilizat ca dată de început, în funcție de repetare.
Duration
Definește durata: de exemplu, de la ora 08:00 la 15:00 sau un interval de trei zile.
Pentru evenimente instantanee, Start reprezintă momentul declanșării, iar End se configurează la DateTimeOffset.MinValue, mai mic decât Start.
AllDay
Ignoră componenta de oră din Duration. Evenimentul începe la 00:00:00 în ziua Start și se încheie la 23:59:59 în ziua End.
ValidityInterval
Stabilește intervalul de valabilitate al configurației. Sunt patru situații:
- Start este null sau Min, iar End este null sau Max, ori întregul interval este null: evenimentul nu are limite de valabilitate și poate începe imediat, respectând regulile de repetare;
- Start este null sau Min, iar End nu este null sau Max: poate începe imediat și se oprește la End;
- Start nu este null sau Min, iar End este null sau Max: începe după Start și se repetă conform configurației;
- Ambele limite sunt definite: declanșările se încadrează între Start și End și respectă regulile de repetare.
Dacă Start este anterior câmpului CreatedAt, valoarea este ignorată. Pentru a fi luată în calcul, trebuie să fie cel puțin egală cu data creării.
Dacă End este anterior lui CreatedAt, nu se generează evenimente. Limita finală trebuie să fie ulterioară datei creării.
TimeZoneOffset
Stabilește diferența față de UTC pentru eveniment. De exemplu, un utilizator din New York poate configura un eveniment pentru un fus orar european. Serverul păstrează data împreună cu diferența de fus orar; pentru eveniment trebuie aleasă diferența corespunzătoare destinației.
Valoarea implicită este diferența de fus orar a serverului.
3.1.4 Declanșări nereușite
Configurația din secțiunea Timing controlează reluarea evenimentelor care nu au putut fi declanșate.
TriggerExpiration
Definește perioada în care o declanșare ratată sau întârziată poate fi recuperată. De exemplu, dacă serverul a fost oprit, sistemul verifică dacă momentul curent este anterior momentului planificat plus intervalul configurat. În acest caz, evenimentul este declanșat imediat; în afara intervalului este omis.
Dacă valoarea este null sau zero, recuperarea nu are limită de timp.
4 Grupuri de notificare
4.1 Grupul de notificare al calendarului
La declanșare sau înaintea ei, în funcție de configurație, pot fi trimise notificări utilizatorilor sau grupurilor definite prin roluri.
Una sau mai multe entități ErpCalendarEvent pot fi asociate cu una sau mai multe entități ErpCalendarNotifGroup.
ErpCalendarNotifGroup
Grupurile de notificare definesc destinatarii mesajelor despre evenimente.
Un grup poate include mai multe entități:
- ErpIdentityUser
- ErpCompositeUserRole
- ErpIdentityRole
Notificările folosesc datele de contact din ErpIdentityUser: e-mail, telefon, SMS și altele. Pentru alte canale, un plug-in se poate abona la EntityEvents și poate implementa cerințele clientului.
5 Evenimente trecute
Evenimentele declanșate sunt salvate în baza de date împreună cu istoricul stărilor.
5.1 Apariția unui eveniment
La prima declanșare, sistemul creează o entitate ErpCalendarEventOccurance și păstrează referința la definiția ErpCalendarEvent.
Plug-in-urile care gestionează evenimentele Calendar se abonează la EntityEvent al acestei entități și tratează evenimentul.
5.2 Istoricul evenimentului
ErpCalendarEventHistory păstrează istoricul unei apariții și referința la părintele ErpCalendarEventOccurance.
La creare este înregistrată o stare inițială. Fiecare acțiune ulterioară poate adăuga o stare: de exemplu, New la creare și Snoozed când utilizatorul amână notificarea.
Stările sunt definite prin ErpCalendarEventStatus.
5.3 Starea evenimentului
ErpCalendarEventStatus are o structură ierarhică TreeNode, care poate defini ordinea aplicării stărilor, și metadate JSON pentru afișare: pictogramă, culoare și altele.
