Skip to main content
A cashier shift is a timed working session that groups all payment transactions processed by a cashier between a start time and an end time. Shifts give merchants a clear audit trail of cashier activity and make it straightforward to reconcile takings at the end of each session. Shift data is stored in the shifts table with three core fields:
FieldDescription
cashier_idThe user ID of the cashier who owns the shift
start_timeTimestamp when the shift was opened
end_timeTimestamp when the shift was closed (null while open)

Shift workflow

1

Log in as a cashier

Navigate to /cashier_login and sign in with your cashier credentials (email and password). Cashier accounts are created by a merchant or admin and linked to a specific merchant via merchant_id.After login, you land on the cashier dashboard where you can see your QR code and your shift controls.
2

Start a shift

Click Start Shift on your dashboard. The system creates a new shift record:
Shift::create([
    'cashier_id' => Auth::id(),
    'start_time' => now(),
]);
The end_time is left null until you end the shift. You can only have one open shift at a time. A success message confirms the shift has started.
If you try to start a shift while another is already open, the existing shift remains active. Make sure to end your previous shift before starting a new one.
3

Process transactions

While a shift is active, all Payment_Received transactions recorded against your cashier ID are automatically associated with the open shift based on timestamp.Customers can pay by scanning your cashier QR code or by using a merchant payment link. Each successful payment increments the transaction count shown on your shift history page.Transactions are matched to the shift using:
Transaction::where('cashier_id', Auth::id())
    ->where('transaction_type_id', Payment_Received)
    ->whereBetween('created_at', [$shift->start_time, $shift->end_time ?? now()]);
4

End a shift

Click End Shift when your working session is complete. The system finds your most recent open shift and records the current time:
$shift = Shift::where('cashier_id', Auth::id())
              ->whereNull('end_time')
              ->latest()
              ->first();

$shift->update(['end_time' => now()]);
Once end_time is set, the shift is closed. Transactions can no longer be added to it. A success message confirms the shift has ended.
If no open shift is found when you click End Shift, you will see a “No open shift found” notice. This can happen if you already ended the shift from another session.
5

Review the shift summary

After ending a shift, navigate to Shifts (/shifts) to see your shift history. The list shows:
  • Start and end time for each shift
  • Total number of Payment_Received transactions processed during the shift
You can filter the list by date range using the From and To date pickers.Click on a shift row to open the Shift Transactions view, which lists every individual transaction processed during that session. You can further filter transactions by type, wallet, status, and date.

Exporting shift data

Doss provides two export formats for both the shifts list and individual shift transaction reports.

Shifts list

FormatAction
XLSX (Excel)Click Export CSV on the shifts list page. Downloads a file named shifts_report_{timestamp}.xlsx.
PDFClick Export PDF on the shifts list page. Generates a PDF summary of all shifts in the current filter range.

Shift transactions

From inside a shift’s transaction detail view:
FormatAction
XLSX (Excel)Click Export CSV to download shift_transaction_report_{timestamp}.xlsx containing all transactions for that shift.
PDFClick Export PDF to generate a PDF report of the transactions for that shift.
Exports include the date range filter if one is applied. The PDF header shows the date range or “N/A” if no filter is active.

Manager oversight

Managers can view shift records and transaction reports for any cashier under the same merchant. This is done through the admin-side shift view, which accepts a cashier_id parameter:
// Manager/admin shift query for a specific cashier
(new Shift())->getShiftsListCashier($from, $to, $cashier_id);
From the admin panel, an admin or manager can:
  • View the complete shift history for a specific cashier
  • Open the transaction detail for any shift
  • Export shift transaction reports (XLSX and PDF) on behalf of any cashier using the admin export routes
The manager dashboard provides a high-level overview of all cashier activity under the merchant. Managers do not need to log in as cashiers to access their shift data.

Shift states at a glance

Stateend_time valueTransactions accepted
OpennullYes
ClosedTimestampNo

Build docs developers (and LLMs) love