Enhancements
This commit is contained in:
@@ -95,7 +95,7 @@ SELECT
|
||||
msl.changed_by
|
||||
FROM member_state_log msl
|
||||
JOIN member_states ms ON msl.state_code = ms.state_code
|
||||
WHERE msl.member_id = 123 -- Replace with actual member_id
|
||||
WHERE msl.member_id = 27
|
||||
ORDER BY msl.changed_at DESC;
|
||||
|
||||
-- Count members by state
|
||||
@@ -109,7 +109,7 @@ ORDER BY ms.state_code;
|
||||
|
||||
-- Step 7: Example usage of the change_member_state function
|
||||
-- Change member 123 to inactive
|
||||
SELECT change_member_state(123, 'I', 1, 'Member requested temporary suspension');
|
||||
SELECT change_member_state(185, 'I', 1, 'Member requested temporary suspension');
|
||||
|
||||
-- Reactivate member 123
|
||||
SELECT change_member_state(123, 'A', 1, 'Member reactivation approved');
|
||||
@@ -252,4 +252,20 @@ GROUP BY ms.state_code, ms.state_name
|
||||
ORDER BY ms.state_code;
|
||||
|
||||
-- Step 9: After testing, remove the old column (CAREFUL!)
|
||||
-- ALTER TABLE members DROP COLUMN member_active;
|
||||
-- ALTER TABLE members DROP COLUMN member_active;
|
||||
|
||||
|
||||
-- 1) Add boolean column with default true
|
||||
ALTER TABLE sust.members
|
||||
ADD COLUMN member_primary boolean DEFAULT true;
|
||||
|
||||
-- Optional: ensure all existing rows are true before special handling
|
||||
UPDATE sust.members
|
||||
SET member_primary = true
|
||||
WHERE member_primary IS NULL;
|
||||
|
||||
-- 2) Migration: partner-address holders are not primary
|
||||
UPDATE sust.members
|
||||
SET member_primary = false
|
||||
WHERE member_email LIKE '%_partner%';
|
||||
|
||||
|
||||
@@ -0,0 +1,210 @@
|
||||
-- Erstellung der Tabelle für PostgreSQL
|
||||
CREATE TABLE streets (
|
||||
id serial4 PRIMARY KEY,
|
||||
street_name TEXT NOT NULL UNIQUE
|
||||
);
|
||||
|
||||
-- Einfügen der extrahierten Straßennamen (alphabetisch sortiert)
|
||||
INSERT INTO streets (street_name) VALUES
|
||||
('Asperlweg'),
|
||||
('Bachweg'),
|
||||
('Dorfstraße'),
|
||||
('Erlenstraße'),
|
||||
('Gartenweg'),
|
||||
('Lilienweg'),
|
||||
('Prambachkirchner Straße'),
|
||||
('Rosenweg'),
|
||||
('Schmiedstraße'),
|
||||
('Sonnenfeld'),
|
||||
('Wimmstraße');
|
||||
|
||||
ALTER TABLE members ADD COLUMN IF NOT EXISTS street_id INTEGER REFERENCES streets(id);
|
||||
|
||||
-- 1. Neue Spalte für die alte Hausnummer erstellen
|
||||
ALTER TABLE members ADD COLUMN members_old_streetnumber TEXT;
|
||||
|
||||
-- 2. Bestehende Hausnummern in die Backup-Spalte kopieren
|
||||
UPDATE members SET members_old_streetnumber = member_streetnumber;
|
||||
|
||||
CREATE TEMP TABLE address_mapping (
|
||||
old_address TEXT,
|
||||
new_street TEXT,
|
||||
new_number TEXT
|
||||
);
|
||||
|
||||
CREATE TABLE address_mapping (
|
||||
old_address TEXT,
|
||||
new_street TEXT,
|
||||
new_number TEXT,
|
||||
target_member_id INTEGER DEFAULT NULL -- NEU: Für gezielte Zuweisungen
|
||||
);
|
||||
|
||||
-- Daten-Import aus den PDF-Quellen [cite: 7, 8, 10, 11]
|
||||
INSERT INTO address_mapping (old_address, new_street, new_number) VALUES
|
||||
('Sankt Thomas 1', 'Gartenweg', '1'),
|
||||
('Sankt Thomas 2', 'Gartenweg', '2'),
|
||||
('Sankt Thomas 3', 'Dorfstraße', '7'),
|
||||
('Sankt Thomas 4', 'Bachweg', '5'),
|
||||
('Sankt Thomas 5', 'Bachweg', '2'),
|
||||
('Sankt Thomas 6', 'Bachweg', '9'),
|
||||
('Sankt Thomas 8', 'Bachweg', '13'),
|
||||
('Sankt Thomas 9', 'Bachweg', '10'),
|
||||
('Sankt Thomas 10', 'Schmiedstraße', '11'),
|
||||
('Sankt Thomas 11', 'Schmiedstraße', '24'),
|
||||
('Sankt Thomas 12', 'Wimmstraße', '1a'),
|
||||
('Sankt Thomas 13', 'Gartenweg', '3a'),
|
||||
('Sankt Thomas 14', 'Schmiedstraße', '2a'),
|
||||
('Sankt Thomas 15', 'Prambachkirchner Straße', '7'),
|
||||
('Sankt Thomas 16', 'Dorfstraße', '1'),
|
||||
('Sankt Thomas 17', 'Dorfstraße', '4'),
|
||||
('Sankt Thomas 18', 'Prambachkirchner Straße', '9'),
|
||||
('Sankt Thomas 19', 'Dorfstraße', '9'),
|
||||
('Sankt Thomas 20', 'Dorfstraße', '5'),
|
||||
('Sankt Thomas 21', 'Wimmstraße', '3'),
|
||||
('Sankt Thomas 22', 'Lilienweg', '2'),
|
||||
('Sankt Thomas 23', 'Prambachkirchner Straße', '6'),
|
||||
('Sankt Thomas 24', 'Schmiedstraße', '14'),
|
||||
('Sankt Thomas 26', 'Gartenweg', '5'),
|
||||
('Sankt Thomas 27', 'Schmiedstraße', '16'),
|
||||
('Sankt Thomas 28', 'Erlenstraße', '5'),
|
||||
('Sankt Thomas 29', 'Dorfstraße', '11'),
|
||||
('Sankt Thomas 30', 'Dorfstraße', '6'),
|
||||
('Sankt Thomas 31', 'Schmiedstraße', '18'),
|
||||
('Sankt Thomas 32', 'Gartenweg', '12'),
|
||||
('Sankt Thomas 33', 'Gartenweg', '14'),
|
||||
('Sankt Thomas 34', 'Prambachkirchner Straße', '3'),
|
||||
('Sankt Thomas 35', 'Bachweg', '1'),
|
||||
('Sankt Thomas 36', 'Erlenstraße', '7'),
|
||||
('Sankt Thomas 37', 'Erlenstraße', '10'),
|
||||
('Sankt Thomas 38', 'Prambachkirchner Straße', '10'),
|
||||
('Sankt Thomas 39', 'Wimmstraße', '2'),
|
||||
('Sankt Thomas 40', 'Wimmstraße', '9'),
|
||||
('Sankt Thomas 40a', 'Wimmstraße', '11'),
|
||||
('Sankt Thomas 41', 'Lilienweg', '14'),
|
||||
('Sankt Thomas 42', 'Lilienweg', '12'),
|
||||
('Sankt Thomas 43', 'Lilienweg', '10'),
|
||||
('Sankt Thomas 44', 'Lilienweg', '8'),
|
||||
('Sankt Thomas 45', 'Lilienweg', '6'),
|
||||
('Sankt Thomas 46', 'Lilienweg', '4'),
|
||||
('Sankt Thomas 47', 'Prambachkirchner Straße', '2'),
|
||||
('Sankt Thomas 48', 'Gartenweg', '7'),
|
||||
('Sankt Thomas 49', 'Gartenweg', '9'),
|
||||
('Sankt Thomas 50', 'Erlenstraße', '1'),
|
||||
('Sankt Thomas 51', 'Erlenstraße', '13'),
|
||||
('Sankt Thomas 52', 'Bachweg', '19'),
|
||||
('Sankt Thomas 53', 'Gartenweg', '21'),
|
||||
('Sankt Thomas 54', 'Wimmstraße', '7'),
|
||||
('Sankt Thomas 55', 'Erlenstraße', '12'),
|
||||
('Sankt Thomas 56', 'Gartenweg', '16'),
|
||||
('Sankt Thomas 57', 'Gartenweg', '18'),
|
||||
('Sankt Thomas 58', 'Gartenweg', '23'),
|
||||
('Sankt Thomas 60', 'Lilienweg', '5'),
|
||||
('Sankt Thomas 61', 'Lilienweg', '7'),
|
||||
('Sankt Thomas 62', 'Asperlweg', '1'),
|
||||
('Sankt Thomas 63', 'Asperlweg', '2'),
|
||||
('Sankt Thomas 64', 'Asperlweg', '4'),
|
||||
('Sankt Thomas 65', 'Asperlweg', '3'),
|
||||
('Sankt Thomas 66', 'Sonnenfeld', '3'),
|
||||
('Sankt Thomas 70', 'Wimmstraße', '4'),
|
||||
('Sankt Thomas 72a', 'Wimmstraße', '10a'),
|
||||
('Sankt Thomas 73a', 'Wimmstraße', '12a'),
|
||||
('Sankt Thomas 75', 'Lilienweg', '11'),
|
||||
('Sankt Thomas 76', 'Lilienweg', '13'),
|
||||
('Sankt Thomas 77', 'Lilienweg', '16'),
|
||||
('Sankt Thomas 78', 'Schmiedstraße', '34'),
|
||||
('Sankt Thomas 80', 'Schmiedstraße', '36'),
|
||||
('Sankt Thomas 81', 'Erlenstraße', '9'),
|
||||
('Sankt Thomas 82', 'Erlenstraße', '11'),
|
||||
('Sankt Thomas 83', 'Gartenweg', '11'),
|
||||
('Sankt Thomas 85', 'Lilienweg', '20'),
|
||||
('Sankt Thomas 86', 'Lilienweg', '15'),
|
||||
('Sankt Thomas 87', 'Lilienweg', '17'),
|
||||
('Sankt Thomas 88', 'Wimmstraße', '14'),
|
||||
('Sankt Thomas 89', 'Wimmstraße', '16'),
|
||||
('Sankt Thomas 91', 'Lilienweg', '34'),
|
||||
('Sankt Thomas 92', 'Lilienweg', '32'),
|
||||
('Sankt Thomas 94', 'Lilienweg', '22'),
|
||||
('Sankt Thomas 95', 'Lilienweg', '24'),
|
||||
('Sankt Thomas 96', 'Lilienweg', '28'),
|
||||
('Sankt Thomas 98', 'Erlenstraße', '15'),
|
||||
('Sankt Thomas 100', 'Dorfstraße', '14'),
|
||||
('Sankt Thomas 101', 'Dorfstraße', '16'),
|
||||
('Sankt Thomas 102', 'Dorfstraße', '20'),
|
||||
('Sankt Thomas 103', 'Rosenweg', '1'),
|
||||
('Sankt Thomas 104', 'Rosenweg', '2'),
|
||||
('Sankt Thomas 105', 'Rosenweg', '3'),
|
||||
('Sankt Thomas 106', 'Rosenweg', '4'),
|
||||
('Sankt Thomas 107', 'Rosenweg', '5'),
|
||||
('Sankt Thomas 109', 'Rosenweg', '7'),
|
||||
('Sankt Thomas 110', 'Rosenweg', '6'),
|
||||
('Sankt Thomas 111', 'Rosenweg', '9'),
|
||||
('Sankt Thomas 112', 'Rosenweg', '8'),
|
||||
('Sankt Thomas 113', 'Rosenweg', '11'),
|
||||
('Sankt Thomas 114', 'Rosenweg', '10'),
|
||||
('Sankt Thomas 115', 'Rosenweg', '13'),
|
||||
('Sankt Thomas 116', 'Rosenweg', '15'),
|
||||
('Sankt Thomas 117', 'Rosenweg', '17'),
|
||||
('Sankt Thomas 118', 'Sonnenfeld', '2'),
|
||||
('Sankt Thomas 119', 'Sonnenfeld', '12'),
|
||||
('Sankt Thomas 120', 'Sonnenfeld', '4'),
|
||||
('Sankt Thomas 121', 'Sonnenfeld', '10'),
|
||||
('Sankt Thomas 122', 'Sonnenfeld', '6'),
|
||||
('Sankt Thomas 123', 'Sonnenfeld', '8'),
|
||||
('Sankt Thomas 150', 'Erlenstraße', '6');
|
||||
|
||||
SELECT
|
||||
m.member_street AS "Alte Gemeinde",
|
||||
m.members_old_streetnumber AS "Alte Nummer (Backup)",
|
||||
(m.member_street || ' ' || m.members_old_streetnumber) AS "Suchschlüssel",
|
||||
s.street_name AS "Neue Straße",
|
||||
map.new_number AS "Geplante neue Nummer"
|
||||
FROM members m
|
||||
JOIN address_mapping map ON (m.member_street || ' ' || m.members_old_streetnumber) = map.old_address
|
||||
JOIN streets s ON s.street_name = map.new_street;
|
||||
|
||||
/*UPDATE members m
|
||||
SET
|
||||
street_id = s.id,
|
||||
member_streetnumber = map.new_number
|
||||
-- member_street = 'St. Thomas' -- Vereinheitlichung
|
||||
FROM address_mapping map
|
||||
JOIN streets s ON s.street_name = map.new_street
|
||||
WHERE (m.member_street || ' ' || m.members_old_streetnumber) = map.old_address;
|
||||
|
||||
UPDATE members m
|
||||
SET
|
||||
street_id = s.id,
|
||||
member_streetnumber = map.new_number,
|
||||
member_street = 'St. Thomas' -- Optional: Den Gemeindenamen vereinheitlichen
|
||||
FROM address_mapping map
|
||||
JOIN streets s ON s.street_name = map.new_street
|
||||
WHERE (m.member_street || ' ' || m.member_streetnumber) = map.old_address;*/
|
||||
|
||||
-- SCHRITT A: Spezifische Zuweisungen (ID-basiert)
|
||||
UPDATE members m
|
||||
SET
|
||||
street_id = s.id,
|
||||
member_streetnumber = map.new_number,
|
||||
member_street = map.new_street
|
||||
FROM address_mapping map
|
||||
JOIN streets s ON s.street_name = map.new_street
|
||||
WHERE (m.member_street || ' ' || m.members_old_streetnumber) = map.old_address;
|
||||
--AND m.id = map.target_member_id; -- Matcht nur, wenn die ID explizit hinterlegt wurde
|
||||
|
||||
-- SCHRITT B: Allgemeine Zuweisungen (nur für die, die noch keine street_id haben)
|
||||
-- Hier nehmen wir nur die Mappings, die KEINE target_member_id haben
|
||||
UPDATE members m
|
||||
SET
|
||||
street_id = s.id,
|
||||
member_streetnumber = map.new_number,
|
||||
member_street = 'Sankt Thomas'
|
||||
FROM address_mapping map
|
||||
JOIN streets s ON s.street_name = map.new_street
|
||||
WHERE (m.member_street || ' ' || m.members_old_streetnumber) = map.old_address
|
||||
AND m.street_id IS NULL -- Nur Mitglieder, die noch nicht durch Schritt A versorgt wurden
|
||||
AND map.target_member_id IS NULL; -- Nur allgemeine Mapping-Regeln nutzen
|
||||
|
||||
SELECT old_address, count(*)
|
||||
FROM address_mapping
|
||||
GROUP BY old_address
|
||||
HAVING count(*) > 1;
|
||||
@@ -0,0 +1,74 @@
|
||||
drop view sust.members_by_section;
|
||||
drop view sust.members_active;
|
||||
|
||||
CREATE VIEW sust.members_active
|
||||
AS SELECT id,
|
||||
member_surname,
|
||||
member_firstname,
|
||||
member_firstname_spouse,
|
||||
member_count,
|
||||
member_active,
|
||||
current_state_code,
|
||||
member_email
|
||||
FROM members m
|
||||
WHERE TRIM(BOTH FROM current_state_code) = 'A'::text AND member_count > 0 AND member_primary = true
|
||||
ORDER BY member_surname;
|
||||
|
||||
CREATE OR REPLACE VIEW sust.members_by_section
|
||||
AS SELECT m.id,
|
||||
m.member_surname,
|
||||
m.member_firstname,
|
||||
m.member_firstname_spouse,
|
||||
m.member_active,
|
||||
m.member_email,
|
||||
s.section_name
|
||||
FROM members_active m
|
||||
JOIN member_sections ms ON ms.member_id = m.id
|
||||
JOIN sections s ON s.id = ms.section_id;
|
||||
|
||||
SELECT sum(member_count) FROM members_active
|
||||
|
||||
drop view sust.members_paid_years;
|
||||
CREATE OR REPLACE VIEW sust.members_paid_years
|
||||
AS SELECT id,
|
||||
member_surname,
|
||||
member_firstname,
|
||||
member_suffix,
|
||||
member_firstname_spouse,
|
||||
CONCAT_WS(' ', member_street, member_streetnumber, member_city) as member_address,
|
||||
member_active,
|
||||
current_state_code,
|
||||
member_email,
|
||||
member_membership_start,
|
||||
CASE
|
||||
WHEN member_membership_start > '2023-12-31'::date THEN 'N'::text
|
||||
WHEN (EXISTS ( SELECT 1
|
||||
FROM payments p
|
||||
WHERE p.member_id = m.id AND EXTRACT(year FROM p.payment_year) = 2023::numeric)) THEN 'X'::text
|
||||
ELSE NULL::text
|
||||
END AS paid_2023,
|
||||
CASE
|
||||
WHEN member_membership_start > '2024-12-31'::date THEN 'N'::text
|
||||
WHEN (EXISTS ( SELECT 1
|
||||
FROM payments p
|
||||
WHERE p.member_id = m.id AND EXTRACT(year FROM p.payment_year) = 2024::numeric)) THEN 'X'::text
|
||||
ELSE NULL::text
|
||||
END AS paid_2024,
|
||||
CASE
|
||||
WHEN member_membership_start > '2025-12-31'::date THEN 'N'::text
|
||||
WHEN (EXISTS ( SELECT 1
|
||||
FROM payments p
|
||||
WHERE p.member_id = m.id AND EXTRACT(year FROM p.payment_year) = 2025::numeric)) THEN 'X'::text
|
||||
ELSE NULL::text
|
||||
END AS paid_2025,
|
||||
CASE
|
||||
WHEN member_membership_start > '2026-12-31'::date THEN 'N'::text
|
||||
WHEN (EXISTS ( SELECT 1
|
||||
FROM payments p
|
||||
WHERE p.member_id = m.id AND EXTRACT(year FROM p.payment_year) = 2026::numeric)) THEN 'X'::text
|
||||
ELSE NULL::text
|
||||
END AS paid_2026
|
||||
FROM members m
|
||||
WHERE TRIM(BOTH FROM current_state_code) = 'A'::text AND member_count > 0 AND member_primary = true
|
||||
ORDER BY member_surname;
|
||||
|
||||
Reference in New Issue
Block a user