Ορίστε ωριαίες αμοιβές ανά μέλος προσωπικού, αφήστε τους να χτυπούν κάρτα από το κινητό με προαιρετική επαλήθευση τοποθεσίας και εξάγετε το timesheet σε CSV ή XLSX με ένα κλικ. Κάθε αλλαγή μισθού είναι versioned; κάθε clock event είναι append-only; κάθε διόρθωση αφήνει audit trail.
Η παρακολούθηση μισθών μετατρέπει την ενότητα Προσωπικό στην πηγή αλήθειας για το τι κερδίζει κάθε μέλος της ομάδας και τι πραγματικά δούλεψε. Ορίστε ωριαία αμοιβή για κάθε εργαζόμενο; οι νέες αμοιβές αντικαθιστούν τις παλιές με ημερομηνίες effective-from έτσι το ιστορικό παραμένει καθαρό. Το προσωπικό χτυπά κάρτα από το mobile waiter shell — προαιρετικά επαληθευμένο με απόσταση Haversine έναντι των συντεταγμένων GPS του venue. Η συσσώρευση timesheet ενώνει χτυπημένα λεπτά × τη μισθοδοσία σε ισχύ τότε και παράγει CSV ή XLSX που μπορείτε να δώσετε στον λογιστή σας.
Όλος ο pipeline είναι append-only. Οι μισθοί είναι versioned (effectiveFrom / effectiveUntil) — δεν UPDATE-άρετε ποτέ μια γραμμή, την αντικαθιστάτε. Τα clock events είναι αμετάβλητα — διορθώσεις διευθυντή γράφουν νέα MANUAL_ADJUST γραμμή που αναφέρεται στο πρωτότυπο, το πρωτότυπο διατηρείται verbatim. Αυτό κάνει την άμυνα εργατικής διαφοράς τετριμμένη: κάθε αριθμός σε μισθοδοτική κατάσταση μπορεί να αναπαραχθεί από το audit trail μήνες αργότερα.
Κάθε γραμμή μισθού αποθηκεύει cents στο νόμισμα του venue — χωρίς per-row currency στήλη, χωρίς exchange-rate drift, χωρίς σύγχυση όταν το προσωπικό μεταφέρεται μεταξύ venues. Πολυ-venue εργαζόμενος έχει πολλαπλές γραμμές μισθού, μία ανά venue, στο νόμισμα κάθε venue.
Όταν το venue έχει lat/lng + μη μηδενικό clockInRadiusMeters, το clock event καταγράφει τις συντεταγμένες της συσκευής, υπολογίζει απόσταση Haversine προς το venue και σημαίνει geofenceOk. Δεν αρνούμαστε ποτέ το clock-in λόγω GPS drift — καταγράφουμε την αλήθεια και εμφανίζουμε σημαδεμένα events για έλεγχο διευθυντή.
Πληκτρολογήσατε 1500 αντί για 15.00; Έχετε 5 λεπτά για αναίρεση — η γραμμή διαγράφεται μόνο αν κανένα ClockEvent δεν έχει χρεωθεί ακόμα. Μετά τα 5 λεπτά ή όταν ένας μισθός αναφέρεται σε payroll run, ο μόνος δρόμος είναι μια διορθωτική αντικατάσταση με σημειώσεις.
Το timesheet grid εξάγει σε CSV ή XLSX με στήλες userId, username, hourlyRate, hoursWorked, grossPay. Δώστε το στο software του λογιστή σας (Microinvest TRZ, Plus Minus, Ажур L) χωρίς χειροκίνητη επαναπληκτρολόγηση.
Ανοίξτε Προσωπικό → Μισθοί και κλικ σε ένα κενό κελί Rate για κάθε μέλος ομάδας. Αποθηκεύστε. Η αποθήκευση δημιουργεί νέα γραμμή StaffWage, σημαίνει το effectiveUntil της προηγούμενης ενεργής γραμμής σε τώρα και γράφει StaffAuditLog καταχώρηση. Το νόμισμα ακολουθεί το venue.currency.
Το mobile waiter shell δείχνει κουμπί Clock In/Out στην κορυφή. Ένα tap συλλαμβάνει συντεταγμένες συσκευής (αν χορηγήθηκε), υπολογίζει απόσταση Haversine προς το venue, καταγράφει το event και αυτο-συνδέει με την προγραμματισμένη βάρδια της ημέρας αν το startTime είναι σε 30 λεπτά.
Αν ένας σερβιτόρος ξέχασε να χτυπήσει έξω, ανοίξτε Προσωπικό → Audit, βρείτε το event, κλικ Adjust. Το σύστημα δημιουργεί νέα γραμμή MANUAL_ADJUST που αναφέρεται στο πρωτότυπο (που διατηρείται). Reason code απαιτείται έτσι ο επόμενος αναθεωρητής καταλαβαίνει τι συνέβη.
Ανοίξτε Προσωπικό → Timesheets, διαλέξτε εύρος ημερομηνιών (default: τελευταίος μήνας), προεπισκόπηση grid, πατήστε CSV ή XLSX. Το αρχείο κατεβαίνει με την περίοδο στο όνομα και είναι έτοιμο για εισαγωγή στο payroll software.
Κάθε αλλαγή μισθού είναι νέα γραμμή. Η προηγούμενη ενεργή γραμμή λαμβάνει effectiveUntil στην ίδια $transaction. Η ανάγνωση του effective wage σε σημείο χρόνου είναι απλό WHERE effectiveFrom <= at AND (effectiveUntil IS NULL OR effectiveUntil > at).
Παραμετροποιήσιμο ανά venue: clockInRadiusMeters = 0 απενεργοποιεί τον έλεγχο. Αλλιώς, κάθε clock event συλλαμβάνει συντεταγμένες συσκευής, υπολογίζει great-circle απόσταση προς venue.lat/lng και αποθηκεύει geofenceOk = (distance <= radius). Ο έλεγχος δεν μπλοκάρει — σημαίνει.
Κάθε clock event είναι αμετάβλητο μετά την εγγραφή. Διορθώσεις διευθυντή δημιουργούν νέα MANUAL_ADJUST γραμμή που δείχνει το πρωτότυπο μέσω notes + adjustReason. Το πρωτότυπο διατηρείται verbatim — η άμυνα εργατικής διαφοράς είναι ενσωματωμένη.
Ο aggregator ενώνει χτυπημένα λεπτά ανά προσωπικό × τον μισθό σε ισχύ στο τέλος περιόδου. Οι εξαγωγές περιλαμβάνουν userId, username, ωριαία αμοιβή, ώρες δουλειάς και ακαθάριστη πληρωμή. CSV είναι παγκόσμιο; XLSX χρησιμοποιεί την ίδια xlsx βιβλιοθήκη.
Τέλος μήνα: ανοίξτε Προσωπικό → Timesheets, επιλέξτε τον προηγούμενο μήνα, πατήστε XLSX, δώστε το αρχείο στον λογιστή. Η προηγούμενη ροή Excel-from-paper-clock έπαιρνε 4 ώρες; αυτή παίρνει 30 δευτερόλεπτα.
Η Άννα έφυγε στις 23:00 αλλά ξέχασε να χτυπήσει έξω και το σύστημα αυτο-έκλεισε τη βάρδια στα μεσάνυχτα. Ανοίξτε το audit log, βρείτε το CLOCK_OUT-missing pattern, κλικ Adjust στο τελευταίο event, ορίστε σωστό χρόνο, προσθέστε reason 'ξέχασε να χτυπήσει — επιβεβαιωμένο από κάμερα ασφαλείας'. Νέα MANUAL_ADJUST γραμμή; το πρωτότυπο διατηρείται.
Ο Πέτρος μεταφέρεται από London Pub στο Camden venue. Παίρνει νέα γραμμή StaffWage στο νόμισμα Camden (GBP και για τα δύο, αλλά το data shape υποστηρίζει cross-currency μετακινήσεις). Το ιστορικό London Pub παραμένει ακέραιο — κάθε υπολογισμός gross-pay έναντι London ωρών χρησιμοποιεί τον London μισθό.
Ένας σερβιτόρος αμφισβητεί μισθοδοτική κατάσταση 6 μηνών πριν. Ανοίξτε Προσωπικό → Audit, φιλτράρετε ανά user + εύρος ημερομηνιών. Κάθε αλλαγή μισθού, κάθε clock event, κάθε διόρθωση διευθυντή είναι εκεί με όνομα actor, timestamp και reason code. Επανυπολογίστε ακαθάριστο από raw events σε 30 δευτερόλεπτα.
Ένα μέλος προσωπικού χτυπά κάρτα από σπίτι 'επειδή περίμενε παράδοση'. Η σήμανση geofenceOk = false εμφανίζεται στο audit log. Ρωτάτε, επιβεβαιώνουν, αποδέχεστε άπαξ και προχωράτε.
Μέλος προσωπικού που καλύπτει και server και κουζίνα έχει δύο γραμμές StaffWage (μία με role = SERVER, μία με role = KITCHEN). Ο wage resolver επιλέγει τη σωστή αμοιβή με βάση το role της βάρδιας τη στιγμή που χρεώθηκε το clock event.
Τα περισσότερα POS συστήματα εστιατορίων παρακολουθούν φιλοδωρήματα και πωλήσεις αλλά αντιμετωπίζουν τους μισθούς ως 'πρόβλημα κάποιου άλλου'. Η ενότητα Προσωπικό του Ordering.Tools κλείνει αυτό το χάσμα end-to-end: ωριαίες αμοιβές με effective dates, geofenced clock-in, append-only event ιστορικό, εξαγωγές CSV/XLSX. Το pipeline σχεδιάστηκε για τη στιγμή που ένας μισθός αμφισβητείται — μήνες αργότερα, με τον αρχικό διευθυντή μη διαθέσιμο — και η απάντηση πρέπει να είναι αναπαραγώγιμη από raw γραμμές.
Ένα μέλος προσωπικού αμφισβητεί μισθοδοτική κατάσταση. Ο διευθυντής που όρισε την αμοιβή του έφυγε από την εταιρεία. Χωρίς append-only ιστορικό, έχετε μια γραμμή που δείχνει την τρέχουσα αμοιβή και κανέναν τρόπο να αποδείξετε ποια ήταν η αμοιβή στην ημέρα της αμφισβητούμενης βάρδιας. Με append-only, έχετε ζευγάρια effectiveFrom / effectiveUntil που αναπαράγουν οποιαδήποτε προηγούμενη ημέρα σε ένα query.
Indoor GPS drift μέσα σε κτίρια από μπετόν σημαίνει ότι ένα μέλος προσωπικού μπορεί να στέκεται στο μπαρ και να δείχνει 200 μέτρα μακριά. Το μπλοκάρισμα στο geofence εγγυάται ψευδώς αρνητικά που καταλήγουν στον διευθυντή στη μέση του rush. Σήμανση αντί για μπλοκάρισμα συλλαμβάνει την αλήθεια χωρίς να επιβραδύνει τις λειτουργίες.
Multi-venue αλυσίδα που πληρώνει την ομάδα Λονδίνου σε GBP και την ομάδα Camden σε GBP δεν βλέπει τη διαφορά. Αλυσίδα με venue Σόφιας (BGN) και Λονδίνου (GBP) βλέπει — και το πιο καθαρό μοντέλο είναι μία γραμμή μισθού ανά (προσωπικό, venue) ζευγάρι, στο νόμισμα του venue.