implementace Ekonomiky
All checks were successful
test / smoke-test (push) Successful in 5s
deploy / deploy (push) Successful in 11s

This commit is contained in:
Dusan Vojacek
2026-04-05 20:10:43 +02:00
parent caf3f522e2
commit 5fcc47bce2
13 changed files with 1310 additions and 31 deletions

View File

@@ -16,9 +16,11 @@ SECURITY DEFINER
SET search_path = pg_catalog, public
AS $$
DECLARE
hid integer;
chunk_ids integer[];
n integer;
hid integer;
chunk_ids integer[];
n integer;
has_dropped boolean;
q text;
BEGIN
SELECT h.id
INTO hid
@@ -40,18 +42,39 @@ BEGIN
PERFORM _timescaledb_functions.remove_dropped_chunk_metadata(hid);
END IF;
SELECT coalesce(array_agg(c.id ORDER BY c.id), ARRAY[]::integer[])
INTO chunk_ids
FROM _timescaledb_catalog.chunk c
WHERE c.hypertable_id = hid
AND NOT c.dropped
AND NOT EXISTS (
SELECT 1
FROM pg_catalog.pg_class cl
JOIN pg_catalog.pg_namespace ns ON ns.oid = cl.relnamespace
WHERE ns.nspname = c.schema_name
AND cl.relname = c.table_name
);
-- Sloupec chunk.dropped byl v novějším TimescaleDB odstraněn (metadata dropnutých chunků se maže).
SELECT EXISTS (
SELECT 1
FROM pg_catalog.pg_attribute a
JOIN pg_catalog.pg_class r ON r.oid = a.attrelid
JOIN pg_catalog.pg_namespace n ON n.oid = r.relnamespace
WHERE n.nspname = '_timescaledb_catalog'
AND r.relname = 'chunk'
AND a.attname = 'dropped'
AND a.attnum > 0
AND NOT a.attisdropped
)
INTO has_dropped;
q := format(
$fmt$
SELECT coalesce(array_agg(c.id ORDER BY c.id), ARRAY[]::integer[])
FROM _timescaledb_catalog.chunk c
WHERE c.hypertable_id = %s
%s
AND NOT EXISTS (
SELECT 1
FROM pg_catalog.pg_class cl
JOIN pg_catalog.pg_namespace ns ON ns.oid = cl.relnamespace
WHERE ns.nspname = c.schema_name
AND cl.relname = c.table_name
)
$fmt$,
hid,
CASE WHEN has_dropped THEN 'AND NOT c.dropped' ELSE '' END
);
EXECUTE q INTO chunk_ids;
n := coalesce(array_length(chunk_ids, 1), 0);
IF n = 0 THEN

View File

@@ -0,0 +1,18 @@
-- =============================================================
-- V036 asset_pv_array.telemetry_source
-- Explicitní mapování FVE pole → sloupec v telemetry_inverter.
-- =============================================================
ALTER TABLE ems.asset_pv_array
ADD COLUMN IF NOT EXISTS telemetry_source TEXT;
COMMENT ON COLUMN ems.asset_pv_array.telemetry_source IS
'Který sloupec v telemetry_inverter odpovídá tomuto poli.
gen_port = gen_port_power_w (AC-coupled pole na GEN portu),
pv_strings = pv1_power_w + pv2_power_w (DC stringy na MPPT),
pv_total = pv_power_w (souhrnné, pokud pole nelze rozlišit).
NULL = pole nemá přímou telemetrii (fallback na forecast).';
-- Seed pro referenční site home-01:
UPDATE ems.asset_pv_array SET telemetry_source = 'pv_strings' WHERE code = 'pv-a';
UPDATE ems.asset_pv_array SET telemetry_source = 'gen_port' WHERE code = 'pv-b';

View File

@@ -0,0 +1,23 @@
-- =============================================================
-- V037 audit_day_lock
-- Zamknuté (finalizované) denní ekonomické výsledky.
-- =============================================================
CREATE TABLE ems.audit_day_lock (
site_id INT NOT NULL REFERENCES ems.site(id),
day_local DATE NOT NULL,
import_cost_czk NUMERIC(12,2) NOT NULL,
export_revenue_czk NUMERIC(12,2) NOT NULL,
net_cost_czk NUMERIC(12,2) NOT NULL,
green_bonus_czk NUMERIC(12,2) NOT NULL DEFAULT 0,
total_balance_czk NUMERIC(12,2) NOT NULL,
locked_at TIMESTAMPTZ NOT NULL DEFAULT now(),
locked_by TEXT NOT NULL DEFAULT 'user',
notes TEXT,
PRIMARY KEY (site_id, day_local)
);
COMMENT ON TABLE ems.audit_day_lock IS
'Zamknuté (finalizované) denní ekonomické výsledky.
Když řádek existuje, frontend zobrazí tyto hodnoty místo dynamických z vw_economics_daily.
Uživatel zamkne den, až má jistotu o cenách snapshot aktuálních dynamických hodnot.';