Задайте почасови ставки на служител, оставете ги да отбиват часовник от телефона си с опционална локационна верификация и експортирайте timesheet в CSV или XLSX с един клик. Всяка промяна на заплата е версионирана; всяко clock събитие е append-only; всяка корекция оставя audit trail.
Проследяването на заплати превръща модул Персонал в източник на истината за това какво печели всеки член на екипа и какво всъщност е работил. Задайте почасова ставка на всеки служител; новите ставки заместват старите с effective-from дати, така че историята остава чиста. Персоналът отбива часовник от mobile waiter shell — опционално верифицирано чрез Haversine разстояние срещу GPS координатите на заведението. Timesheet агрегацията съединява отбити минути × заплатата в сила тогава и произвежда CSV или XLSX, който можете да предадете на счетоводителя.
Целият pipeline е append-only. Заплатите са версионирани (effectiveFrom / effectiveUntil) — никога не UPDATE-вате ред, замествате го. Clock събития са immutable — мениджърски редакции записват нов MANUAL_ADJUST ред, ретериращ оригинала, оригиналът се запазва verbatim. Това прави защитата от трудови спорове тривиална: всяка цифра на ведомост може да бъде ре-извлечена от подлежащия audit trail месеци по-късно.
Всеки wage ред съхранява центове във валутата на заведението — без per-row currency колона, без exchange-rate drift, без объркване когато служител се премести между заведения. Multi-venue работник има множество wage редове, по един на заведение, във валутата на всяко заведение.
Когато заведението има lat/lng + ненулев clockInRadiusMeters, clock събитието записва координатите на устройството, изчислява Haversine разстояние до заведението и флагва geofenceOk. Никога не отказваме clock-in заради GPS drift — записваме истината и показваме флагнатите събития за мениджърски преглед.
Написахте 1500 вместо 15.00? Имате 5 минути за undo — редът хард-изтрива само ако никой ClockEvent не е калкулиран срещу него още. След 5 минути или щом заплатата е ползвана в payroll run, единственият път напред е коригираща замяна с notes.
Timesheet grid експортира в CSV или XLSX с userId, username, hourlyRate, hoursWorked, grossPay колони. Pipe-нете към софтуера на счетоводителя ви (Microinvest TRZ, Plus Minus, Ажур L) без ръчно препечатване.
Отворете Персонал → Заплати и кликнете празна Rate клетка за всеки член на екипа. Запази. Запазването създава нов StaffWage ред, маркира effectiveUntil на предишния активен ред като сега и записва StaffAuditLog. Валутата следва venue.currency.
Mobile waiter shell-ът показва Clock In/Out бутон най-горе. Едно докосване хваща координатите на устройството (ако е разрешено), изчислява Haversine разстояние, записва събитието и автоматично свързва с днешната насрочена смяна, ако startTime е в рамките на 30 минути.
Ако сервитьор е забравил да отбие, отворете Персонал → Audit, намерете събитието, кликнете Adjust. Системата създава нов MANUAL_ADJUST ред, ретериращ оригинала (който се запазва). Reason код е задължителен, така че следващият рецензент да разбира какво е станало.
Отворете Персонал → Timesheets, изберете диапазон от дати (по подразбиране: миналия месец), прегледайте grid-а, натиснете CSV или XLSX. Файлът сваля с периода в името и е готов за импорт в payroll софтуера ви.
Всяка промяна на заплата е нов ред. Предишният активен ред получава effectiveUntil зададен в същата $transaction. Четенето на текущата заплата в момент е просто WHERE effectiveFrom <= at AND (effectiveUntil IS NULL OR effectiveUntil > at).
Конфигурируем за заведение: clockInRadiusMeters = 0 деактивира проверката. Иначе всяко clock събитие хваща координати на устройство, изчислява great-circle разстояние до venue.lat/lng и съхранява geofenceOk = (distance <= radius). Проверката никога не блокира — флагва.
Всяко clock събитие е immutable след записване. Мениджърски редакции създават нов MANUAL_ADJUST ред, сочещ към оригинала чрез notes + adjustReason. Оригиналът се запазва verbatim — защитата от трудов спор е вградена.
Агрегаторът съединява отбити минути на служител × заплатата в сила в края на периода. Експортите включват userId, username, почасова ставка, отработени часове и брутно възнаграждение. CSV е универсален; XLSX използва същата xlsx библиотека, която захранва другите Ordering.Tools експорти.
Край на месеца: отворете Персонал → Timesheets, изберете миналия календарен месец, натиснете XLSX, предайте файла на счетоводителя. Предишният Excel-from-paper-clock workflow отнемаше 4 часа; този отнема 30 секунди.
Анна е тръгнала в 23:00 но е забравила да отбие и системата автоматично е приключила смяната ѝ в полунощ. Отворете audit log, намерете CLOCK_OUT-missing pattern-а, кликнете Adjust на последното ѝ събитие, задайте правилното време, добавете reason „забрави да отбие — потвърдено чрез охранителна камера“. Нов MANUAL_ADJUST ред идва; оригиналът се запазва.
Петър се премества от London Pub в Camden заведението. Получава нов StaffWage ред във валутата на Camden (GBP за двете, но шейпът на данните поддържа cross-currency местения). Историята му в London Pub остава непокътната — всяко gross-pay изчисление срещу London часове използва London заплатата.
Сервитьор оспорва ведомост от 6 месеца назад. Отворете Персонал → Audit, филтрирайте по потребител + диапазон дати. Всяка промяна на заплата, всяко clock събитие, всяка мениджърска корекция е там с името на актьора, timestamp и reason кода. Ре-извлечете брутото от raw събития за 30 секунди.
Служител отбива от вкъщи „защото чака доставка“. geofenceOk = false флагът изплува в audit log. Питате, потвърждават, приемате веднъж и продължавате — или казвате да отбиват само в заведението, с audit log като разписка.
Служител, който покрива и server и kitchen смени има два StaffWage реда (един с role = SERVER, един с role = KITCHEN). Wage resolver-ът избира правилната ставка въз основа на ролята на смяната по време, когато clock събитието е калкулирано.
Повечето POS системи в ресторантите проследяват бакшиш и продажби, но третират заплатите като „на някой друг проблем“. Модулът Персонал на Ordering.Tools затваря тази пропаст end-to-end: почасови ставки с effective дати, geofenced clock-in, append-only event история, CSV/XLSX експорти за всеки payroll софтуер. Pipeline-ът е проектиран за момента, в който заплата бива оспорена — месеци по-късно, с недостъпен оригинален мениджър — и отговорът трябва да бъде reproducible от raw редове. Затова никога не UPDATE-ваме заплати или събития; само supersede или adjust с audit.
Служител оспорва ведомост. Мениджърът, който е задал ставката му е напуснал компанията. Без append-only история имате един ред, показващ текущата ставка и без начин да докажете каква е била ставката в деня на оспорваната смяна. С append-only имате effectiveFrom / effectiveUntil двойки, които ре-извличат всеки минал ден за една заявка. Същата логика за clock събития: забравена ръчна редакция презаписва историята; MANUAL_ADJUST ред я запазва. Цената на append-only е повече редове; ползата е защитим audit trail.
Indoor GPS drift в бетонни сгради означава, че служител може да стои на бара и да показва 200 метра встрани. Блокиране на geofence гарантира фалшиви негативи, които стигат до мениджъра по средата на пика. Флагване вместо блокиране хваща истината (geofenceOk = false), без да забавя операциите: clock-in минава, мениджърът получава web-push и audit log носи разминаването за преглед. През седмици patternите на флагнати събития изплуват реалното злоупотребяване (отбиване от вкъщи), без да наказват законни работници заради indoor GPS шум.
Multi-venue верига, която плаща Лондонския си екип в GBP и Camden екипа в GBP не вижда разликата. Верига със Sofia заведение (BGN) и London заведение (GBP) вижда — и най-чистият модел е един wage ред на (служител, заведение) двойка във валутата на заведението. Така Ordering.Tools го моделира. Без exchange rate полета, без FX drift, без „това 15 GBP или 15 BGN е?“ объркване. Заплатата, която виждате за заведение е каквото служителят печели в това заведение, точка.