refactor: Move course dates from registracie to kurzy table

- Add datumOd and datumDo columns to kurzy table
- Remove datumOd, datumDo, pocetUcastnikov from registracie table
- Update schema, validators, and services accordingly
- Certificate generation now uses course dates
- Migration preserves existing data by copying most recent dates

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
richardtekula
2026-01-29 12:52:56 +01:00
parent 2fee1f39bc
commit 12acd68156
6 changed files with 49 additions and 36 deletions

View File

@@ -0,0 +1,21 @@
-- Migration: Move dates from registracie to kurzy table
-- Step 1: Add new columns to kurzy table
ALTER TABLE kurzy ADD COLUMN IF NOT EXISTS datum_od DATE;
ALTER TABLE kurzy ADD COLUMN IF NOT EXISTS datum_do DATE;
-- Step 2: Migrate existing data - copy most recent registration dates to each course
UPDATE kurzy k
SET datum_od = r.datum_od, datum_do = r.datum_do
FROM (
SELECT DISTINCT ON (kurz_id) kurz_id, datum_od, datum_do
FROM registracie
WHERE datum_od IS NOT NULL OR datum_do IS NOT NULL
ORDER BY kurz_id, created_at DESC
) r
WHERE k.id = r.kurz_id;
-- Step 3: Drop columns from registracie table
ALTER TABLE registracie DROP COLUMN IF EXISTS datum_od;
ALTER TABLE registracie DROP COLUMN IF EXISTS datum_do;
ALTER TABLE registracie DROP COLUMN IF EXISTS pocet_ucastnikov;

View File

@@ -441,6 +441,8 @@ export const kurzy = pgTable('kurzy', {
maxKapacita: integer('max_kapacita'),
aktivny: boolean('aktivny').default(true).notNull(),
farba: varchar('farba', { length: 20 }), // Color for visual distinction (e.g., 'primary', 'info', 'warning')
datumOd: date('datum_od', { mode: 'date' }),
datumDo: date('datum_do', { mode: 'date' }),
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
});
@@ -473,10 +475,7 @@ export const registracie = pgTable('registracie', {
id: serial('id').primaryKey(),
kurzId: integer('kurz_id').notNull().references(() => kurzy.id, { onDelete: 'cascade' }),
ucastnikId: integer('ucastnik_id').notNull().references(() => ucastnici.id, { onDelete: 'cascade' }),
datumOd: date('datum_od', { mode: 'date' }), // dátum začiatku pre túto registráciu
datumDo: date('datum_do', { mode: 'date' }), // dátum konca pre túto registráciu
formaKurzu: formaKurzuEnum('forma_kurzu').default('prezencne').notNull(),
pocetUcastnikov: integer('pocet_ucastnikov').default(1).notNull(),
fakturaCislo: varchar('faktura_cislo', { length: 100 }),
fakturaVystavena: boolean('faktura_vystavena').default(false).notNull(),
zaplatene: boolean('zaplatene').default(false).notNull(),