Using document version to get latest quotes

This commit is contained in:
Finley Ghosh 2025-12-07 17:18:04 +11:00
parent b62d7fdb17
commit d8526f12b6
3 changed files with 92 additions and 15 deletions

View file

@ -63,7 +63,7 @@ type Querier interface {
GetEnquiriesByUser(ctx context.Context, arg GetEnquiriesByUserParams) ([]GetEnquiriesByUserRow, error) GetEnquiriesByUser(ctx context.Context, arg GetEnquiriesByUserParams) ([]GetEnquiriesByUserRow, error)
GetEnquiry(ctx context.Context, id int32) (GetEnquiryRow, error) GetEnquiry(ctx context.Context, id int32) (GetEnquiryRow, error)
GetExpiringSoonQuotes(ctx context.Context, dateADD interface{}) ([]GetExpiringSoonQuotesRow, 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) GetLineItem(ctx context.Context, id int32) (LineItem, error)
GetLineItemsByProduct(ctx context.Context, productID sql.NullInt32) ([]LineItem, error) GetLineItemsByProduct(ctx context.Context, productID sql.NullInt32) ([]LineItem, error)
GetLineItemsTable(ctx context.Context, documentID int32) ([]GetLineItemsTableRow, error) GetLineItemsTable(ctx context.Context, documentID int32) ([]GetLineItemsTableRow, error)

View file

@ -41,7 +41,15 @@ func (q *Queries) EnableQuoteReminders(ctx context.Context, id int32) (sql.Resul
} }
const getExpiringSoonQuotes = `-- name: GetExpiringSoonQuotes :many 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 SELECT
id, id,
quote_id, quote_id,
@ -64,7 +72,6 @@ latest_quote_reminder AS (
FROM ranked_reminders FROM ranked_reminders
WHERE rn = 1 WHERE rn = 1
) )
SELECT SELECT
d.id AS document_id, d.id AS document_id,
u.username, 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 users u ON u.id = d.user_id
JOIN enquiries e ON e.id = q.enquiry_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 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 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 SELECT
id, id,
quote_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 users u ON u.id = d.user_id
JOIN enquiries e ON e.id = q.enquiry_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 LEFT JOIN latest_quote_reminder lqr on d.id = lqr.quote_id
WHERE WHERE
q.valid_until >= CURRENT_DATE 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 q.valid_until <= DATE_ADD(CURRENT_DATE, INTERVAL ? DAY)
AND e.status_id = 5 AND e.status_id = 5
AND (q.reminders_disabled IS NULL OR q.reminders_disabled = FALSE) AND (q.reminders_disabled IS NULL OR q.reminders_disabled = FALSE)
ORDER BY q.valid_until ORDER BY q.valid_until
` `
type GetExpiringSoonQuotesOnDayParams struct {
DATEADD interface{} `json:"DATE_ADD"`
DATEADD_2 interface{} `json:"DATE_ADD_2"`
}
type GetExpiringSoonQuotesOnDayRow struct { type GetExpiringSoonQuotesOnDayRow struct {
DocumentID int32 `json:"document_id"` DocumentID int32 `json:"document_id"`
Username string `json:"username"` Username string `json:"username"`
@ -216,8 +239,8 @@ type GetExpiringSoonQuotesOnDayRow struct {
LatestReminderSentTime time.Time `json:"latest_reminder_sent_time"` LatestReminderSentTime time.Time `json:"latest_reminder_sent_time"`
} }
func (q *Queries) GetExpiringSoonQuotesOnDay(ctx context.Context, dateADD interface{}) ([]GetExpiringSoonQuotesOnDayRow, error) { func (q *Queries) GetExpiringSoonQuotesOnDay(ctx context.Context, arg GetExpiringSoonQuotesOnDayParams) ([]GetExpiringSoonQuotesOnDayRow, error) {
rows, err := q.db.QueryContext(ctx, getExpiringSoonQuotesOnDay, dateADD) rows, err := q.db.QueryContext(ctx, getExpiringSoonQuotesOnDay, arg.DATEADD, arg.DATEADD_2)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -312,7 +335,15 @@ func (q *Queries) GetQuoteRemindersDisabled(ctx context.Context, id int32) (GetQ
} }
const getRecentlyExpiredQuotes = `-- name: GetRecentlyExpiredQuotes :many 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 SELECT
id, id,
quote_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 users u ON u.id = d.user_id
JOIN enquiries e ON e.id = q.enquiry_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 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 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 SELECT
id, id,
quote_id, quote_id,
@ -458,6 +498,7 @@ JOIN documents d ON d.id = q.document_id
JOIN users u ON u.id = d.user_id JOIN users u ON u.id = d.user_id
JOIN enquiries e ON e.id = q.enquiry_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 LEFT JOIN latest_quote_reminder lqr on d.id = lqr.quote_id

View file

@ -1,5 +1,13 @@
-- name: GetExpiringSoonQuotes :many -- 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 SELECT
id, id,
quote_id, quote_id,
@ -22,7 +30,6 @@ latest_quote_reminder AS (
FROM ranked_reminders FROM ranked_reminders
WHERE rn = 1 WHERE rn = 1
) )
SELECT SELECT
d.id AS document_id, d.id AS document_id,
u.username, 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 users u ON u.id = d.user_id
JOIN enquiries e ON e.id = q.enquiry_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 LEFT JOIN latest_quote_reminder lqr on d.id = lqr.quote_id
@ -54,7 +62,15 @@ WHERE
ORDER BY q.valid_until; ORDER BY q.valid_until;
-- name: GetExpiringSoonQuotesOnDay :many -- 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 SELECT
id, id,
quote_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 users u ON u.id = d.user_id
JOIN enquiries e ON e.id = q.enquiry_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 LEFT JOIN latest_quote_reminder lqr on d.id = lqr.quote_id
WHERE WHERE
q.valid_until >= CURRENT_DATE 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 q.valid_until <= DATE_ADD(CURRENT_DATE, INTERVAL ? DAY)
AND e.status_id = 5 AND e.status_id = 5
AND (q.reminders_disabled IS NULL OR q.reminders_disabled = FALSE) AND (q.reminders_disabled IS NULL OR q.reminders_disabled = FALSE)
ORDER BY q.valid_until; ORDER BY q.valid_until;
-- name: GetRecentlyExpiredQuotes :many -- 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 SELECT
id, id,
quote_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 users u ON u.id = d.user_id
JOIN enquiries e ON e.id = q.enquiry_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 LEFT JOIN latest_quote_reminder lqr on d.id = lqr.quote_id
@ -162,7 +189,15 @@ WHERE
ORDER BY q.valid_until DESC; ORDER BY q.valid_until DESC;
-- name: GetRecentlyExpiredQuotesOnDay :many -- 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 SELECT
id, id,
quote_id, quote_id,
@ -204,6 +239,7 @@ JOIN documents d ON d.id = q.document_id
JOIN users u ON u.id = d.user_id JOIN users u ON u.id = d.user_id
JOIN enquiries e ON e.id = q.enquiry_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 LEFT JOIN latest_quote_reminder lqr on d.id = lqr.quote_id