Fix cash summary quantity bug; add Safe Count as own nav item

- Cash summary: derive total_quantity from total_amount/denomination_value
  so value_entered rows are counted (previously SUM(quantity) returned
  NULL for those rows)
- Safe Count: moved safe_cash out of Float Management tabs into its own
  /safe/* route with a dedicated sidebar entry (Vault icon)
- FloatManagement now only shows Petty Cash and Change Tin tabs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
jtricerolph 2026-07-01 21:36:19 +00:00
parent e6188fb337
commit 4ea5238e62
5 changed files with 25 additions and 7 deletions

View file

@ -5,6 +5,7 @@ import { DailyCashUp } from './pages/DailyCashUp'
import { History } from './pages/History'
import { MultiDayReport } from './pages/MultiDayReport'
import { FloatManagement } from './pages/FloatManagement'
import { SafeCount } from './pages/SafeCount'
import { CashSummary } from './pages/CashSummary'
import { SettingsPage } from './pages/Settings'
import type { User } from './types'
@ -18,6 +19,7 @@ function AppRoutes({ user }: { user: User }) {
<Route path="/history" element={<History />} />
<Route path="/report" element={<MultiDayReport />} />
<Route path="/floats/*" element={<FloatManagement />} />
<Route path="/safe/*" element={<SafeCount />} />
<Route path="/summary" element={<CashSummary />} />
<Route path="/settings" element={<SettingsPage user={user} />} />
<Route path="*" element={<Navigate to="/daily" replace />} />

View file

@ -1,6 +1,6 @@
import { NavLink, useNavigate } from 'react-router-dom'
import {
Banknote, ClipboardList, BarChart2, Wallet, FileText, Settings, LogOut,
Banknote, ClipboardList, BarChart2, Wallet, Vault, FileText, Settings, LogOut,
} from 'lucide-react'
import type { User } from '../types'
@ -14,6 +14,7 @@ const navItems = [
{ to: '/history', label: 'History', icon: ClipboardList },
{ to: '/report', label: 'Weekly Report', icon: BarChart2 },
{ to: '/floats', label: 'Float Management', icon: Wallet },
{ to: '/safe', label: 'Safe Count', icon: Vault },
{ to: '/summary', label: 'Cash Summary', icon: FileText },
{ to: '/settings',label: 'Settings', icon: Settings },
]

View file

@ -16,7 +16,7 @@ const TYPE_LABELS: Record<CountType, string> = {
// Denominations relevant for each type (change_tin uses bags, no £0.02/£0.01)
const CHANGE_TIN_DENOMS = GBP_DENOMINATIONS.filter(d => d.value >= 0.05)
function FloatCountForm({ type }: { type: CountType }) {
export function FloatCountForm({ type }: { type: CountType }) {
const navigate = useNavigate()
const [denomQtys, setDenomQtys] = useState<Record<number, number>>({})
const [receipts, setReceipts] = useState<Array<{ amount: string; description: string }>>([])
@ -173,7 +173,7 @@ function FloatCountForm({ type }: { type: CountType }) {
)
}
function FloatHistory({ type }: { type: CountType }) {
export function FloatHistory({ type }: { type: CountType }) {
const [rows, setRows] = useState<FloatCount[]>([])
const [total, setTotal] = useState(0)
const [offset, setOffset] = useState(0)
@ -279,9 +279,8 @@ function FloatHistory({ type }: { type: CountType }) {
export function FloatManagement() {
const tabs: Array<{ path: string; label: string; type: CountType }> = [
{ path: 'petty-cash', label: 'Petty Cash', type: 'petty_cash' },
{ path: 'change-tin', label: 'Change Tin', type: 'change_tin' },
{ path: 'safe-cash', label: 'Safe Cash', type: 'safe_cash' },
{ path: 'petty-cash', label: 'Petty Cash', type: 'petty_cash' },
{ path: 'change-tin', label: 'Change Tin', type: 'change_tin' },
]
return (

View file

@ -0,0 +1,14 @@
import { Routes, Route, Navigate } from 'react-router-dom'
import { FloatCountForm, FloatHistory } from './FloatManagement'
export function SafeCount() {
return (
<div style={{ padding: '1.5rem' }}>
<Routes>
<Route index element={<FloatCountForm type="safe_cash" />} />
<Route path="history" element={<FloatHistory type="safe_cash" />} />
<Route path="*" element={<Navigate to="" replace />} />
</Routes>
</div>
)
}