Changes between Initial Version and Version 1 of P6BudgetReport


Ignore:
Timestamp:
05/13/26 20:56:33 (13 days ago)
Author:
193284
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • P6BudgetReport

    v1 v1  
     1= Budget vs Actual Expenditure Analysis =
     2
     3== Objective ==
     4
     5This report compares the planned wedding budget with the actual costs of booked services.
     6
     7It includes venue costs, photographer costs, and band costs. The report helps identify remaining budget, total spending, and budget variance.
     8
     9== SQL Query Implementation ==
     10
     11{{{
     12#!sql
     13SELECT
     14    w.wedding_id,
     15    u.first_name || ' ' || u.last_name AS organizer_name,
     16    w."date" AS wedding_date,
     17    w.budget AS budgeted_amount,
     18
     19    COALESCE(SUM(DISTINCT vb.price), 0) AS venue_cost,
     20
     21    COALESCE(SUM(
     22        EXTRACT(EPOCH FROM (pb.end_time - pb.start_time)) / 3600
     23        * p.price_per_hour
     24    ), 0) AS photographer_cost,
     25
     26    COALESCE(SUM(
     27        EXTRACT(EPOCH FROM (bb.end_time - bb.start_time)) / 3600
     28        * b.price_per_hour
     29    ), 0) AS band_cost,
     30
     31    COALESCE(SUM(DISTINCT vb.price), 0)
     32    + COALESCE(SUM(EXTRACT(EPOCH FROM (pb.end_time - pb.start_time)) / 3600 * p.price_per_hour), 0)
     33    + COALESCE(SUM(EXTRACT(EPOCH FROM (bb.end_time - bb.start_time)) / 3600 * b.price_per_hour), 0)
     34    AS total_actual_cost,
     35
     36    w.budget -
     37    (
     38        COALESCE(SUM(DISTINCT vb.price), 0)
     39        + COALESCE(SUM(EXTRACT(EPOCH FROM (pb.end_time - pb.start_time)) / 3600 * p.price_per_hour), 0)
     40        + COALESCE(SUM(EXTRACT(EPOCH FROM (bb.end_time - bb.start_time)) / 3600 * b.price_per_hour), 0)
     41    ) AS remaining_budget
     42
     43FROM wedding w
     44LEFT JOIN "user" u ON w.user_id = u.user_id
     45LEFT JOIN venue_booking vb ON w.wedding_id = vb.wedding_id
     46LEFT JOIN photographer_booking pb ON w.wedding_id = pb.wedding_id
     47LEFT JOIN photographer p ON pb.photographer_id = p.photographer_id
     48LEFT JOIN band_booking bb ON w.wedding_id = bb.wedding_id
     49LEFT JOIN band b ON bb.band_id = b.band_id
     50GROUP BY w.wedding_id, u.first_name, u.last_name, w."date", w.budget
     51ORDER BY w.wedding_id;
     52}}}
     53
     54== Query Complexity Analysis ==
     55
     56* Join count: 7 tables
     57* Aggregate functions: SUM, COALESCE, EXTRACT
     58* Temporal calculation: booking duration is converted from time interval to hours
     59* Grouping: results are grouped per wedding
     60
     61== Relational Algebra Expression ==
     62
     63{{{
     64π wedding_id, organizer_name, wedding_date, budget, venue_cost, photographer_cost, band_cost, total_actual_cost
     65(
     66  γ wedding_id;
     67    SUM(venue_booking.price),
     68    SUM((photographer_booking.end_time - photographer_booking.start_time) * photographer.price_per_hour),
     69    SUM((band_booking.end_time - band_booking.start_time) * band.price_per_hour)
     70  (
     71    Wedding ⟕ User ⟕ Venue_Booking ⟕ Photographer_Booking ⟕ Photographer ⟕ Band_Booking ⟕ Band
     72  )
     73)
     74}}}
     75
     76== Stored Procedure ==
     77
     78{{{
     79#!sql
     80CREATE OR REPLACE PROCEDURE budget_variance_report(
     81    IN p_wedding_id INT DEFAULT NULL
     82)
     83LANGUAGE plpgsql
     84AS $$
     85DECLARE
     86    v_record RECORD;
     87    v_venue_cost NUMERIC;
     88    v_photographer_cost NUMERIC;
     89    v_band_cost NUMERIC;
     90    v_total_cost NUMERIC;
     91BEGIN
     92    CREATE TEMP TABLE budget_variance_results (
     93        wedding_id INTEGER,
     94        organizer_name VARCHAR,
     95        wedding_date DATE,
     96        budgeted_amount NUMERIC,
     97        venue_cost NUMERIC,
     98        photographer_cost NUMERIC,
     99        band_cost NUMERIC,
     100        total_actual_cost NUMERIC,
     101        remaining_budget NUMERIC
     102    );
     103
     104    FOR v_record IN
     105        SELECT w.wedding_id, u.first_name, u.last_name, w."date", w.budget
     106        FROM wedding w
     107        LEFT JOIN "user" u ON w.user_id = u.user_id
     108        WHERE p_wedding_id IS NULL OR w.wedding_id = p_wedding_id
     109    LOOP
     110        SELECT COALESCE(SUM(price), 0)
     111        INTO v_venue_cost
     112        FROM venue_booking
     113        WHERE wedding_id = v_record.wedding_id;
     114
     115        SELECT COALESCE(SUM(EXTRACT(EPOCH FROM (pb.end_time - pb.start_time)) / 3600 * p.price_per_hour), 0)
     116        INTO v_photographer_cost
     117        FROM photographer_booking pb
     118        JOIN photographer p ON pb.photographer_id = p.photographer_id
     119        WHERE pb.wedding_id = v_record.wedding_id;
     120
     121        SELECT COALESCE(SUM(EXTRACT(EPOCH FROM (bb.end_time - bb.start_time)) / 3600 * b.price_per_hour), 0)
     122        INTO v_band_cost
     123        FROM band_booking bb
     124        JOIN band b ON bb.band_id = b.band_id
     125        WHERE bb.wedding_id = v_record.wedding_id;
     126
     127        v_total_cost := v_venue_cost + v_photographer_cost + v_band_cost;
     128
     129        INSERT INTO budget_variance_results
     130        VALUES (
     131            v_record.wedding_id,
     132            v_record.first_name || ' ' || v_record.last_name,
     133            v_record."date",
     134            v_record.budget,
     135            v_venue_cost,
     136            v_photographer_cost,
     137            v_band_cost,
     138            v_total_cost,
     139            v_record.budget - v_total_cost
     140        );
     141    END LOOP;
     142
     143    RAISE NOTICE 'Budget variance report generated.';
     144END;
     145$$;
     146}}}
     147
     148== Purpose ==
     149
     150This report supports financial planning by showing whether a wedding is within its planned budget or exceeding it.