Reporting → Core Reports
Purpose
Day-to-day operational reports that surface the state of your inventory, the transaction history of any container, and the audit substrate (staff identification + audit-period reconciliation) you need before a biennial inventory or DEA inspection.
Regulatory basis: DEA record availability and retention, and transaction records. All five Core reports are derived from the same authoritative records that satisfy DEA record-keeping obligations.
When to use them
- Pre-audit prep: run the Container Transaction Report for any container you'll be reconciling. Hand the printout to the auditor.
- Daily inventory verification: run the Unopened Container Log to compare on-shelf inventory to the system. Mismatches surface immediately.
- Quarterly count rehearsal: run the Opened Container Log with a date filter to see what's been used since the last rehearsal.
- Staff-handler attestation: run the Staff Identification Log when a new prescriber joins or annually as part of SOP.
- Biennial inventory close-out: run the Audit-Period Reconciliation between two completed biennial inventory dates to surface unrecorded loss/gain.
Walkthrough — common pattern
All Core reports follow the same dialog flow:
- Open
/home/<your-clinic>/reports - Stay on the Core Reports tab (default)
- Click Generate Report on the report's card
- Pick a format (PDF or CSV)
- Fill any optional filters (date range, container, etc.)
- Click Generate Report
- The browser downloads the file
Specific reports add a step or two; those are noted below.

Unopened Container Log
A snapshot of every container in your inventory that has not yet been opened, grouped by substance and schedule. The report is point-in-time — there is no date range; it reflects what's on the shelf right now.
Use when: comparing physical inventory to system inventory; sanity-checking a freshly received order.
Columns (PDF + CSV):
- Substance name + schedule
- Container number / lot number
- Quantity (initial)
- Unit (mL / mg / tab / count)
- Received date
- Supplier name (if recorded)
Filters: none. The report includes every unopened container.
Format: PDF (default) or CSV.
Opened Container Log
Every container in opened status, with the running balance and the most recent transaction. Useful when you need to know what's actively being drawn from on the floor.
Use when: rehearsing a count; reconciling against a paper logbook; investigating a discrepancy.
Columns (PDF + CSV):
- Substance name + schedule
- Container number
- Initial quantity / current balance / amount used
- Last transaction (date + type + quantity + performer)
Filters: none. The report includes every opened container.
Format: PDF (default) or CSV.
Staff Identification Log
Everyone on your Clinic Staff Log who handles controlled substances, with their initials, role, employment dates, and DEA license number (if a prescriber). The report is the canonical answer to "who handles controlled substances at this clinic" for an inspector.
Use when: orienting a new auditor; performing an annual staff attestation; preparing a staff list for a state pharmacy permit renewal.
Columns (PDF + CSV):
- Display name
- Access role (owner / admin / manager / staff / viewer)
- Clinic position (e.g., prescribing veterinarian, technician, practice manager)
- DEA license number + expiration date (if applicable)
- Initials (for transaction signing)
- Employment Start / Employment End — first and last day at the clinic, so a reader knows the window in which this person's initials were valid on a controlled-substance record. A blank end date prints as an em-dash (
—) rather than an empty cell, meaning "still employed / no end recorded." - Active / pending / suspended status
Filters: none. The report lists every member of the Clinic Staff Log, including roster-only staff who never log in to the app — historical staff, staff hired but not yet invited, and vets who perform but don't enter data. (Previously it listed only app members, so login-less staff were silently omitted.) Each row carries a Staff ID.
Format: PDF (default) or CSV.
Container Transaction Report
The full transaction history of a single container, with running balances and corrections, from intake through disposal. This is the artifact most often requested in a DEA inspection.
Use when: an inspector asks "show me the records for container X"; investigating a discrepancy on a specific lot; preparing closure documentation when a container is fully dispensed.
Required filter: container number or container ID. You can paste the container number (e.g. BTL-001) into the dialog's container input.
Columns (PDF + CSV):
- Header: container metadata (lot, substance, supplier, expiration)
- Per-row: date/time, transaction type, performer, witness (if applicable), prescriber + patient + client (for dispensed/administered), quantity, balance after, notes, correction history
Format: PDF (default) or CSV.
Audit-Period Reconciliation
Every transaction between two completed biennial inventory dates. The report surfaces rows that should have been recorded between the two inventories, and is the substrate for the biennial-inventory reconciliation step.
Use when: closing out a biennial inventory; resolving a discrepancy between two inventory snapshots.
Required: two completed biennial inventories on file (one before, one after the period). The dialog will only run when both are present.
Filters: implicit — the date range is the gap between the two selected biennial inventories.
Columns (PDF + CSV):
- Per-substance + per-container breakdown
- Quantity at start of period, quantity transacted, quantity at end of period
- Variance (start − transacted − end), with per-row classification (within tolerance / requires investigation / loss)
Format: PDF (default) or CSV.
Edge cases
Empty data
If the underlying tables have no rows the report still generates — the file will simply have a header row and no data rows. CS Logbook does not block report generation on empty input.
Multi-page reports
For clinics with hundreds of containers, the PDF will span multiple pages. There is no row limit; the generator paginates as needed. CSVs are unbounded.
Containers in transit / pending receive
The Unopened Container Log includes containers in unopened status. Containers in pending_receive (intake recorded but waiting for invoice match-up) are excluded by design — they're not formally part of inventory yet.
Soft-deleted containers / transactions
Soft-deleted records (deleted_at IS NOT NULL) are excluded from every Core report. To audit the deletion history, generate the Correction Audit Trail report from the Compliance tab.
Common mistakes
- Confusing Container Transaction Report with Audit-Period Reconciliation. The first is per-container; the second is per-clinic-period. They use overlapping data but answer different questions.
- Running Audit-Period Reconciliation before completing the closing biennial inventory. The report needs both the start AND the end inventory to compute variance. Without the end inventory it will refuse to run.
- Using the wrong container number format. The Container Transaction Report's container input matches the literal stored value; if your clinic prefixes containers with a clinic code (e.g.
MAIN-BTL-001), use the full string.
Related
- Compliance Reports — federal-mandated reports (Substance Summary, License Summary, Biennial Inventory PDF, DEA Form 106, DEA Form 41)
- Data Exports — export your own records in standard formats
- Audits → Biennial inventory — the workflow that produces the inventory snapshots used by Audit-Period Reconciliation
- Inventory → Transactions — the workflow that produces the transaction history surfaced by Container Transaction Report
- Glossary § Container statuses