feat: enable Fischerei, Sitzungsprotokolle, Verbandsverwaltung modules
Some checks failed
Workflow / ʦ TypeScript (push) Failing after 5m44s
Workflow / ⚫️ Test (push) Has been skipped

- Enable all 3 modules via NEXT_PUBLIC_ENABLE_* build args + runtime env
- Fix empty-string-to-null for date/optional columns in all module APIs:
  fischerei (24 fixes), verbandsverwaltung (15 fixes), sitzungsprotokolle (2 fixes)
- CACHE_BUST=12 for full rebuild with new feature flags
This commit is contained in:
Zaid Marzguioui
2026-04-01 13:23:57 +02:00
parent 8d8f4e94ee
commit 5294cfab61
5 changed files with 51 additions and 42 deletions

View File

@@ -5,7 +5,7 @@ WORKDIR /app
# --- Install + Build in one stage --- # --- Install + Build in one stage ---
FROM base AS builder FROM base AS builder
# CACHE_BUST: change this value to force a full rebuild (busts Docker layer cache) # CACHE_BUST: change this value to force a full rebuild (busts Docker layer cache)
ARG CACHE_BUST=11 ARG CACHE_BUST=12
RUN echo "Cache bust: ${CACHE_BUST}" RUN echo "Cache bust: ${CACHE_BUST}"
COPY . . COPY . .
RUN pnpm install --no-frozen-lockfile RUN pnpm install --no-frozen-lockfile
@@ -17,10 +17,16 @@ ARG NEXT_PUBLIC_SITE_URL=https://myeasycms.de
ARG NEXT_PUBLIC_SUPABASE_URL=http://localhost:8000 ARG NEXT_PUBLIC_SUPABASE_URL=http://localhost:8000
ARG NEXT_PUBLIC_SUPABASE_PUBLIC_KEY ARG NEXT_PUBLIC_SUPABASE_PUBLIC_KEY
ARG NEXT_PUBLIC_DEFAULT_LOCALE=de ARG NEXT_PUBLIC_DEFAULT_LOCALE=de
ARG NEXT_PUBLIC_ENABLE_FISCHEREI=true
ARG NEXT_PUBLIC_ENABLE_MEETING_PROTOCOLS=true
ARG NEXT_PUBLIC_ENABLE_VERBANDSVERWALTUNG=true
ENV NEXT_PUBLIC_SITE_URL=${NEXT_PUBLIC_SITE_URL} ENV NEXT_PUBLIC_SITE_URL=${NEXT_PUBLIC_SITE_URL}
ENV NEXT_PUBLIC_SUPABASE_URL=${NEXT_PUBLIC_SUPABASE_URL} ENV NEXT_PUBLIC_SUPABASE_URL=${NEXT_PUBLIC_SUPABASE_URL}
ENV NEXT_PUBLIC_SUPABASE_PUBLIC_KEY=${NEXT_PUBLIC_SUPABASE_PUBLIC_KEY} ENV NEXT_PUBLIC_SUPABASE_PUBLIC_KEY=${NEXT_PUBLIC_SUPABASE_PUBLIC_KEY}
ENV NEXT_PUBLIC_DEFAULT_LOCALE=${NEXT_PUBLIC_DEFAULT_LOCALE} ENV NEXT_PUBLIC_DEFAULT_LOCALE=${NEXT_PUBLIC_DEFAULT_LOCALE}
ENV NEXT_PUBLIC_ENABLE_FISCHEREI=${NEXT_PUBLIC_ENABLE_FISCHEREI}
ENV NEXT_PUBLIC_ENABLE_MEETING_PROTOCOLS=${NEXT_PUBLIC_ENABLE_MEETING_PROTOCOLS}
ENV NEXT_PUBLIC_ENABLE_VERBANDSVERWALTUNG=${NEXT_PUBLIC_ENABLE_VERBANDSVERWALTUNG}
RUN pnpm --filter web build RUN pnpm --filter web build
# --- Run --- # --- Run ---

View File

@@ -335,6 +335,9 @@ services:
NEXT_PUBLIC_ENABLE_TEAM_ACCOUNTS_BILLING: "false" NEXT_PUBLIC_ENABLE_TEAM_ACCOUNTS_BILLING: "false"
NEXT_PUBLIC_ENABLE_PERSONAL_ACCOUNT_BILLING: "false" NEXT_PUBLIC_ENABLE_PERSONAL_ACCOUNT_BILLING: "false"
NEXT_PUBLIC_ENABLE_NOTIFICATIONS: "true" NEXT_PUBLIC_ENABLE_NOTIFICATIONS: "true"
NEXT_PUBLIC_ENABLE_FISCHEREI: "true"
NEXT_PUBLIC_ENABLE_MEETING_PROTOCOLS: "true"
NEXT_PUBLIC_ENABLE_VERBANDSVERWALTUNG: "true"
volumes: volumes:
supabase-db-data: supabase-db-data:

View File

@@ -97,18 +97,18 @@ export function createFischereiApi(client: SupabaseClient<Database>) {
.insert({ .insert({
account_id: input.accountId, account_id: input.accountId,
name: input.name, name: input.name,
short_name: input.shortName, short_name: input.shortName || null,
water_type: input.waterType, water_type: input.waterType,
description: input.description, description: input.description || null,
surface_area_ha: input.surfaceAreaHa, surface_area_ha: input.surfaceAreaHa,
length_m: input.lengthM, length_m: input.lengthM,
width_m: input.widthM, width_m: input.widthM,
avg_depth_m: input.avgDepthM, avg_depth_m: input.avgDepthM,
max_depth_m: input.maxDepthM, max_depth_m: input.maxDepthM,
outflow: input.outflow, outflow: input.outflow || null,
location: input.location, location: input.location || null,
classification_order: input.classificationOrder, classification_order: input.classificationOrder,
county: input.county, county: input.county || null,
geo_lat: input.geoLat, geo_lat: input.geoLat,
geo_lng: input.geoLng, geo_lng: input.geoLng,
lfv_number: input.lfvNumber, lfv_number: input.lfvNumber,
@@ -290,17 +290,17 @@ export function createFischereiApi(client: SupabaseClient<Database>) {
.insert({ .insert({
account_id: input.accountId, account_id: input.accountId,
name: input.name, name: input.name,
name_latin: input.nameLatin, name_latin: input.nameLatin || null,
name_local: input.nameLocal, name_local: input.nameLocal || null,
is_active: input.isActive, is_active: input.isActive,
max_age_years: input.maxAgeYears, max_age_years: input.maxAgeYears,
max_weight_kg: input.maxWeightKg, max_weight_kg: input.maxWeightKg,
max_length_cm: input.maxLengthCm, max_length_cm: input.maxLengthCm,
protected_min_size_cm: input.protectedMinSizeCm, protected_min_size_cm: input.protectedMinSizeCm,
protection_period_start: input.protectionPeriodStart, protection_period_start: input.protectionPeriodStart || null,
protection_period_end: input.protectionPeriodEnd, protection_period_end: input.protectionPeriodEnd || null,
spawning_season_start: input.spawningSeasonStart, spawning_season_start: input.spawningSeasonStart || null,
spawning_season_end: input.spawningSeasonEnd, spawning_season_end: input.spawningSeasonEnd || null,
has_special_spawning_season: input.hasSpecialSpawningSeason, has_special_spawning_season: input.hasSpecialSpawningSeason,
k_factor_avg: input.kFactorAvg, k_factor_avg: input.kFactorAvg,
k_factor_min: input.kFactorMin, k_factor_min: input.kFactorMin,
@@ -401,8 +401,8 @@ export function createFischereiApi(client: SupabaseClient<Database>) {
water_id: input.waterId, water_id: input.waterId,
species_id: input.speciesId, species_id: input.speciesId,
min_size_cm: input.minSizeCm, min_size_cm: input.minSizeCm,
protection_period_start: input.protectionPeriodStart, protection_period_start: input.protectionPeriodStart || null,
protection_period_end: input.protectionPeriodEnd, protection_period_end: input.protectionPeriodEnd || null,
max_catch_per_day: input.maxCatchPerDay, max_catch_per_day: input.maxCatchPerDay,
max_catch_per_year: input.maxCatchPerYear, max_catch_per_year: input.maxCatchPerYear,
}, },
@@ -473,13 +473,13 @@ export function createFischereiApi(client: SupabaseClient<Database>) {
account_id: input.accountId, account_id: input.accountId,
water_id: input.waterId, water_id: input.waterId,
species_id: input.speciesId, species_id: input.speciesId,
stocking_date: input.stockingDate, stocking_date: input.stockingDate || null,
quantity: input.quantity, quantity: input.quantity,
weight_kg: input.weightKg, weight_kg: input.weightKg,
age_class: input.ageClass, age_class: input.ageClass,
cost_euros: input.costEuros, cost_euros: input.costEuros,
supplier_id: input.supplierId, supplier_id: input.supplierId,
remarks: input.remarks, remarks: input.remarks || null,
created_by: userId, created_by: userId,
updated_by: userId, updated_by: userId,
}) })
@@ -582,11 +582,11 @@ export function createFischereiApi(client: SupabaseClient<Database>) {
account_id: input.accountId, account_id: input.accountId,
water_id: input.waterId, water_id: input.waterId,
lessor_name: input.lessorName, lessor_name: input.lessorName,
lessor_address: input.lessorAddress, lessor_address: input.lessorAddress || null,
lessor_phone: input.lessorPhone, lessor_phone: input.lessorPhone || null,
lessor_email: input.lessorEmail, lessor_email: input.lessorEmail || null,
start_date: input.startDate, start_date: input.startDate || null,
end_date: input.endDate, end_date: input.endDate || null,
duration_years: input.durationYears, duration_years: input.durationYears,
initial_amount: input.initialAmount, initial_amount: input.initialAmount,
fixed_annual_increase: input.fixedAnnualIncrease, fixed_annual_increase: input.fixedAnnualIncrease,
@@ -721,14 +721,14 @@ export function createFischereiApi(client: SupabaseClient<Database>) {
member_id: input.memberId, member_id: input.memberId,
year: input.year, year: input.year,
member_name: input.memberName, member_name: input.memberName,
member_birth_date: input.memberBirthDate, member_birth_date: input.memberBirthDate || null,
fishing_days_count: input.fishingDaysCount, fishing_days_count: input.fishingDaysCount,
card_numbers: input.cardNumbers, card_numbers: input.cardNumbers,
is_fly_fisher: input.isFlyFisher, is_fly_fisher: input.isFlyFisher,
is_hejfish: input.isHejfish, is_hejfish: input.isHejfish,
is_empty: input.isEmpty, is_empty: input.isEmpty,
not_fished: input.notFished, not_fished: input.notFished,
remarks: input.remarks, remarks: input.remarks || null,
created_by: userId, created_by: userId,
updated_by: userId, updated_by: userId,
}) })
@@ -852,7 +852,7 @@ export function createFischereiApi(client: SupabaseClient<Database>) {
species_id: input.speciesId, species_id: input.speciesId,
water_id: input.waterId, water_id: input.waterId,
member_id: input.memberId, member_id: input.memberId,
catch_date: input.catchDate, catch_date: input.catchDate || null,
quantity: input.quantity, quantity: input.quantity,
length_cm: input.lengthCm, length_cm: input.lengthCm,
weight_g: input.weightG, weight_g: input.weightG,
@@ -864,7 +864,7 @@ export function createFischereiApi(client: SupabaseClient<Database>) {
competition_id: input.competitionId, competition_id: input.competitionId,
competition_participant_id: input.competitionParticipantId, competition_participant_id: input.competitionParticipantId,
permit_id: input.permitId, permit_id: input.permitId,
remarks: input.remarks, remarks: input.remarks || null,
}) })
.select() .select()
.single(); .single();

View File

@@ -79,9 +79,9 @@ export function createMeetingsApi(client: SupabaseClient<Database>) {
.insert({ .insert({
account_id: input.accountId, account_id: input.accountId,
title: input.title, title: input.title,
meeting_date: input.meetingDate, meeting_date: input.meetingDate || null,
meeting_type: input.meetingType, meeting_type: input.meetingType,
location: input.location, location: input.location || null,
attendees: input.attendees, attendees: input.attendees,
remarks: input.remarks, remarks: input.remarks,
is_published: input.isPublished, is_published: input.isPublished,

View File

@@ -83,19 +83,19 @@ export function createVerbandApi(client: SupabaseClient<Database>) {
.insert({ .insert({
account_id: input.accountId, account_id: input.accountId,
name: input.name, name: input.name,
short_name: input.shortName, short_name: input.shortName || null,
association_type_id: input.associationTypeId, association_type_id: input.associationTypeId,
member_count: input.memberCount, member_count: input.memberCount,
founded_year: input.foundedYear, founded_year: input.foundedYear,
street: input.street, street: input.street,
zip: input.zip, zip: input.zip,
city: input.city, city: input.city,
phone: input.phone, phone: input.phone || null,
email: input.email, email: input.email || null,
website: input.website, website: input.website || null,
iban: input.iban, iban: input.iban || null,
bic: input.bic, bic: input.bic || null,
account_holder: input.accountHolder, account_holder: input.accountHolder || null,
is_archived: input.isArchived, is_archived: input.isArchived,
created_by: userId, created_by: userId,
updated_by: userId, updated_by: userId,
@@ -206,8 +206,8 @@ export function createVerbandApi(client: SupabaseClient<Database>) {
first_name: input.firstName, first_name: input.firstName,
last_name: input.lastName, last_name: input.lastName,
role: input.role, role: input.role,
phone: input.phone, phone: input.phone || null,
email: input.email, email: input.email || null,
is_primary: input.isPrimary, is_primary: input.isPrimary,
}) })
.select() .select()
@@ -265,7 +265,7 @@ export function createVerbandApi(client: SupabaseClient<Database>) {
.insert({ .insert({
account_id: input.accountId, account_id: input.accountId,
name: input.name, name: input.name,
description: input.description, description: input.description || null,
sort_order: input.sortOrder, sort_order: input.sortOrder,
}) })
.select() .select()
@@ -319,7 +319,7 @@ export function createVerbandApi(client: SupabaseClient<Database>) {
.insert({ .insert({
account_id: input.accountId, account_id: input.accountId,
name: input.name, name: input.name,
description: input.description, description: input.description || null,
sort_order: input.sortOrder, sort_order: input.sortOrder,
}) })
.select() .select()
@@ -373,7 +373,7 @@ export function createVerbandApi(client: SupabaseClient<Database>) {
.insert({ .insert({
account_id: input.accountId, account_id: input.accountId,
name: input.name, name: input.name,
description: input.description, description: input.description || null,
default_amount: input.defaultAmount, default_amount: input.defaultAmount,
is_active: input.isActive, is_active: input.isActive,
}) })
@@ -462,8 +462,8 @@ export function createVerbandApi(client: SupabaseClient<Database>) {
fee_type_id: input.feeTypeId, fee_type_id: input.feeTypeId,
year: input.year, year: input.year,
amount: input.amount, amount: input.amount,
due_date: input.dueDate, due_date: input.dueDate || null,
paid_date: input.paidDate, paid_date: input.paidDate || null,
payment_method: input.paymentMethod, payment_method: input.paymentMethod,
status: input.status, status: input.status,
notes: input.notes, notes: input.notes,
@@ -527,7 +527,7 @@ export function createVerbandApi(client: SupabaseClient<Database>) {
title: input.title, title: input.title,
content: input.content, content: input.content,
note_type: input.noteType, note_type: input.noteType,
due_date: input.dueDate, due_date: input.dueDate || null,
is_completed: input.isCompleted, is_completed: input.isCompleted,
}) })
.select() .select()