Отворете бакшиш пул за период, дефинирайте процентни разделения по роля (60% сервитьори / 30% кухня / 10% бар) и платформата разпределя сумата между персонала пропорционално на отбитите им часове във всяка роля. Една транзакция, един audit ред, нула spreadsheets.
Бакшиш пул е едно distribution събитие за дефиниран период — типично смяна, ден или седмица. Отваряте пула с periodStart и periodEnd; платформата сумира всеки COMPLETED BillPayment.tipAmount в този прозорец; връзвате TipDistributionRule (конфигурируем процент на роля, сумиращ до 100); и при Distribute платформата записва per-staff TipPoolDistribution редове пропорционално на отбитите часове на всеки служител в неговата роля през периода. Пулът се мести OPEN → DISTRIBUTED → LOCKED.
Цялата транзакция е атомна. Сумата, правилото, per-staff разделенията и StaffAuditLog ред кацат в една $transaction — няма half-distributed състояние, няма partial редове, няма „бакшиш пулът е в странно състояние“ бъгове. След distribution lock-нете пула за предотвратяване на бъдещи мутации. Данните, които заведението експортира за payroll съответстват на това, което персоналът вижда на собствената си My Wages страница, по дизайн.
Пулът се мести OPEN → DISTRIBUTED в една $transaction с per-staff редовете. Ако нещо се провали, нищо не се прилага. Без half-distributed пулове, без orphan редове, без ръчни почиствания.
Двама сервитьори са работили един петък — единият за 4 часа, другият за 8. Headcount-based разделенията им дават еднакъв дял, което е нечестно. Hours-in-role разделенията дават на 8-часовия сервитьор два пъти дяла. Математиката е прозрачна; персоналът може да верифицира собствения си ред.
Процентни разделения на роля (SERVER, KITCHEN, BAR, HOST) са venue-конфигурируеми. Сумата на роли трябва да е 100 — наложено на API ниво. Не зареждаме „по подразбиране“ разделение, защото tip-pool етиката се различава по държава и тип заведение.
Сумата на пула е сума на завършени BillPayments в периода — същият каноничен източник, който операторът вече използва за payment отчети. Бакшишите стигат до персонала точно както клиентът ги е платил; без двойно броене, без пропуснати канали.
Отворете Персонал → Бакшиш Пул → Правила. Създайте правило с име (напр. „Стандартно 60/30/10“), applies-to филтър (ALL / DINE_IN / DELIVERY) и per-role процентите. Сумата на редовете трябва да е 100; API отказва 99 или 101.
Отворете Персонал → Бакшиш Пул, кликнете + Open period. Изберете periodStart, periodEnd и правилото за прилагане. Пулът тръгва в OPEN статус с totalCents = 0 — реалната сума се изчислява в момента на distribution.
Кликнете Distribute на картата на пула. Платформата сумира BillPayment.tipAmount за COMPLETED плащания в прозореца, агрегира отбити минути на служител на роля от ClockEvents, изчислява per-row процентни дялове и записва всичко атомно. Пулът се мести в DISTRIBUTED.
След като сте прегледали distribution-а, кликнете Lock — пулът се мести в LOCKED и не се позволяват по-нататъшни мутации. Експортирайте per-staff разделенията като CSV за payroll provider-а; персоналът вижда собствения си дял на /admin/profile/wages.
Пълната distribution математика + per-staff row inserts + StaffAuditLog запис кацат в една Prisma транзакция. Всичко се commit-ва или нищо не се commit-ва — няма „half-distributed“ състояние за ръчно почистване.
Във всеки role bucket (напр. SERVER: £498 от £830 пул при 60%), дялът се разделя пропорционално на отбитите минути на всеки служител в тази роля през периода. Last-row residual обработва центове закръгляване, така че сумата да е равна на bucket-а точно.
Правилата са first-class entities — наименувайте ги, маркирайте едно по подразбиране, архивирайте стари. Applies-to филтърът (ALL / DINE_IN / DELIVERY) ви позволява да пускате различни разделения за dine-in вечери срещу delivery смени.
След като сте уверени, че distribution-ът е правилен, lock-нете пула. Статусът на реда става LOCKED и не се позволяват по-нататъшни мутации. Минали пулове, които вече са изплатени трябва винаги да бъдат lock-нати — това е audit най-чистият сигнал.
Петъчната вечер свършва с £830 в общи бакшиши. Отворете TipPool за периода на смяната, distribute-нете срещу 60/30/10 правило. Петима сервитьори си разделят £498 по часове, трима кухня по £249, един бар по £83. CSV експортът отива на счетоводителя в понеделник сутрин.
Някои заведения разпределят седмично през всички източници (dine-in + delivery + pickup бакшиши). Отворете 7-дневен пул с правило, чийто appliesToSource = ALL. Distribute-нете в неделя вечер; персоналът вижда дяла си в понеделник в My Wages.
Доставчици получават 100% от delivery бакшиши (правило A); dine-in сервитьори/кухня си разделят dine-in бакшиши 60/40 (правило B). Отворете два пула на период, един с всяко правило, и системата разпределя двата правилно без смесване на източници.
200-човешко catering събитие включва автоматична 18% служебна такса, която тече в общите бакшиши. Отворете еднократен пул за това събитие, връзнете стандартното правило, distribute. Catering екипът получава дяла си наред със служебния екип.
Отворете Персонал → Бакшиш Пул, видете всеки distribute-нат пул от месеца с суми, имена на правила и per-staff разделения. Lock-нете тези, които сте прегледали; разследвайте тези с изненадващи разделения преди заключване.
Персоналът не трябва да пита „какъв е дялът ми?“. Отварят My Wages на телефона си и виждат всеки TipPoolDistribution ред, приписан на тях. Математиката е прозрачна; процентният дял е показан; доверието е изградено.
Проблемът с бакшиш пула не е „как да изчислим разделението?“ — а „как да направим разделението вярно?“. Black-box payroll софтуер, който дава на сервитьор число без разбивка, ражда подозрение („как знаеш, че е правилно?“). Бакшиш пулът на Ordering.Tools отговаря на това с прозрачност: всеки distribution ред носи часовете на служителя, ролята му, процентния дял и резултантните центове. Персоналът вижда математиката; мениджърите не трябва да я защитават; audit log прави всяка минала distribution възпроизводима.
Headcount-based разделенията на бакшиш са най-простият ментален модел — „трима сервитьори, разделете еднакво“. Но те наказват служителя, покривал допълнителен час и награждават този, който е тръгнал в 21:00 точно. Hours-in-role разделенията възстановяват пропорционалната справедливост: clocked-in време е каноничната мярка за присъствие и системата вече я има от ClockEvents. Имплементацията е една SQL агрегация на пул — без ръчно броене, без spreadsheets.
Ако мениджър създаде tip правило с редове, сумиращи до 99% (забравил една роля), следващата distribution тихо оставя 1% от пула неразпределена — объркващо за персонала, неудобно за мениджъра. Ordering.Tools налага sum-to-100 на три слоя: rule-creation API отказва 99 с 400; distribution API ре-проверява преди изчисляване на разделения; unit тестове го твърдят. Резултатът е без тихи rounding грешки, без orphan стотинки, без „къде отидоха £8?“ Slack съобщения.
Откъде всъщност идват бакшишите? В Ordering.Tools всяко плащане от клиент записва BillPayment ред с tipAmount като отделна decimal колона. Бакшиш пулът агрегира COMPLETED BillPayments само — refunded плащания са изключени автоматично. PENDING и AUTHORIZED състояния не се броят, докато не завършат. Това означава, че клиент, дал бакшиш на карта, която после bouncne не влиза в пула, и refunded поръчка също. Бакшиши, стигнали до персонала, са бакшиши, които заведението всъщност е получило — chain of custody е една заявка дълбока и напълно reproducible.