From d8526f12b60482ac14b110c83a17b3e36f4dfca6 Mon Sep 17 00:00:00 2001 From: Finley Ghosh Date: Sun, 7 Dec 2025 17:18:04 +1100 Subject: [PATCH] Using document version to get latest quotes --- go/internal/cmc/db/querier.go | 2 +- go/internal/cmc/db/quotes.sql.go | 57 +++++++++++++++++++++++++++----- go/sql/queries/quotes.sql | 48 +++++++++++++++++++++++---- 3 files changed, 92 insertions(+), 15 deletions(-) diff --git a/go/internal/cmc/db/querier.go b/go/internal/cmc/db/querier.go index 0c143a4e..303d4418 100644 --- a/go/internal/cmc/db/querier.go +++ b/go/internal/cmc/db/querier.go @@ -63,7 +63,7 @@ type Querier interface { GetEnquiriesByUser(ctx context.Context, arg GetEnquiriesByUserParams) ([]GetEnquiriesByUserRow, error) GetEnquiry(ctx context.Context, id int32) (GetEnquiryRow, error) GetExpiringSoonQuotes(ctx context.Context, dateADD interface{}) ([]GetExpiringSoonQuotesRow, error) - GetExpiringSoonQuotesOnDay(ctx context.Context, dateADD interface{}) ([]GetExpiringSoonQuotesOnDayRow, error) + GetExpiringSoonQuotesOnDay(ctx context.Context, arg GetExpiringSoonQuotesOnDayParams) ([]GetExpiringSoonQuotesOnDayRow, error) GetLineItem(ctx context.Context, id int32) (LineItem, error) GetLineItemsByProduct(ctx context.Context, productID sql.NullInt32) ([]LineItem, error) GetLineItemsTable(ctx context.Context, documentID int32) ([]GetLineItemsTableRow, error) diff --git a/go/internal/cmc/db/quotes.sql.go b/go/internal/cmc/db/quotes.sql.go index fc5d9bb3..637ebeed 100644 --- a/go/internal/cmc/db/quotes.sql.go +++ b/go/internal/cmc/db/quotes.sql.go @@ -41,7 +41,15 @@ func (q *Queries) EnableQuoteReminders(ctx context.Context, id int32) (sql.Resul } const getExpiringSoonQuotes = `-- name: GetExpiringSoonQuotes :many -WITH ranked_reminders AS ( +WITH latest_revision AS ( + SELECT + q.enquiry_id, + MAX(d.revision) AS max_revision + FROM quotes q + JOIN documents d ON d.id = q.document_id + GROUP BY q.enquiry_id +), +ranked_reminders AS ( SELECT id, quote_id, @@ -64,7 +72,6 @@ latest_quote_reminder AS ( FROM ranked_reminders WHERE rn = 1 ) - SELECT d.id AS document_id, u.username, @@ -84,6 +91,7 @@ JOIN documents d ON d.id = q.document_id JOIN users u ON u.id = d.user_id JOIN enquiries e ON e.id = q.enquiry_id JOIN users uu ON uu.id = e.contact_user_id +JOIN latest_revision lr ON q.enquiry_id = lr.enquiry_id AND d.revision = lr.max_revision LEFT JOIN latest_quote_reminder lqr on d.id = lqr.quote_id @@ -148,7 +156,15 @@ func (q *Queries) GetExpiringSoonQuotes(ctx context.Context, dateADD interface{} } const getExpiringSoonQuotesOnDay = `-- name: GetExpiringSoonQuotesOnDay :many -WITH ranked_reminders AS ( +WITH latest_revision AS ( + SELECT + q.enquiry_id, + MAX(d.revision) AS max_revision + FROM quotes q + JOIN documents d ON d.id = q.document_id + GROUP BY q.enquiry_id +), +ranked_reminders AS ( SELECT id, quote_id, @@ -190,18 +206,25 @@ JOIN documents d ON d.id = q.document_id JOIN users u ON u.id = d.user_id JOIN enquiries e ON e.id = q.enquiry_id JOIN users uu ON uu.id = e.contact_user_id +JOIN latest_revision lr ON q.enquiry_id = lr.enquiry_id AND d.revision = lr.max_revision LEFT JOIN latest_quote_reminder lqr on d.id = lqr.quote_id WHERE q.valid_until >= CURRENT_DATE AND q.valid_until = DATE_ADD(CURRENT_DATE, INTERVAL ? DAY) + AND q.valid_until <= DATE_ADD(CURRENT_DATE, INTERVAL ? DAY) AND e.status_id = 5 AND (q.reminders_disabled IS NULL OR q.reminders_disabled = FALSE) ORDER BY q.valid_until ` +type GetExpiringSoonQuotesOnDayParams struct { + DATEADD interface{} `json:"DATE_ADD"` + DATEADD_2 interface{} `json:"DATE_ADD_2"` +} + type GetExpiringSoonQuotesOnDayRow struct { DocumentID int32 `json:"document_id"` Username string `json:"username"` @@ -216,8 +239,8 @@ type GetExpiringSoonQuotesOnDayRow struct { LatestReminderSentTime time.Time `json:"latest_reminder_sent_time"` } -func (q *Queries) GetExpiringSoonQuotesOnDay(ctx context.Context, dateADD interface{}) ([]GetExpiringSoonQuotesOnDayRow, error) { - rows, err := q.db.QueryContext(ctx, getExpiringSoonQuotesOnDay, dateADD) +func (q *Queries) GetExpiringSoonQuotesOnDay(ctx context.Context, arg GetExpiringSoonQuotesOnDayParams) ([]GetExpiringSoonQuotesOnDayRow, error) { + rows, err := q.db.QueryContext(ctx, getExpiringSoonQuotesOnDay, arg.DATEADD, arg.DATEADD_2) if err != nil { return nil, err } @@ -312,7 +335,15 @@ func (q *Queries) GetQuoteRemindersDisabled(ctx context.Context, id int32) (GetQ } const getRecentlyExpiredQuotes = `-- name: GetRecentlyExpiredQuotes :many -WITH ranked_reminders AS ( +WITH latest_revision AS ( + SELECT + q.enquiry_id, + MAX(d.revision) AS max_revision + FROM quotes q + JOIN documents d ON d.id = q.document_id + GROUP BY q.enquiry_id +), +ranked_reminders AS ( SELECT id, quote_id, @@ -354,6 +385,7 @@ JOIN documents d ON d.id = q.document_id JOIN users u ON u.id = d.user_id JOIN enquiries e ON e.id = q.enquiry_id JOIN users uu ON uu.id = e.contact_user_id +JOIN latest_revision lr ON q.enquiry_id = lr.enquiry_id AND d.revision = lr.max_revision LEFT JOIN latest_quote_reminder lqr on d.id = lqr.quote_id @@ -416,7 +448,15 @@ func (q *Queries) GetRecentlyExpiredQuotes(ctx context.Context, dateSUB interfac } const getRecentlyExpiredQuotesOnDay = `-- name: GetRecentlyExpiredQuotesOnDay :many -WITH ranked_reminders AS ( +WITH latest_revision AS ( + SELECT + q.enquiry_id, + MAX(d.revision) AS max_revision + FROM quotes q + JOIN documents d ON d.id = q.document_id + GROUP BY q.enquiry_id +), +ranked_reminders AS ( SELECT id, quote_id, @@ -457,7 +497,8 @@ FROM quotes q JOIN documents d ON d.id = q.document_id JOIN users u ON u.id = d.user_id JOIN enquiries e ON e.id = q.enquiry_id -JOIN users uu ON uu.id = e.contact_user_id +JOIN users uu ON uu.id = e.contact_user_id +JOIN latest_revision lr ON q.enquiry_id = lr.enquiry_id AND d.revision = lr.max_revision LEFT JOIN latest_quote_reminder lqr on d.id = lqr.quote_id diff --git a/go/sql/queries/quotes.sql b/go/sql/queries/quotes.sql index 1a848366..c5aac335 100644 --- a/go/sql/queries/quotes.sql +++ b/go/sql/queries/quotes.sql @@ -1,5 +1,13 @@ -- name: GetExpiringSoonQuotes :many -WITH ranked_reminders AS ( +WITH latest_revision AS ( + SELECT + q.enquiry_id, + MAX(d.revision) AS max_revision + FROM quotes q + JOIN documents d ON d.id = q.document_id + GROUP BY q.enquiry_id +), +ranked_reminders AS ( SELECT id, quote_id, @@ -22,7 +30,6 @@ latest_quote_reminder AS ( FROM ranked_reminders WHERE rn = 1 ) - SELECT d.id AS document_id, u.username, @@ -42,6 +49,7 @@ JOIN documents d ON d.id = q.document_id JOIN users u ON u.id = d.user_id JOIN enquiries e ON e.id = q.enquiry_id JOIN users uu ON uu.id = e.contact_user_id +JOIN latest_revision lr ON q.enquiry_id = lr.enquiry_id AND d.revision = lr.max_revision LEFT JOIN latest_quote_reminder lqr on d.id = lqr.quote_id @@ -54,7 +62,15 @@ WHERE ORDER BY q.valid_until; -- name: GetExpiringSoonQuotesOnDay :many -WITH ranked_reminders AS ( +WITH latest_revision AS ( + SELECT + q.enquiry_id, + MAX(d.revision) AS max_revision + FROM quotes q + JOIN documents d ON d.id = q.document_id + GROUP BY q.enquiry_id +), +ranked_reminders AS ( SELECT id, quote_id, @@ -96,19 +112,29 @@ JOIN documents d ON d.id = q.document_id JOIN users u ON u.id = d.user_id JOIN enquiries e ON e.id = q.enquiry_id JOIN users uu ON uu.id = e.contact_user_id +JOIN latest_revision lr ON q.enquiry_id = lr.enquiry_id AND d.revision = lr.max_revision LEFT JOIN latest_quote_reminder lqr on d.id = lqr.quote_id WHERE q.valid_until >= CURRENT_DATE AND q.valid_until = DATE_ADD(CURRENT_DATE, INTERVAL ? DAY) + AND q.valid_until <= DATE_ADD(CURRENT_DATE, INTERVAL ? DAY) AND e.status_id = 5 AND (q.reminders_disabled IS NULL OR q.reminders_disabled = FALSE) ORDER BY q.valid_until; -- name: GetRecentlyExpiredQuotes :many -WITH ranked_reminders AS ( +WITH latest_revision AS ( + SELECT + q.enquiry_id, + MAX(d.revision) AS max_revision + FROM quotes q + JOIN documents d ON d.id = q.document_id + GROUP BY q.enquiry_id +), +ranked_reminders AS ( SELECT id, quote_id, @@ -150,6 +176,7 @@ JOIN documents d ON d.id = q.document_id JOIN users u ON u.id = d.user_id JOIN enquiries e ON e.id = q.enquiry_id JOIN users uu ON uu.id = e.contact_user_id +JOIN latest_revision lr ON q.enquiry_id = lr.enquiry_id AND d.revision = lr.max_revision LEFT JOIN latest_quote_reminder lqr on d.id = lqr.quote_id @@ -162,7 +189,15 @@ WHERE ORDER BY q.valid_until DESC; -- name: GetRecentlyExpiredQuotesOnDay :many -WITH ranked_reminders AS ( +WITH latest_revision AS ( + SELECT + q.enquiry_id, + MAX(d.revision) AS max_revision + FROM quotes q + JOIN documents d ON d.id = q.document_id + GROUP BY q.enquiry_id +), +ranked_reminders AS ( SELECT id, quote_id, @@ -203,7 +238,8 @@ FROM quotes q JOIN documents d ON d.id = q.document_id JOIN users u ON u.id = d.user_id JOIN enquiries e ON e.id = q.enquiry_id -JOIN users uu ON uu.id = e.contact_user_id +JOIN users uu ON uu.id = e.contact_user_id +JOIN latest_revision lr ON q.enquiry_id = lr.enquiry_id AND d.revision = lr.max_revision LEFT JOIN latest_quote_reminder lqr on d.id = lqr.quote_id