fix site id
All checks were successful
deploy / deploy (push) Successful in 1m14s
test / smoke-test (push) Successful in 2s

This commit is contained in:
Dusan Vojacek
2026-04-05 20:16:25 +02:00
parent 5fcc47bce2
commit 22b7fa7756

View File

@@ -10,11 +10,10 @@ import {
useEconomicsDaily, useEconomicsDaily,
useEconomicsIntervals, useEconomicsIntervals,
} from '../hooks/useEconomics' } from '../hooks/useEconomics'
import { useSiteStatus } from '../hooks/useSiteStatus'
import { pragueCalendarDay } from '../lib/pragueDate' import { pragueCalendarDay } from '../lib/pragueDate'
import type { DailyEconomics } from '../types/economics' import type { DailyEconomics } from '../types/economics'
const SITE_ID = 1
function currentMonth(): string { function currentMonth(): string {
const today = pragueCalendarDay() const today = pragueCalendarDay()
return today.slice(0, 7) return today.slice(0, 7)
@@ -204,11 +203,14 @@ function DailyRow({
} }
export default function Economics() { export default function Economics() {
const { site: siteRow, ready: siteReady, error: siteError } = useSiteStatus()
const siteId = siteRow?.site_id ?? null
const [month, setMonth] = useState(currentMonth) const [month, setMonth] = useState(currentMonth)
const [expandedDay, setExpandedDay] = useState<string | null>(null) const [expandedDay, setExpandedDay] = useState<string | null>(null)
const { days, hasGreenBonus, loading, error, reload } = useEconomicsDaily(SITE_ID, month) const { days, hasGreenBonus, loading, error, reload } = useEconomicsDaily(siteId, month)
const { points } = useEconomicsChart(SITE_ID, month) const { points } = useEconomicsChart(siteId, month)
const summary = useMemo(() => { const summary = useMemo(() => {
if (days.length === 0) return null if (days.length === 0) return null
@@ -222,12 +224,13 @@ export default function Economics() {
const handleLockToggle = useCallback( const handleLockToggle = useCallback(
async (row: DailyEconomics) => { async (row: DailyEconomics) => {
if (siteId == null) return
try { try {
if (row.is_locked) { if (row.is_locked) {
await unlockDay(SITE_ID, row.day) await unlockDay(siteId, row.day)
toast.success(`Den ${row.day} odemčen`) toast.success(`Den ${row.day} odemčen`)
} else { } else {
await lockDay(SITE_ID, row.day) await lockDay(siteId, row.day)
toast.success(`Den ${row.day} zamčen`) toast.success(`Den ${row.day} zamčen`)
} }
reload() reload()
@@ -235,11 +238,24 @@ export default function Economics() {
toast.error('Operace se nezdařila') toast.error('Operace se nezdařila')
} }
}, },
[reload], [reload, siteId],
) )
return ( return (
<main className="mx-auto max-w-7xl space-y-6 px-4 py-6 md:px-8"> <main className="mx-auto max-w-7xl space-y-6 px-4 py-6 md:px-8">
{siteReady && siteRow && (
<p className="text-xs text-slate-500">
Lokalita: <span className="text-slate-400">{siteRow.site_code}</span> (id {siteRow.site_id}) ekonomika vychází z{' '}
<code className="rounded bg-slate-800 px-1">audit_interval</code>, ne z raw telemetrie.
</p>
)}
{siteError && (
<div className="rounded-lg border border-amber-900/50 bg-amber-950/30 px-3 py-2 text-sm text-amber-200">
{siteError} API ekonomiky potřebuje stejnou lokalitu jako Přehled (PostgREST{' '}
<code className="rounded bg-slate-900 px-1">vw_site_status</code>).
</div>
)}
{/* Month selector */} {/* Month selector */}
<div className="flex items-center gap-4"> <div className="flex items-center gap-4">
<button <button
@@ -300,10 +316,30 @@ export default function Economics() {
{error} {error}
</div> </div>
)} )}
{loading ? ( {!siteReady ? (
<div className="py-12 text-center text-sm text-slate-500">Načítání lokality</div>
) : siteId == null ? (
<div className="py-12 px-4 text-center text-sm text-slate-500">
Není dostupná lokalita z přehledu. Zkontrolujte PostgREST a tabulku{' '}
<code className="rounded bg-slate-800 px-1">ems.vw_site_status</code>.
</div>
) : loading ? (
<div className="py-12 text-center text-sm text-slate-500">Načítání</div> <div className="py-12 text-center text-sm text-slate-500">Načítání</div>
) : days.length === 0 ? ( ) : days.length === 0 ? (
<div className="py-12 text-center text-sm text-slate-500">Žádná data pro tento měsíc</div> <div className="mx-auto max-w-lg py-10 px-4 text-center text-sm text-slate-400">
<p className="mb-2 font-medium text-slate-300">Žádná data pro tento měsíc</p>
<p className="mb-2">
Záložka čte jen to, co je v <code className="rounded bg-slate-800 px-1">ems.audit_interval</code> (15min agregace po
jobu audit filler). Telemetrie a ceny samy o sobě tabulku audit nenaplní.
</p>
<p className="mb-2">Zkuste jiný měsíc (šipky), pokud máte historii jinde než v aktuálním měsíci.</p>
<p>
Backfill na DB (psql):{' '}
<code className="mt-1 block break-all rounded bg-slate-900 p-2 text-left text-xs text-slate-300">
SELECT ems.fn_fill_audit_range(&lt;site_id&gt;, &apos;2024-01-01&apos;::timestamptz, now());
</code>
</p>
</div>
) : ( ) : (
<div className="overflow-x-auto"> <div className="overflow-x-auto">
<table className="w-full"> <table className="w-full">
@@ -328,7 +364,7 @@ export default function Economics() {
key={row.day} key={row.day}
row={row} row={row}
hasGreenBonus={hasGreenBonus} hasGreenBonus={hasGreenBonus}
siteId={SITE_ID} siteId={siteId}
expanded={expandedDay === row.day} expanded={expandedDay === row.day}
onToggle={() => setExpandedDay((prev) => (prev === row.day ? null : row.day))} onToggle={() => setExpandedDay((prev) => (prev === row.day ? null : row.day))}
onLockToggle={() => handleLockToggle(row)} onLockToggle={() => handleLockToggle(row)}