= Stored Functions and Procedures = == Description == This section contains reusable SQL functions and procedures used for calculations, validation, and reporting. == 1. calculate_wedding_total_cost() == === Description === Calculates the total cost of a wedding using venue, photographer, and band bookings. === SQL Code ===
CREATE OR REPLACE FUNCTION calculate_wedding_total_cost(p_wedding_id INTEGER)
RETURNS NUMERIC AS $$
DECLARE
    total_cost NUMERIC;
BEGIN
    SELECT
        COALESCE(SUM(vb.price), 0)
    INTO total_cost
    FROM wedding w
    LEFT JOIN venue_booking vb ON w.wedding_id = vb.wedding_id
    WHERE w.wedding_id = p_wedding_id;

    RETURN total_cost;
END;
$$ LANGUAGE plpgsql;
== 2. is_venue_available() == === Description === Checks whether a venue is available for a selected date and time interval. === SQL Code ===
CREATE OR REPLACE FUNCTION is_venue_available(
    p_venue_id INTEGER,
    p_date DATE,
    p_start TIME,
    p_end TIME
)
RETURNS BOOLEAN AS $$
BEGIN
    RETURN NOT EXISTS (
        SELECT 1
        FROM venue_booking
        WHERE venue_id = p_venue_id
          AND "date" = p_date
          AND (
                p_start < end_time
            AND p_end > start_time
          )
    );
END;
$$ LANGUAGE plpgsql;
== 3. is_photographer_available() == === Description === Checks whether a photographer is available for a selected date and time interval. === SQL Code ===
CREATE OR REPLACE FUNCTION is_photographer_available(
    p_photographer_id INTEGER,
    p_date DATE,
    p_start TIME,
    p_end TIME
)
RETURNS BOOLEAN AS $$
BEGIN
    RETURN NOT EXISTS (
        SELECT 1
        FROM photographer_booking
        WHERE photographer_id = p_photographer_id
          AND "date" = p_date
          AND (
                p_start < end_time
            AND p_end > start_time
          )
    );
END;
$$ LANGUAGE plpgsql;
== 4. generate_rsvp_summary() == === Description === Returns RSVP statistics for a selected event. === SQL Code ===
CREATE OR REPLACE PROCEDURE generate_rsvp_summary(p_event_id INTEGER)
LANGUAGE plpgsql
AS $$
BEGIN
    RAISE NOTICE 'Accepted: %',
    (
        SELECT COUNT(*)
        FROM event_rsvp
        WHERE event_id = p_event_id
          AND status = 'accepted'
    );
END;
$$;